软件安全实验一——存在栈溢出的代码
1、 目标
- 读懂并能够独立编写密码验证的小程序。
- 运行Ollydbg,并学习用其调试密码验证小程序。
- 学习安全漏洞的基本原理,通过修改汇编语句来修改程序的判断条件,改变程序的运行路线。
- 破解crackme.exe程序,尝试绕过密码验证逻辑,至少采用2种破解方式方法。
2、 测试步骤与结果
1.通过查看源代码可以看出来main函数实现了一个密码比对功能,只有输入密码为1234567时才能通过。
根据代码画出程序流程图
2.打开Win2000虚拟机系统,使用VC软件新建工程。
3.新建C++文件
4.导入程序代码进行生成
5.对初始代码进行调试,可以正常运行
6.使用ollyDbg打开刚才生成的exe程序,可以看见exe反汇编后的汇编语言程序
7.找到判断语句区域,打下断点,如果输入错误密码会重复执行该区域语句
8.找到判断语句,修改源代码
9.将其从74改为75,实现取反,这样输入错误密码就会通过
10.此时输入正确密码反而无法通过
随机输入一个错误密码,程序通过,自动关闭。
3、 测试结论
通过本次实验测试,我认识到了软件安全的重要性,尽管开发人员可以对软件进行封装,但攻击者依旧可以对源代码进行篡改实现攻击。使用简单的判断逻辑进行信息保护还是有较大风险性存在的,因此也可以尝试更为复杂的逻辑判断从而加大破译难度,或者也可以将数据传回云服务器进行验证,从而避开用户更改本地代码这一攻击手段。由此,我认为还是应当好好学习这门课程,加深自己对软件安全的认识和理解,从而在以后的工作中设计出更为安全的软件,避免因缺乏安全知识,使得设计的软件漏洞百出不看重用。
4、 思考题
本部分共使用三种方法实现
1)通过更改判断语句逻辑实现
1.直接点击exe文件进行初次尝试,查看运行效果,找到关键字符串“注册失败”
2.导入虚拟机,使用ollyDbg进行调试
从存储区可以看到00403020处存储的是“注册失败”字符串
3.通过查找常量找到伪代码中调用地址的位置
4.往上就进找到判断语句,该语句应为正否判断
更改判断逻辑75改为74,此时随意输入内容可以通过
2)删除判断语句,强制执行注册成功部分代码实现
1.分析伪代码可知:JNZ语句执行判断,如果满足条件则正常执行,不满足则向下跳转到注册失败语句
2.因此如果将这句判断注释掉,就可以正常按顺序执行成功语句
3.此时输入任何信息都可以输出通过
3)动态调试实现
1.在寄存器中z控制判断反馈结果,因此在判断语句打下断点,通过更改寄存器值可以直接通过
2.输入错误密码,运行到断点处,程序等待响应,此时z=0
3.将其改为1后,程序判定判断语句通过,输出正确选项