ipwn

[LOB(Lord Of Buffer overflow)] gremlin -> cobolt 본문

Write up/LOB

[LOB(Lord Of Buffer overflow)] gremlin -> cobolt

ipwn 2018. 1. 14. 16:45

이번 단계는 gremlin 단계이다.


한 번 접속하고 파일들을 살펴보겠다.


cobolt파일과 cobolt.c파일이 있다. 일단 bash2를 바로 실행하고 코드를 살펴보겠다.



이번 코드는 gate코드랑 완전 똑같은데 buffer의 크기만 줄어들었다.


buffer크기가 현저하게 줄어들어서 buffer의 시작주소에 shellcode를 넣지는 못할 것이다.


그러므로 buffer의 뒷 부분이나 argv[2]를 이용해 shellcode를 넣어주고 return address에 shellcode의 주소를 


넣어주면 될 것이다. 일단 그럼 넣어주면 되는 값은 


dummy*20 + shellcode address + nop(\x90)*임의의 값 + shellcode이 될 것이다. 


nop을 넣어주는 이유는 nop sled를 이용하기 위해서인데, nop sled란 nop은 실행을 하더라도 


실행할 명령이 없어서 포인터가 다음으로 넘어가는 것을 이용한 기법이다. 


결론적으로는 nop을 계속 이어서 포인터를 계속 이동시켜 shellcode가 위치한 곳으로 옮기기 위함이므로 


그냥 shellcode의 주소를 박아넣어줘도 상관은 없지만 만약 aslr이 걸려있다거나 등등 여러 이유가 있을 경우에는 


nop sled를 자주 이용할 것이다.


아무튼 return address는 nop가 주욱 늘어져있고 마지막에는 shellcode가 위치해있는 곳으로 옮겨주면 될 것이다. 


일단 copy file을 생성한 뒤 segmentation fault 를 일으켜서 core dump를 떠보겠다.



먼저 사진의 A값으로 dummy + sfp 값을 다 덮어준다. 


그 뒤에는 BBBB(return address)의 위치에는 nop이 위치한 어딘가의 주소를 넣어줄 것이다. 


그 뒤 nop을 200개 넣어주고 마지막으로 쉘 코드를 넣어주어서 nop이후 shellcode로 자연스럽게 포인터가 


이동할 수 있도록 만들어주었다. 이제 core dump를 확인해서 메모리들을 확인해보자.



이렇게 nop이 위치한 곳을 확인할 수 있다. 이제 저 위치 중 아무 곳이나 return address로 옮겨준다면 


shellcode로 포인터가 이동해서 자연스럽게 shellcode가 실행 될 것이다.


이제 payload를 작성해보면 dummy*20 + "\x10\xfa\xff\xbf"(임의의 nop이 위치한 값) + "\x90"*200 + shellcode


의 형식으로 작성이 될텐데 0xbffffa00의 위치로 옮겨주지 않는 이유는 \x00은 NULL을 의미하기 때문에 중간에 


코드가 끊겨버리기 때문이다. 한 번 cobolt의 copy file에 payload를 넘겨주어 shell권한을 가져와보겠다.



이렇게 성공적으로 shell이 가져와지는 것을 확인할 수 있다.



이렇게 메모리들을 더 살펴보면 shellcode가 위치한 주소(nop의 끝부분)을 확인할 수 있는데 저 주소를 넣어도 


똑같이 shell이 가져와질 것이다. 한 번 실행해보겠다.



이렇게 정확한 shellcode의 address를 넣어주어도 똑같이 shell이 가져와지는 것을 확인할 수 있다. 


이제 똑같은 payload를 cobolt의 파일에 넣어서 권한이 상승된 shell을 가져와보겠다.



성공적으로 권한이 상승된 shell을 가져왔다. cobolt로 넘어가는 password는 hacking exposed였다.

Comments