ipwn

[LOB(Lord Of Buffer overflow)] succubus -> nightmare 본문

Write up/LOB

[LOB(Lord Of Buffer overflow)] succubus -> nightmare

ipwn 2018. 1. 21. 13:28

이번 단계는 succubus단계이다.


거의 끝이 보인다.


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



nightmare 파일과 nightmare.c 코드가 있다.


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



보아하니 힌트에는 PLT라고 쓰여있고 ret이 strcpy의 PLT로 덮여야 실행이 된다.


그리고 strcpy의 ret은 A로 memset이 된다.


그리고 argv의 갯수 제한도 없고, buffer, buffer의 뒷부분을 지워버리지 않는다.


이 문제의 해결은 생각보다 간단하다.


strcpy의 원형은 char *strcpy(char *dest, const char *src)이다. 


이 뜻은 dest의 주소에 있는 값을 src의 주소에 있는 값으로 덮어버린다는 의미인 것을 알 것이다.


일단 ret을 strcpy_plt로 덮어주면 자연스레 strcpy가 호출이 될 것이고, strcpy함수로 strcpy의 ret부분을 


shellcode가 있는 주소로 덮어주면 될 것이다.


그렇게 된다면 A로 memset 되어있는 strcpy의 ret은 shellcode의 위치로 옮겨질 것이고, 


strcpy종료 후 자연스레 shell을 가져올 것이다.


우리가 넘겨줄 payload는 


dummy*44 + strcpy_plt + dummy*4(strcpy_ret) + dummy*4(strcpy_ret 주소) + dummy*4(&shellcode) + nop+shellcode


가 될 것이다.


일단 strcpy_plt의 주소를 가져오자.



strcpy가 call된 것을 확인할 수 있다.


저 주소가 strcpy_plt의 주소이다.


실제로 gdb에서 x/3i 0x8048410을 해 보면 strcpy의 got로 jmp하는 것을 확인할 수 있다.


이제 복사본에 


dummy*44 + 0x8048410(strcpy_plt) + dummy*4 + dummy*4(strcpy의 ret주소) + dummy*4(&shellcode) + nop+shellcode


를 넘겨줘서 메모리 값을 확인해 필요한 주소들을 가져오겠다.



"AAAA" 부분은 strcpy의 ret부분이고, "BBBB"는 strcpy_ret의 주소, "CCCC"는 shellcode의 주소가 될 것이다.


이제 성공적으로 code dump를 가져왔으니 gdb를 이용해 메모리를 확인해보겠다. 



주소를 구했다.


strcpy의 ret의 주소는 0xbffff6c0이고, shellcode의 주소는 0xbffff6cc이다.


이제 우리가 넘겨줄 payload는 


dummy*44 + 0x8048410(strcply_plt) + dummy*4(strcpy_ret) + 0xbffff6c0(strcpy_ret의 주소) + 0xbffff6cc(&shellcode) + nop+shellcode


가 될 것이다.


한 번 복사본에 payload를 넘겨주고 shell이 가져와지는지 확인해보겠다.



당연히 shell이 가져와질 줄 알았는데 왠지 segmentation fault가 떴다.


core dump를 확인해 어디로 jmp를 했는지 확인해보겠다.



보아하니 nop을 주소로 인식해서 0x90909090의 위치로 jmp한 것 같다.


그럼 payload를 다시 짜보자.


원래 첫 0x90909090의 위치를 가르켰는데, 그 곳을 주소로 인식했다.


그러므로 nop 1000개 중 첫 4byte를 그 다음 4byte의 주소로 바꿔주고 nop을 996개 넣어주면 shell이 실행될 것이다.


dummy*44 + 0x8048410(strcply_plt) + dummy*4(strcpy_ret) + 0xbffff6c0(strcpy_ret) + 0xbffff6cc(이전 nop의 첫 주소) + 0xbffff6d0(그 뒤 4byte의 주소) + nop+shellcode


의 값을 payload로 넘겨주면 될 것이다.


한 번 제대로 shell이 가져와지는지 복사본에 payload를 넘겨줘보겠다.



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


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



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


nightmare로 가는 password는 beg for me이다.




Comments