攻防世界pwn题:实时数据检测(难度:四)
比较经典的一道格式化字符串漏洞的题目,难度不大,l0tus在这里提供两种做法
经典做法
下载附件拖进ida之后看到明显的逻辑,不过这题是32位的
1 | int locker() |
这道题没有开启地址随机化保护,key的地址每次运行都相同。
明显我们需要做的就是将key的值改写成35795746,也就是16进制的0x02223322
当然通过我们aaaa-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p的测试,可以得知偏移为12
运行附件随便输入个文本会回显
1 | “The location of key is 0804a048, and its value is 00000000,not the0x02223322. (╯°Д°)╯︵┻━┻” |
可爱捏
那么构造的payload就比较简单了如下:
exp
1 | from pwn import * |
这里要传输三千多万个字符,所以跑起来可能需要20秒左右等待时间,耐心等待就可以cat flag啦
pwntools秒杀法
l0在某知名技术网站学习的时候偶然看到pwntools中一个强大的功能,fmtstr_payload()
先上exp看看
1 | from pwn import * |
l0tus深感震惊,不多说什么了,这里直接放用法:fmtstr_payload(偏移,{原地址:目的地址})
感兴趣的佬可以看看这个函数的源代码:
1 | def fmt(prev, word, index): |