ipwn

[LOB(Lord Of Buffer overflow)] orge -> troll 본문

Write up/LOB

[LOB(Lord Of Buffer overflow)] orge -> troll

ipwn 2018. 1. 17. 01:14

이번 단계는 orge 단계이다.


이번에도 copy file을 생성하지 않고 접속 후 바로 파일을 살펴보겠다.



기본적으로 troll파일과 troll.c코드가 주어져있다.


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



이번에도 저번코드와 완전 비슷하다.


하지만 좀 더 제한을 하는 부분이 많아졌다. argc는 무조건 2의 값을 가져야 한다.


즉 argv[1]까지밖에 사용을 할 수 없다는 말이다. 그런데 argv[1]의 값, buffer의 값을 다 지워버린다.


도대체 어떻게 exploit을 할 수 있다는 말일까?

사실 이 부분에서 조금 고민을 많이 했었다. 


남는 부분이 딱 한 공간이 있다. 바로 argv[0] 즉 file의 이름이다.


argv[0]의 공간에 nop 여러개와 shellcode를 놓아주고 return address는 조작이 가능하므로 return address를 임의의 nop의


위치로 옮겨주면 될 것이다. 


그렇다면 우리가 넘겨줘야 할 값은 argv[0] = nop(\x90)*100 + shellcode, argv[1] = dummy*44 + 임의의 nop의 위치


가 될 것이다. 일단 이름에 shellcode가 있는 copy file을 생성해보도록 하겠다.


여기서 많이들 걸리는 난간이 있다.


바로 shellcode로 이루어진 file 이름을 짓는 것이다. 보통 shellcode에는 \x2f의 값이 존재한다.


이 \x2f의 값은 /의 ASCII값인데, 우리는 exec계열 함수나 system함수로 /bin/sh혹은 /bin/bash를 


실행시키는 코드를 만드는 게 목적이므로 일반적인 shellcode에는 /가 거의 무조건 들어간다.


하지만 파일 명에는 /가 들어갈 수 없다. 그러므로 일반적인 shellcode로는 파일 이름을 생성할 수 없다는 말이다. 


즉 \x2f가 존재하지 않는 shellcode를 이용해서 파일 명을 만들어야 하는데, \x2f가 없는 shellcode는 


임의의 값을 어셈블리 딴에서 어떠한 연산을 해주므로써 결국에는 \x2f값을 얻어내는 방법으로 이루어진다. 


이만 각설하고


\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


이 값이 바로 \x2f가 없는 shellcode이다. 이 shellcode를 가지고 file이름을 지어주면 될 것이다.



성공적으로 copy file을 만들어냈다.


이제 이 file을 segmentation fault를 일으켜 core dump를 얻어보겠다.


다시 한 번 우리가 넘겨줘야 할 값은 argv[0] = nop(\x90)*100 + shellcode, argv[1] = dummy*44 + 임의의nop의 위치


가 될 것이다. 한 번 값을 넘겨줘 보겠다.



넘겨주는 payload는 아까설명한 그대로이다.


성공적으로 core dump가 가져와졌다.


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



바로 argv[0]의 위치를 찾았다.


이제 우리가 넘겨줘야 할 payload는 명확해졌다.


argv[0] = nop(\x90)*100 + shellcode, argv[1] = dummy*44 + 0xbffffac0(임의의 nop의 위치)가 될 것이다.


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



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


이제 원본파일에 저번에 사용했던 symbolic link를 걸어주어 공략을 하도록하겠다.


먼저 copy file은 지워주고 똑같은 이름으로 symbolic link를 걸어주도록 하겠다.



성공적으로 copy file을 지웠고 똑같은 이름으로 symbolic link를 걸었다.


이제 symbolic link file에 payload를 넘겨주어 권한이 상승된 shell을 가져와보겠다.



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


troll로 가는 password는 aspirin이다.


 




Comments