软件安全实验二——淹没返回地址
一、 *实验目标*
- 通过对程序输入的密码的长度、内容等修改用Ollydbg来验证缓冲区溢出的发生
- 完成淹没相邻变量改变程序流程实验
- 完成淹没返回地址改变程序流程实验
二、 *测试步骤与结果*
(一) 用Ollydbg验证缓冲区溢出发生
- 找到strcpy()函数设置断点,运行程序并输入错误的密码12345。
可知存储区中存在0012FAC4,随后被转存到0012FB18.
看到返回结果为FFFFFFFF,即为-1的补码,说明密码对比不正确。
- 重新启动程序,输入正确结果1234567
返回结果00000000,说明密码对比正确。
- 由于输入过长字符串时程序并没有设置限制,而是继续在栈中写入,从而导致缓冲区溢出,尝试输入1111111111(10个1)
程序溢出,溢出到了返回值的栈空间中。
可见存储区栈结构如下:
主函数main() |
---|
return address |
ebp返回地址 |
authenticated |
buff[8] |
(二) 完成淹没相邻变量改变程序流程实验
由实验(一)已知,当字符串长度超过八位时,会发生栈溢出,多余位数会溢出到authenticated所在空间,因此当输入8位字符时,末尾结束符“00”会发生溢出,使得authenticated所在栈空间为0.导致输出正确结果
输入87654321验证
结果显示0012FB20为00000000说明会输出正确结果
(三) 完成淹没返回地址改变程序流程实验
- 如果想要将返回地址也淹没的话需要输入超长字符串,即:8位buf[8] + 4位authenticated存储空间 + 4位EBP回调存储空间 + 想要其返回的地址位置
可见在00401116处为输入正确语句,因此要转跳到00401116处
- 将00401116按照编码进行转换
拼接后进行输入:1111222233334444VQ@
3.尝试输入该字符串,修改成功。
绘制修改原理的图示
三、 *测试结论*
通过这一实验测试,可以看出栈溢出对程序的准确运行有很大的危害,如果不对栈空间进行保护的话,系统中很容易存在栈溢出漏洞。攻击者通过漏洞只要到达最近的传地址位置就可以转跳到任何想要转跳的地方,存在着相当大的风险。因此要对程序栈进行保护,严格限制管理外部数据对栈的操作,从而避免因为栈溢出而存在漏洞。
四、 *思考题*
在不修改源代码的情况下,修改OverFlow_EXE程序的流程,通过弧注入的方式,不植入可执行代码,让其调用MessageBoxA函数(函数地址:0x77E23D68)弹出对话框(对话框显示bupt),之后调用ExitProcess函数(函数地址:0x77E7B0BB)退出进程。写明其他方法的主要思路,破解过程,并附带截图及破解程序。
- 通过源代码可以发现,在读入password后程序调用verify_password函数,瑞国想通过弧注入方式进行攻击所使用函数栈应该:buffer[0-44] 44字节+authenticated 4字节+EBP 4字节+返回地址
2. 2. 根据需求地址调用编辑password
3.重新运行程序,实验成功。
栈内存结构:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ZYH's blog!
评论