任务一:
1.攻击程序分析
缓冲区溢出发生在此函数中的strcpy函数。根据缓冲区溢出的常见攻击方法可知,我们可以构造字符串覆盖其返回地址。查看目标程序堆栈情况如下:
我们查看的是foo程序,由于foo程序首先开辟buf数组空间,为256字节空间,然后则调用bar函数。
即将调用bar函数,我们可以通过ebp和esp看出,buf数组的起始位置应为0xbffffc4c,大小为256字节,查看内存:
红框部分为当前buf中的内容(未初始化)。
2.shellcode构建
使用例子程序提供的shellcode
3.Exploit中的payload构建
在熟悉了攻击程序后我们可以开始构建payload。首先我们需要找到shellcode在内存中的位置,使用find指令:
地址为0xbffffee9,于是我们构造payload。
Payload =shellcode + ’\x90’ (前两项共260位)+ (shellcode地址)
结果如下,成功获得shell:
任务二:
1.攻击程序分析
这一次的溢出代码多出了一个字符串的"大小检测"。为什么要加双引号呢,是因为他的检测并不严谨。从14行的循环条件可以看到,他其实还是允许我们溢出一个字节的。
溢出一个字节不能像实验一那样直接对返回地址进行修改,但我们可以利用ebp。根据栈的知识可以知道,在内存中,buf的下部就是ebp。溢出一个字节可以改变ebp的最低位,也就是说我们可以将ebp指向一个我们能控制的区域,也就是buf数组中。
2.shellcode构建
使用例子程序提供的shellcode
3.Exploit中的payload构建
有了以上思路我们开始构建payload,首先我们肯定是需要一个201字节的数组payload。
首先查看buf数组的地址范围:0xbffffcb8 - 0xbffffd80 共200字节。
此时,ebp刚刚入栈,值为:
我们尝试通过溢出将ebp改为0xbffffd00,这个地址是在buf当中的。
于是:
接下来我们需要思考如何在buf中嵌套shellcode的起始地址&#