본문 바로가기

Pwnable/▷ Study

ftz level11

리버싱 공부하다 슬럼프와서 흥미잃을바에 차라리 관심있었던 포너블을 조금만 열심히 해보려고 문제잡았다.

일단 달고나 문서 보면서 개념 잡고 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