LOB_16.assassin->zombie_assassin

해킹/LOB 2016. 1. 31. 19:51


이제 리턴 뒷쪽을 사용할 수 없게 되었다.

전에 RTL을 할 때 언급했지만 이런식으로 바운더리 체크를 해서 곤란한 경우에는 fake ebp를 유용하게 써먹을 수 있다.

주석에도 FEBP라는 힌트가 보인다.



전단계에서 사용했더 ret이 pop eip, jmp eip 의 기능을 하는것처럼 leave도 특수한 동작을 한다.


1.mov esp ebp

2.pop ebp

leave 명령어는 이런 두가지 동작을 합쳐놓은 명령어다.


보면 esp를 ebp 위치까지 당겨오고 그 위치 스텍에 있는 값을 ebp로 넣어주는 기능이다.

ebp가 가르키는 주소에는 원래 SFP값이 들어있으므로 보통은 SFP가 ebp로 넘어가게 된다.

하지만 지금 입력을 48바이트 받는과정에서 SFP와 RTN을 변조할 수 있으므로 ebp에 원하는 값을 넣어줄 수 있다.

그다음 나오는 ret의 주소를 leave 부분으로 해서 다시 leave를 실행하게 되면??

1.mov esp ebp를 하며 fake ebp가 esp로 들어가게 된다.

그리고 2.pop ebp를 하면서 esp가 4바이트 뒤에 위치하게 되고 다음 ret할때의 주소를 바로 이 위치에서 읽게 된다.

즉 leave 부분이 실행되면서 다음 리턴주소는 fake ebp+4 주소가 된다는 뜻이다.





우선은 환경변수 어딘가에 쉘코드를 넣어주고 주소를 구한다. 점프주소는 5000정도 뒤인 0xbfffea14정도로 하겠다




strncpy가 끝나고 스텍의 모습이다. 0x62626262가 들어있는 부분이 점프할 주소가 들어갈 부분이고 그보다 4바이트 앞인 0xbfffd340을 fake ebp로 넣어주면 되겠다.

즉 0x62626262 대신에 점프할 주소인 0xbfffea14를 넣고

0x63636363 대신 fake ebp인 0xbfffd340을 넣어준다.

마지막으로 0x64646464가 들어있는 부분에는 리턴주소를 넣어줘야 한다. main에서 마지막 leave가 나오는 부분으로 점프하면 된다.




해당주소는 0x080484df임을 확인했다. 페이로드를 짜보면


./zombie_assassin `python -c 'print "a"*36+"\x14\xea\xff\xbf"+"\x40\xd3\xff\xbf"+"\xdf\x84\x04\x08"'`





한번에 성공했다.

끝-


'해킹 > LOB' 카테고리의 다른 글

LOB_18.succubus->nightmare  (0) 2016.02.03
LOB_17.zombie_assassin->succubus  (0) 2016.02.01
LOB_15.giant->assassin  (0) 2016.01.31
LOB_14.bugbear->giant  (0) 2016.01.31
LOB_번외.bash2의 함정.  (0) 2016.01.29
Tags
Social