요즘은 16.04를 안쓰지만 공부를 하는 입장에서 16.04에서 썼던 잡 테크닉들을 정리 해보려고 한다.
(힙이나 스택관련 기법이 아님)
16.04는 오래되서 잘 쓰이지 않지만 시스템 해킹을 입문할 때 많이 사용하고 아직도 많은 CTF 사이트에서 사용하고 있는 운영체제이다.
다른 버전들과 비교했을 때 크게 다른점은 tcache가 없다는 점이다. 또한 vtable 검사도 없다.
주로 이용하는 가젯들은 다음과 같다.
1. 원가젯
너무나도 당연하지만 그냥 넣었다.
2. setcontext+53
rdi만 컨트롤 가능하면 rsp 컨트롤이 가능해 ROP를 할 수 있는 유용한 가젯이다. 문제에서 활용은 __free_hook에 가젯을 넣거나 fake vtable에 이녀석들을 채워서 컨트롤 했던 것 같다. __free_hook에 넣으면 rdi가 힙의 주소이기 때문에 매우 쉽게 컨트롤 할 수 있다.
3. __call_tls_dtors
이녀석은 잘 쓰이지는 않는데, cs세그먼트쪽이랑 fs 세그먼트 쪽 조작이 가능할때 스택피벗을 할 수 있게 해준다.
인자들을 잘 구성해서 system("/bin/sh")을 실행하거나, rbp를 변조하고 call rax에서 leave ret을 호출하면 ROP가 가능 하다.
4. exit() -> call free
- exit 함수에서 free를 호출해서 __free_hook에 있는 데이터를 호출 하는 방법이다. 이것도 두가지로 나뉜다.
exit 함수는 시작할 때 바로 __call_tls_dtors를 호출하는데 보통은 여기서 rbx가 0이기 때문에 밑의 과정들을 실행하지 않는다. 그러나 인자들을 잘 구성해서 밑의 과정이 실행되면 j_free에서 free가 호출된다.
- 다음은 밑에 있는 free를 실행시키는 방법이다.
initial 을 0이 아닌 값으로 세팅하고, initial+8을 "/bin/sh"로 세팅(주소가 아닌 문자열) 한 후 __free_hook에 system 함수를 넣으면 j_free의 인자로 저 initial+8의 주소가 들어가서 system("/bin/sh") 실행이 가능하다.
5. calloc rop
__malloc_hook에 leave ret가젯이 있다는 가정하에, calloc의 rdi를 통해 rbp 조작이 가능하다. 따라서 스택피벗을 할 수 있다. 보통 두번째 인자는 1인데, imul을 통해 rbp에 rsi를 곱할 수 있기 때문에 만약 받을 수 있는 길이제한이 있고, 두 인자를 모두 컨트롤 가능하다면 적절하게 계산해서 사용하면 된다.
6. 카나리 우회
scanf("%d",buf) 로 받으면 +,- 를 입력시 값이 입력되지 않는다. 이를 통해 canary를 넘기고 ret부분만 조작할 수 있다.
보통 안쓰인다.
7. vtable 변조
기본적으로 다들 아시겠지만 16.04에서는 vtable에 대한 검증 루틴이 없다. 만약 모르시는 분들을 위해 설명을 첨가하자면 파일구조체의 끝에는 vtable의 주소가 붙어있고, 파일 IO관련 작업들을 할 때(화면 입출력 포함) 이 vtable에 있는 함수들을 이용해서 작업을 한다. vtable 자체는 write권한이 없으나, stdin이나 stdout 같은 파일구조체에는 write 권한이 있기 때문에 vtable을 내가 원하는 곳으로 돌릴 수 있다.
그리고 bss에 stdin, stdout이 있는 경우가 많은데, 이를 변조하면 fake stdin, fake stdout 을 만들어줄 수 있다.
8. adc 가젯
16.04에서 컴파일 된 녀석은 거의 있는 것 같은데, 자세한 것은 모르겠다. 저 _DO_GLOBAL_DTORS_AUX 의 처음 jnz +1 에 위치하고 있으며 add [rbp+0x48], edx 를 하는 녀석이다. 이 녀석을 어디에 쓰냐? 하면 leak이 안되있는데 ROP가 가능해서 rbp변조가 가능한 상황이다. 예를들어 bss로 스택피벗을 했다고 하고 이곳에서 어떤 복잡한 함수를 실행하면 bss에 그 함수의 기록들이 남을 것이다. 이것들을 이용해서 leak은 할 수 없지만 오프셋은 동일하기 때문에 특정 녀석에 더하거나 빼기 연산을 해주어 이를 원가젯으로 맞추고 실행해주는 것이다.
9. csu 가젯
너무 유명한 놈이다. PIE가 안걸려 있다면 rdi,rsi,rdx 구성하고 함수까지 실행 가능하다. 자세한건 구글신께
'Security > 개인 연구' 카테고리의 다른 글
malloc.c 분석 [2] _int_malloc (fastbin, smallbin) (2) | 2020.12.28 |
---|---|
malloc.c 분석 [1] __libc_malloc (feat. Arena) (0) | 2020.12.28 |
fclose() 를 이용한 leak (1) | 2020.12.27 |
_call_tls_dtors exploit (0) | 2020.11.26 |
/proc/pid/mems 리눅스에서 프로세스 해킹하기 (0) | 2020.11.26 |