一道格式化字符串漏洞题
寻找漏洞
题目如下
可能溢出的地方有两个:
- read函数,但是src申请的空间是0x84读入数据限制在了0x80,没有发生溢出。
- 另一个是strcpy,又观察到下面有一个格式化字符串漏洞,那么就应该是利用这里了
寻找利用方法
现在查看strcpy是否能让usr覆盖掉格式化字符串
发现偏移正好是0x80,导致我们无法直接覆盖掉格式化字符串。然后我就感觉。。。。。这个程序明明天衣无缝,根本没有漏洞。
围绕已知漏洞看看是不是漏掉了什么
先看看字符串里有没有什么信息
好的,发现只要泄露这个地址的字符串就可以拿到flag
然后仔细想一下,其实read函数接受0x80个字符是不包括\0的,然后strcpy复制过后会自动为字符串末尾加上\0。这样就可以覆盖掉 qword_601160 这个地址的后两位。这样格式化字符串的地址就改变到了我们可以控制的位置。其实这就是off-by-one的思想,前几天接触堆的时候看见过不过没有深入。
总结
其实这道题的知识点是都会的,就是以前做的栈题都是动辄覆盖返回地址,这道题只溢出了一个字符便没有引起自己足够的重视。下面是这道题的exp
1 | from pwn import * |