리버싱 공부하다 슬럼프와서 흥미잃을바에 차라리 관심있었던 포너블을 조금만 열심히 해보려고 문제잡았다.
일단 달고나 문서 보면서 개념 잡고 ftz같은 경우에는 1~10 까지는 풀어봤는데 생각보다 어렵지 않고 리눅스 명령어만 쏠쏠하게 얻어간 것 같다.
ftz level11에서는 뭔가 많이 배운거같아서 블로그에 포스팅했다.
일단 실행파일 디버깅 권한때문에 tmp파일로 복사하고 gdb로 디버깅했다.
main 보면
sub esp, 0x108 (str 256byte + dummy 8byte)
sub esp, 0x8 (sfp 4byte + ret 4byte)
구조를 띄고있다.
아래는 해당 문제를 맨 처음에 풀기 시작했을때 짰었던 시나리오다.
1. strcpy 함수에서 오버플로우 발생
2. str[256] + dummy[8] + sfp[4] + ret[4] 구조
3. "A" * 243 + shellcode[25] + shellcode_start_address 를 인자값으로 입력해 익스시도
4. 세그먼트 오류 뿜음
세그먼트 오류를 뿜은 이유를 살펴봤더니 인자값이 들어가는 메모리주소가 계속 바뀐다..
위 기법이 아마 ASLR 이 걸려있기 때문이라고 들었는데 어떻게 공격할지 생각하다가 RTL이 생각났다.
RTL 은 Return To Library 의 약자로 라이브러리로 리턴하라는 뜻이다.
일단 RTL 시나리오를 짜보자면
1. system() address 찾기 (0x4203f2c0)
2. system() 함수에서 /bin/sh를 참조하므로 /bin/sh 명령어가 .rodata에 존재 /bin/sh address 찾기 (0x42127ea4)
3. "A" * 268 + system()_address + "AAAA" + /bin/sh_address
"AAAA" + /bin/sh_address 부분을 조금만 더 설명해보자면
system 함수에서 0x8 만큼의 파라미터를 참조하기 때문에 앞에 "AAAA"를 넣고 뒤에 /bin/sh_address(4byte) 를 넣음으로써 명령어가 실행되게 해준 것이다.
'Pwnable > ▷ Study' 카테고리의 다른 글
ftz level16 (0) | 2018.02.17 |
---|---|
ftz level15 (0) | 2018.02.17 |
ftz level14 (0) | 2018.02.17 |
ftz level13 (0) | 2018.02.17 |
ftz level12 (0) | 2018.02.17 |