BUPT软件安全实验一

本文详细描述了如何使用x64dbg调试和修改一个简单的密码验证小程序,通过修改汇编指令来改变程序执行路径,实现绕过密码验证。作者展示了三种不同的破解方法,并强调了软件安全的重要性,指出在编程时应考虑防止反汇编和修改的措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.目标

(1)读懂并独立编写密码验证的小程序。

(2)运行x64dbg(功能和Ollydbg差不多,但界面更友好),并学习用其调试密码验证小程序,以此理解软件漏洞的基本原理。

(3)通过修改汇编语句来修改程序的判断条件,改变程序的运行路线。

在这一过程中,我需要详述修改程序过程,并在实验的关键处截图,绘制出程序运行的结构图,以及修改原理的图示(通过程序运行的结构图)

(4)解决思考题,即:破解crackme.exe程序,尝试绕过密码验证逻辑,至少采用2种破解方式方法,并提交破解后的程序。

2.测试步骤与结果

(1)进入虚拟机

    使用VMware打开已经准备好的虚拟机文件:

(2)研究代码

    使用桌面的VC6打开文件夹“第一次试验代码”中的main.cpp,对代码进行研究:

    可以很清晰地看到,这是一个验证输入是否正确的密码验证小程序,逻辑比较简单,其运行结构图如下所示(从main函数开始):

    然后我们通过VC6将其编译成工程:

    点击右上角的红色感叹号运行:

   简单测试一下,输入正确的密码和错误的密码的结果分别如下:

    使用VC6对小程序进行研究的步骤已经完成,下面使用x64dbg对刚刚生成的main.exe进行分析和调试。(由于虚拟机上没有安装x64dbg,故我将虚拟机编译生成的main.exe复制到主机,使用主机上的x64dbg打开main.exe)

    刚打开时的界面如下:

    可以看到,x64dbg主要由4个窗口组成:左上角为反汇编的结果(形成的汇编语言),左下角为内存的地址和数据的值,右上角为寄存器的情况,右下角为堆栈的地址和相应的数据。

    根据前面分析的小程序的运行结构,结合我的汇编语言基础和x64dbg的使用经验,我通过搜索字符串的方式,跳转到程序判断输入是否正确的语句处:

    很容易可以分析出,上图的语句je main.4010F6的跳转是决定输出判断是否正确的关键,而je意思是“相等则跳转”,且是判断前一句的ss:[ebp-4]的值域0是否相等。进一步分析,若ss:[ebp-4]的值为0,则输出判断正确的语句;若其值不为0,则输出判断错误的语句。

    那么问题就很明了:如果我们想在输入错误密码的情况下通过验证,那么就得在ss:[ebp-4]的值不为0的情况下,程序任跳转至输出判断正确的语句。这很好改:将je改为jne即可。右键—>汇编即可修改。

       修改程序的原理,就是要让程序的运行结构变成下面这样:

       下面是将je修改为jne后的界面:

       运行程序:

i.输入正确的密码:1234567,程序反而提示输入错误:

ii.随便输入一个错误的密码,程序反而提示输出正确:

        以上结果说明我们通过改变判断条件修改了程序执行的顺序,得到了我们想要的结果。

3.测试结论

    如此简单的一个小程序,都能通过简单的修改运行结构而达到破解的效果,更不用说更大、更重要的程序和软件了。通过这次测试,我对软件安全有了更深刻的认识,也意识到软件面临着极大的安全隐患,需要我们去保护和守卫。而要达到这一点,我们要去主动学习更多的知识、熟悉更加强有力的工具。X64dbg就是调试程序的一件利器,它能辅助我们弄清程序的结构和运行逻辑,定位到关键语句处进行分析,必要时作出相应的修改以达到保护的作用。

    我们平常编写程序时,应该着重考虑到攻击者可能会对程序进行反汇编和修改,因此,我们最好可以将程序结果进行一定的隐藏,如对加密程序的算法进行混淆,以增大攻击者反汇编的难度,提高程序的自我防护能力。

4.思考题

    首先运行crackme.exe,其界面如下:

    由于现在不知道密码,我随便输入了用户名和密码,并点击“注册”,结果如下:

    可以看到注册失败了。那么现在的目标是:破解crackme.exe程序,尝试绕过密码验证逻辑,使得注册成功。至少采用2种破解方式方法,并提交破解后的程序。

       首先还是使用x64dbg打开该程序:

       根据前面得到的“注册失败”的提示,我仍然采用字符串搜索的方式定位到关键语句处:

       从上图可以注意到语句jne crackme.401637,这与之前破解密码小程序时看到的语句相似。结合前后语句,可以推测出该语句实现了一个分支跳转结构,即输入的密码不是已经设定的密码时,跳转到“注册失败”语句;反之则跳转至“注册成功”语句。

方法一:修改判断逻辑

       根据上面的分析以及前面密码小程序的破解,不难得出破解该程序的一个方法:将jne改为je。下面是修改后运行程序并随意输入用户名和密码得到的结果:

       可以看到破解成功。修改后的crackme.exe保存为了crackme1.exe。

方法二:通过x64dbg找到设定好的密码

       前面已经分析过,该程序已经设定好了一个密码,当我们输入的值与该密码一致时,程序才会弹出“注册成功”。那么是否可以直接找到这个密码呢?答案是肯定的。前面已经提到过字符串搜索的方式,其实很多时候,这种设定好的值由于要和输入的值比较,是会在汇编语言中的注释栏出现的。利用这个特性,我们可以再次使用字符串搜索,如下所示:

       注意到上图的灰色部分显示为“crackmepassword”,且它在程序中出现的位置恰好在“注册成功”“注册失败”之前,这就意味着它很有可能和设定的密码有着一些联系。我们定位到其对应的代码区:

       通过分析上图所示的一段汇编代码,便可以确定:crackmepassword就是设定好的密码!带着这个结论,我们打开程序,随便输入用户名,在密码输入栏里输入crackmepassword,结果如下:

       可以看到破解成功。(通过x64dbg迅速找到设定好的密码进行破解)

方法三:使用nop覆盖分支跳转语句

       注意到程序的“注册成功”语句是出现在“注册失败”之前的,而jne crackme.401637是一个分支跳转语句。如果要使得我们无论输入的密码是什么,程序都弹出“注册成功”,那么只需要将jne crackme.401637删除或者覆盖即可。这里选择用nop覆盖。修改后的截图如下:

       现在我们运行程序,随便输入用户名和密码,结果如下:

       弹出“注册成功”,说明成功破解程序。修改后的程序保存为crackme2.exe。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值