题意:构造一组字符串,使得输出的值为deadbeef
参考资料:https://junyu33.github.io/2021/11/06/security02.html
解答:
首先将Dev的编译选项改一下,Debug模式可以关掉系统自带的内存保护。

观察代码发现getbuf要你输入一串十六进制字符,且函数默认返回1,但getbuf里的buf数组只有16个字节,考虑缓冲区溢出。
根据我的理解,系统堆栈是这样的

有个简单(并不)的想法就是把堆栈返回的地址赋成某个我们输入了字符的地址(比如eax),然后eax开始的汇编代码就是想办法把return的值变成0xdeadbeef
我们用OllyDBG查看一下eax的地址,发现他在

ebp栈底指针的地址是

所以我们可以知道我们输入数据的最后几行是58 FE 28 00 10 FE 28 00
跳到eax后,系统会像执行汇编命令一样执行我们的输入。
我们要先把eax赋成0xdeadbeef

然后把我们要返回的地址push进去,再retn。Push的地址可以从Dev的查看CPU窗口中找到。

因此我们输入的前面几位是 B8 EF BE AD DE 68 f0 15 40 00 c3
考虑我们输入的字符串要补几个字节

由汇编代码可以发现,系统给应该分配16个字节的buf分配了24个字节,而我们在Part1中的ebp和修改eax的部分不在这里面(值得注意的是那两个地址都是4个字节),所以为了使缓冲区溢出,我们要在前面补上24-11=13个字节的内容。比如13个00.

有趣的问题:

main函数开头的这段代码是在干什么呢QwQ
老师说是想把函数的地址对齐。。。
我有点明白了。。但没完全明白。。