ipwn

[LOB(Lord Of Buffer overflow)] wolfman -> darkelf 본문

Write up/LOB

[LOB(Lord Of Buffer overflow)] wolfman -> darkelf

ipwn 2018. 1. 16. 23:37

이번 단계는 wolfman 단계이다.


바로 copy file을 생성하고 파일을 살펴보겠다.



기본적으로 darkelf파일과 darkelf.c 코드가 있다. 바로 코드를 읽어보도록 하겠다.



점점 코드가 길어지는게 익숙해진다.


각설하고 이번 코드도 저번 코드와 완전 유사하다. 하지만 다른점은 argv[1]을 검사해서 48byte를 초과하면 


프로그램을 종료시켜버린다. 즉 argv[1]의 뒷 공간에다가는 shellcode를 올릴 수 없고 buffer의 뒷 공간도 더더욱 그럴 것이다.


그렇다면 어떻게 해야할까? 


argv[2]의 공간을 사용하면 된다. argc는 2보다 작지만 않으면 상관이 없기에 argv[2],argv[3],argv[4]....을 쭉 써도 상관이 없다.


그렇다면 argv[1]의 공간을 return address를 덮을 만큼만 넣어주고 argv[2]의 공간에 


nop과 shellcode를 올려놓아주면 될 것이다.


즉 우리가 작성할 payload는 argv[1] = dummy*44 + 임의의 nop의 주소 argv[2] = nop(\x90)*200 + shellcode가 되겠다.


한 번 copy file을 segmentation fault를 일으켜서 core dump를 얻어보겠다.



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


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



argv[1]와 argv[2]의 값이 보인다. 사실 argv[1]에 shellcode를 올려서 실행해도 됐겠지만 좀 더 간편하게 하기 위해서


argv[2]에 nopsled와 shellcode를 놓아 주었다.


이제 nop의 위치를 구했으니 exploit을 할 차례이다.


이제 우리가 넘겨 줄 payload는 argv[1] = dummy*44 + 0xbffffb70(임의의 nop의 위치) argv[2] = nop(\x90)*200 + 


shellcode 가 될 것이다.


한 번 copy file에 payload를 넘겨주어 제대로 shell이 가져와지는지 확인해보겠다.



성공적으로 shell이 가져와졌다. 이제 원본 file에 payload를 넘겨주어 권한이 상승된 shell을 가져와보겠다.



성공적으로 shell을 가져왔다. darkelf로 가는 password는 kernel crashed이다.





Comments