passcode : pushig me away
(NO DRAG, NO PASSCODE)
이번 문제는 GIANT 문제의 코드와 비슷하지만 strncpy 함수를 통하여 딱 48바이트만 buffer를 채운다. 따라서 buffer + SFP + RET 이외의 공간은 사용할 수 없다. 그렇다면 buffer에 shellcode를 삽입하고 esp, ebp, eip 레지스터들을 잘 이용하여 쉘이 실행되도록 해야한다.
우선 buffer 안에 shellcode를 집어 넣을 것이므로 buffer는 NOP + shellcode 로 채워줘야겠다. 그리고 마지막에 eip가 buffer의 시작주소에 위치하여야 한다. main 함수의 기본적인 에필로그로는 eip가 buffer의 시작주소에 위치하지 못하기 때문에 에필로그를 한번 더 진행함으로써 eip가 buffer의 시작주소에 정확히 안착하게 만들어주어야 한다. eip의 위치를 조작하는 알고리즘은 FPO기법과 유사하다. 따라서 서브함수가 존재하지 않는 환경에서의 FPO 기법이라고 생각한다.
자 이제 위와 같은 방법을 도식화하여 이해해 보자.
자 이제 이를 바탕으로 필요한 주소값들을 찾아보자. 이제 이를 이용하여 payload를 구성하고 쉘을 따보자. payload 구성은 다음과 같다.
&(buffer)-0x4 + NOP + shellcode + &(buffer)+0x4(Fake EBP) + leave/ret Gadget
이제 필요한 주소들을 구해보자.
leave/ret Gadget -> 0x80484df
zombie_assassin.c 에 버퍼의 시작 주소를 출력하는 코드를 추가해주었다.
임시 buffer 시작 주소 -> 0xbffffac0
이제 이를 이용하여 payload를 구성하고 쉘을 따보자.
core dumped 가 떴다. core를 분석하여 정확한 buffer의 주소를 얻어서 쉘을 따보자.
정확한 buffer 시작 주소 -> 0xbffffa90
[zombie_assassin] : no place to hide
'Pwnable > LOB' 카테고리의 다른 글
[LOB] 17. SUCCUBUS (0) | 2020.08.28 |
---|---|
[LOB] 16. ZOMBIE_ASSASSIN (0) | 2020.08.28 |
[LOB] 14. GIANT (0) | 2020.08.28 |
[LOB] 13. BUGBEAR (0) | 2020.08.28 |
[LOB] 12. DARKKNIGHT (0) | 2020.08.28 |