ipwn

[LOB(Lord Of Buffer overflow)] golem -> darkknight 본문

Write up/LOB

[LOB(Lord Of Buffer overflow)] golem -> darkknight

ipwn 2018. 1. 18. 19:29

이번 단계는 golem 단계이다.


바로 copy file을 만들고 파일을 살펴보겠다.



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


바로 코드를 읽어보겠다.



코드를 보니 여러 제한이 사라진 대신 strncpy로 1byte overflow밖에 할 수 없다.


이 말은 즉 sfp를 1byte overflow를 일으켜서 shellcode를 실행시키라는 말이 된다.


FPO(Frame Pointer Overflow) 기법을 사용한다는 말이다.


우리가 넘겨줄 payload는 shellcode(34byte) + dummy*6 + 1byte overwrite가 될 것이다.


기본적으로 sub function에서 leave와 ret이 일어날 것이다.


즉 mov esp, ebp

    pop ebp

    pop eip

    jmp eip

가 sub function에서 일어난다는 말이다. 일단 sub function의 메모리 구조를 보자.


(여기서 sfp는 1byte overwrite가 됐다고 가정한다.)






가 된 후 ret(pop eip, jmp eip)가 실행돼 main의 마지막 부분으로 이동할 것이다.


이제 main에서의 leave, ret이 있을 것이다.


이제 main function의 메모리 구조를 보도록 하자.




가 되게 된다. (이 상황에서 이제 ebp는 신경쓰지 않아도 된다.)


이제 pop eip, jmp eip를 하게 되면 shellcode가 실행될 것이다.


즉 이 말은 buffer의 시작주소 -4의 값을 sfp의 첫 byte에 넣어주면 shellcode까지 nop을 타고 가서 


shellcode가 실행된다는 말이다. 한 번 복사파일을 gdb로 debugging 해보겠다.



problem_child 함수에서 leave가 실행되기 직전에 break point를 걸어주고 메모리값을 넣어줘보겠다.


넣어줄 메모리값은 아직까지는 dummy*40 이 될 것이다.


한 번 메모리값을 넣어보겠다.



&(buffer)-4의 주소는 0xbffffaa0이라는 것을 찾아냈다.


이제 우리가 넘겨줄 payload는 shellcode(34byte) + dummy*6+ \xa0가 될 것이다.


한 번 copy file에 payload를 넘겨줘보겠다.



shell이 가져와질 줄 알았는데 segmentation fault가 발생해 core dump가 생겼다.


그렇다면 payload가 틀렸다는 말일테니 dummy*40 + \xa0을 넘겨주어 core dump를 다시 만들고 메모리를 보겠다.



&(buffer)-4 의 위치가 0xbffffab0으로 바뀌었다.


다시 payload를 만들어보면 shellcode(34byte) + dummy*6 + \xb0가 되는 것을 알 수 있을 것이다.


한 번 shell이 가져와지는지 payload를 copy file에 넘겨줘보겠다.



다시 segmentation fault가 발생해서 core dump가 떴다. 


payload는 문제가 없어보이는데 왜일까?


이상해서 core dump를 다시 gdb로 열어봤다.



\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가 실행되는 것이 아닌 shellcode를 


주소로 인식해서 그 곳으로 뛰어버린 듯 하다.


그럼 다시 우리가 넘겨줄 payload는 0xbffffab8(&buffer + 4의 주소) + shellcode + dummy*2 + \xb0이 될 것이다.


생각보다 오래 걸렸다.. 한 번 copy file에 payload를 넘겨줘보고 shell이 가져와지는지 확인해보자.



드디어 shell이 가져와졌다. 시행착오가 조금 많았다.


아무튼 이제 원본 파일에 payload를 넘겨주고 권한이 상승한 shell을 가져와보겠다.



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


darkknight로 가는 password는 new attacker이다.


이럴줄 알았으면 그냥 환경변수 만들어서 그 쪽으로 jump 시킬 걸 그랬다.

Comments