1、 目标

  1. 读懂并能够独立编写密码验证的小程序。
  2. 运行Ollydbg,并学习用其调试密码验证小程序。
  3. 学习安全漏洞的基本原理,通过修改汇编语句来修改程序的判断条件,改变程序的运行路线。
  4. 破解crackme.exe程序,尝试绕过密码验证逻辑,至少采用2种破解方式方法。

2、 测试步骤与结果

1.通过查看源代码可以看出来main函数实现了一个密码比对功能,只有输入密码为1234567时才能通过。

img

根据代码画出程序流程图

img

2.打开Win2000虚拟机系统,使用VC软件新建工程。

img

3.新建C++文件

img

4.导入程序代码进行生成

img

5.对初始代码进行调试,可以正常运行

img

6.使用ollyDbg打开刚才生成的exe程序,可以看见exe反汇编后的汇编语言程序

img

7.找到判断语句区域,打下断点,如果输入错误密码会重复执行该区域语句

img

8.找到判断语句,修改源代码

img

9.将其从74改为75,实现取反,这样输入错误密码就会通过

img

10.此时输入正确密码反而无法通过

img

随机输入一个错误密码,程序通过,自动关闭。

3、 测试结论

通过本次实验测试,我认识到了软件安全的重要性,尽管开发人员可以对软件进行封装,但攻击者依旧可以对源代码进行篡改实现攻击。使用简单的判断逻辑进行信息保护还是有较大风险性存在的,因此也可以尝试更为复杂的逻辑判断从而加大破译难度,或者也可以将数据传回云服务器进行验证,从而避开用户更改本地代码这一攻击手段。由此,我认为还是应当好好学习这门课程,加深自己对软件安全的认识和理解,从而在以后的工作中设计出更为安全的软件,避免因缺乏安全知识,使得设计的软件漏洞百出不看重用。

4、 思考题

本部分共使用三种方法实现

1)通过更改判断语句逻辑实现

1.直接点击exe文件进行初次尝试,查看运行效果,找到关键字符串“注册失败”

img

2.导入虚拟机,使用ollyDbg进行调试

从存储区可以看到00403020处存储的是“注册失败”字符串

img

3.通过查找常量找到伪代码中调用地址的位置

img

4.往上就进找到判断语句,该语句应为正否判断

更改判断逻辑75改为74,此时随意输入内容可以通过

img

2)删除判断语句,强制执行注册成功部分代码实现

1.分析伪代码可知:JNZ语句执行判断,如果满足条件则正常执行,不满足则向下跳转到注册失败语句

img

2.因此如果将这句判断注释掉,就可以正常按顺序执行成功语句

imgimg

3.此时输入任何信息都可以输出通过

img

3)动态调试实现

1.在寄存器中z控制判断反馈结果,因此在判断语句打下断点,通过更改寄存器值可以直接通过

img

2.输入错误密码,运行到断点处,程序等待响应,此时z=0

img

3.将其改为1后,程序判定判断语句通过,输出正确选项

img