일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- C++
- 시스템
- 시스템 프로그래밍
- Leviathan
- pwn.college
- Pwnable.kr
- write up
- radare2
- 워게임
- wargame
- 드론
- 리눅스커널
- C언어
- pwncollege
- 어셈블리어
- kernel
- 리눅스 커널
- 컴퓨터구조
- 시그널
- 취약점
- 시스템해킹
- 시스템프로그래밍
- Bandit
- 알고리즘
- css
- 리버싱
- 리눅스
- px4
- 커널
- 프로그래밍
- Today
- Total
Computer Security
#23 Arbitrary Write 1 본문
Arbitrary Write
Arbitrarty Write 취약점은 말 그대로 공격자가 원하는 위치에 원하는 값을 쓸 수 있는 여러 조건을 가진 취약점이다.
이전에 배웠던 대부분의 취약점들이 특정 영역이나 rip만 변조할 수 있는것과 달리, 이 취약점은 쓰기 권한이 있는 모든 메모리 영역에 원하는 데이터를 쓸 수 있는 차이점이 있다.
해당 취약점은 다양한 방식으로 발생할 수 있으며, 가장 기본적인 방식과 트리키한 방식을 하나씩 알아보자.
우리는 아래의 파일들로 실습 할 것이다.
start.sh : qemu script
aaw_1.c : arbitrary_write 취약점이 터지는 디바이스 드라이버 예제
exp.c : 취약점을 이용해 권한 상승을 일으키는 exploit code
1. cat start.sh 를 이용해 적용된 보호기법을 살펴보자.
KASLR : 적용 X
SMEP : 적용 O
SMAP : 적용 X
KPTI : 적용 X
2. arbitrary_write 취약점이 터지는 디바이스 드라이버 예제인 aaw_1.c를 살펴보자.
3. aaw_1.c 에서 aaw_init() 부분을 살펴보자.
먼저, 드라이버가 등록될 때 호출되는 aaw_init()함수를 살펴보면, victim 전역 함수 포인터에 print_noob()함수의 주소를 저장하는 것을 알 수 있다.
print_noob()함수 : 별다른 작업을 하지 않는 함수이다.
4. aaw_1.c 에서 aaw_ioctl() 부분을 살펴보자.
1. AAW case 에서는, 임의의 주소에 원하는 값을 쓸 수 있는 기능이 있다.
2. LEAK case 에서는, victim 전역 함수 포인터의 주소를 leak 할 수 있는 기능이 있다.
3. EXEC case 에서는, victim 전역 함수 포인터를 실행하는 기능이 있다. 일반적인 상황에서는 aaw_init() 함수
print_noob() 함수의 주소를 저장했기 때문에 해당 기능을 실행할 경우 print_noob()함수가 실행된다.
5. exp.c 코드를 살펴보자.
Step 1
- victim 전역 함수 포인터의 주소를 leak 해오는 것을 알 수 있다.
- 이후 kernel stack pivoting 기법을 사용하기 위해 set_fake_stack()함수를 호출해 fake stack을 구성한다.
Step 2
- leak한 victim 포인터를 xchg가젯의 주소로 덮는 것을 볼 수 있다.
Step 3
- xchg 가젯으로 덮힌 victim 전역 함수 포인터를 실행하는 것을 볼 수 있다.
6. ./start.sh 를 실행해보자.
start.sh를 실행한 후, exp를 실행한 결과이다.
user권한에서 root권한을 획득 한 것을 볼 수 있다.
'리눅스 커널 해킹' 카테고리의 다른 글
#25 Double Fetch (0) | 2022.09.02 |
---|---|
#24 Arbitrary Write 2 (0) | 2022.09.01 |
#22 Kernel Heap Overflow (0) | 2022.08.30 |
#21 kernel UAF 2 (0) | 2022.08.29 |
#20 Kernel UAF 1 (0) | 2022.08.28 |