实用文档
调试OverFlowServer.exe得到OverFlow调用返回时的地址,将返回地址与shellcode.shc中的十六数相比较,有三种比较结果:
(1)返回地址是shellcode最后4字节数据。函数返回时执行shellcode。 (2)返回地址没有在shellcode.sh中,缓冲区空间过大,溢出未发生。可以缩小缓冲区空间或在最后8个字节前用0x90(空指令)补充。
(3)返回地址在shellcode.shc中(不是最后4字节数据),缓冲区空间过小。放大缓冲区空间。
当改变TempBuffer缓冲区大小时,其首地址可能会发生变动,调试确定TempBuffer首地址,重新填写CreateShellCode.cpp,并重新生成shellcode.shc。
调试可知:overflow入口地址为0x00401102,子程序返回地址应为0x00401107
实用文档
调试至jump,找到程序将返回地址存在0x0012FB1C处
调试进入memcpy,发现shellcode从0x0012F968处开始写
由此可算出shellcode的长度应为0x0012FB1C+4-0x0012F968=0x1B8=440,缓冲区大小应设为432
实用文档
将overflowserver缓冲区大小设置为432,调试至memcpy得到TempBuffer入口点0x0012F968
修改createShellCode最后4字节为0x0012F968,在最后8字节之前添加\\x90直到生成的shellcode长度为440
运行overflowserver,当overflow子程序运行完后,指针移动到0x0012FB1C处获得返回原程序地址,此时由于shellcode的最后4字节覆盖了该返回地址,使得程序跳转到shellcode开头执行shellcode程序,而shellcode中含有原程序中overflow下一条语句的开始地址,所以执行完后会跳转至原程序的下一条语句继续执行
经过多次调试后确定缓冲区大小,当满足第一种比较结果时,缓冲区溢出就可以执行下去。运行程序,查看系统用户jlcss(若jlcss用户已存在,请先将其删除再运行程序)及其所属用户组。
四 实验小结
栈是一个后进先出的结构,函数在入栈时,先将返回地址RET压入栈,接着是EBP基址寄存器,然后根据局部变量的大小,开辟一定大小的缓冲区,再将局部变量压入。
在将局部变量压入栈的时候,如果压入数据过长,大于事先声明的缓冲区大小,就会覆盖EBP和RET。
实用文档
漏洞的利用有5个方面的问题需要考虑。
一是RET的定位,要用我们的地址覆盖RET,就需要先知道RET在哪,也就是我们定好的这个地址,应该放在字符串的什么位置。
二是要寻找一个跳转指令,将这个指令的地址填充到RET,这样才能在返回时通过跳转指令转到其它地方执行程序
三是要构造shellcode,也就是完成一些特定的功能。 四是将所构造的shellcode放在跳转指令转向的地方。
最后一个步骤就是根据上面的这些分析过程,将它们整合成攻击程序,运行这个攻击程序就能直接利用缓冲区溢出漏洞。