ipwn

[LOB(Lord Of Buffer overflow)] assassin -> zombie_assassin 본문

Write up/LOB

[LOB(Lord Of Buffer overflow)] assassin -> zombie_assassin

ipwn 2018. 1. 20. 15:11

이번 단계는 assassin 단계이다.


바로 복사본을 만들고 파일들을 살펴보겠다.



기본적으로 zombie_assassin 파일과 zombie_assassin.c 코드가 있다.


코드를 읽어보도록 하겠다.



코드가 저번 코드랑 조금 비슷하다.


하지만 달라진 점이 있는데 바로 strncpy로 딱 48byte만 덮어준 것이다.


이번 단계에서 사용될 기법은 바로 FAKE ebp기법이다. 


이전 단계에서 ret gadget을 가져와서 사용했다면, 이번 단계에서는 leave-ret gadget을 가져와서 사용할 것이다.


사실 이 기법은 예전에 사용했던 Frame Pointer Overwrite와 굉장히 닮아있다.


일단 우리가 넘겨줄 payload는 dummy*40 + &shellcode -4 + leave-ret gadget가 될 것이다.


일단 이렇게 payload를 넘겨줬다고 가정한 뒤 leave leave ret이 된다고 생각하면 된다.


메모리가 어떻게 움직이는지 보겠다. 여기서 ret은 leave-ret gadget으로, sfp는 &shellcode-4로 덮였다고 가정한다.


위 사진이 기본적으로 leave를 한 상황이다. 이제 overflow를 일으킨 ret 부분의 leave-ret이 실행될 것이다.


leave-ret gadget 덕분에 esp가 shellcode의 위치에 있게 되고 이제 ret 즉

 

pop eip 


jmp eip


를 실행시키면 shellcode가 실행될 것이다.


이제 우리는 leave-ret gadget의 주소를 구해와야한다.


복사본을 디버깅해서 leave-ret의 주소를 구해오겠다.



leave-ret gadget의 주소는 0x80484df이다.


이제 복사본에 dummy*44 + 0x80484df를 넘겨주어 core dump를 가져오겠다.



성공적으로 core dump를 가져왔다.


이제 core dump로 메모리값을 읽어와보겠다.



&buffer -4의 주소는 0xbffffa8c이다.


이제 payload는 shellcode(34byte) + dummy*6 + 0xbffffa8c + 0x80484df가 될 것이다.


한 번 복사본에 payload를 넘겨줘보겠다.



흠 왜인지 segmentation fault가 발생했다.


core dump를 열어서 어디 부분으로 jmp했는지 확인해보자.



\x31\xc0\x50\xbe\x2e\x2e\x72\x67\x81\xc6\x01\x01\x01\x01\x56\xbf\x2e\x62\x69\x6e\x47\x57\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80


내가 사용하는 shellcode인데 저번과 같이 shellcode를 또 주소로 인식해서 그 곳으로 뛴 듯 하다.


다시 payload를 구성하면 0xbffffa94 + shellcode(34byte) + dummy*2 + 0xbffffa8c + 0x80484df가 될 것이다.


payload를 넘겨줘보겠다.



성공적으로 shell을 가져왔다.


이제 원본 file에도 payload를 넘겨 권한이 상승된 shell을 가져오겠다.



성공적으로 shell을 가져왔다.


zombie_assassin으로 넘어가는 password는 no place to hide이다.


흠 사실 sfp의 값에 &buffer -8의 값을 넘겨주니 굳이 buffer의 시작 부분에 &buffer +4의 값을 


넘겨주지 않아도 shell이 가져와졌다.


아마 ret부분 중 pop eip부분에서 또 pop이 일어나서 그런 것 같다.

Comments