BUPT软件安全实验二

1.目标

(1)通过对程序输入的密码的长度、内容等修改用ollydbg来验证缓冲区溢出的发生。

(2)完成淹没相邻变量改变程序流程实验。

(3)完成淹没返回地址改变程序流程实验。

在这一过程中,我需要详述程序的修改过程,在实验的关键处进行截图说明,并绘制程序修改原理的图示。

(4)解决思考题,即:在不修改源代码的情况下,修改OverFlow_EXE程序的流程,通过弧注入的方式,不植入可执行代码,让其调用MessageBoxA函数(函数地址:0x77E23D68)弹出对话框(对话框显示bupt),之后调用ExitProcess函数(函数地址:0x77E7B0BB)退出进程。

2.测试步骤与结果

(1)进入虚拟机,使用打开stackvar.c文件夹中的main.cpp并分析:

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

(2)通过VC6将main.cpp的内容编译成工程:

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

        填写多位密码(15个6),可以看到提示出现了溢出错误:

(4)在ollydbg中运行刚才生成的exe文件:

        首先定位到代码段的strcpy语句,并在此次下断点:

        然后运行程序,任意输入较短的错误的密码(这里输入123):

        接着单步执行程序,在strcpy函数执行后,查看缓冲区的内容:

        可以看到,此时右下角的两个地址的内容均为“123”。

        在0012FB18查看一下,确实为“123”:

        重新运行程序,这一次输入qqqqqqqqrst(即能使缓冲区溢出的密码),并在运行strcpy函数后查看缓冲区的内容:

        从0012FB18到0012FB20可以看到,由于我们填写的字符串超过位数,已经将邻接的变量覆盖了。

(5)尝试另一种打开文件调试的方法:

        当我输入qqqqqqqq后,程序会自动关闭,难以看到提示信息。此时可以用VC来启动这个工程并运行,接着打开ollydbg,选择文件->附加->选择到要调试的进程,这样就可以看到最后的提示信息了:

(6)验证补码的问题

        当我们输入的密码小于1234567时,strcmp会返回-1,而-1是用补码表示的。而我们如果输入01234567这8位字符串,末尾的null只是淹没-1补码的后两位,变成0xFFFFFF00,程序运行是便不会判断“密码正确”。

        下面在ollydbg中验证以上问题。输入01234567并运行strcpy函数后,观察右下角缓冲区中的数据:

        可以看到,此时0012FB20处的数据的确为FFFFFF00,根据栈溢出的原理判断可知,程序运行后将不会判断该输入为正确密码:

(7)淹没返回地址

        前面进行的是淹没邻接变量改变程序的实验,下面进行淹没返回地址改变程序的实验。

        变量的排列顺序图如下:

        通过分析上图可以发现,只需要先放置16个字符串,然后接下来的4个字节就能够淹没返回地址,达到控制返回地址的目的。

        在VC6中新建工程和文件,并将overflowret中的main.cpp的内容复制进新建的文件中并运行:

        在Debug文件夹下新建password.txt文件:

        在ollydbg中打开程序,并在跳转条件处(0040111E处)下断点:

        分析可得,如果文件中的密码正确的话,程序会跳转到0040112F。那么我们只需将返回地址修改为0040112F,就可以使得程序判断密码正确。

使用UltraEdit打开password.txt文件,并选择2进制编辑模式,前16个字节输入4321432143214321:

        然后再17-20字节上填写地址0040112F并保存文件:

        在ollydbg运行程序,可以看到提示密码正确:

        但是之后由于我们修改了返回地址,导致栈平衡出错,程序崩溃跳出:

        至此,淹没相邻变量改变程序流程实验、淹没返回地址改变程序流程实验均完成。

3.测试结论

        通过这次实验,我对程序堆栈间的调用关系有了更清晰的了解,也熟悉了堆栈溢出的基本原理,并实际动手练习了堆栈溢出利用方法,收获颇丰。

        同时我意识到,栈溢出对程序运行的安全性有很大的威胁,如果不对栈进行保护,只要系统中存在栈溢出漏洞,即可令攻击者通过非正当方法获取操作权限。因此,需要对栈中保存数据的可执行权限做严格的管理,并且系统要能判断栈溢出从而采取相应的保护措施。

        通过这次测试,我对软件安全有了更深刻的认识,也意识到软件面临着极大的安全隐患,需要我们去保护和守卫。而要达到这一点,我们要去主动学习更多的知识、熟悉更加强有力的工具。

4.思考题

        在不修改源代码的情况下,修改OverFlow_EXE程序的流程,通过弧注入的方式,不植入可执行代码,让其调用MessageBoxA函数(函数地址:0x77E23D68)弹出对话框(对话框显示bupt),之后调用ExitProcess函数(函数地址:0x77E7B0BB)退出进程。

(1)首先将overflow_exe对应的main.cpp中的内容复制并粘贴到新建立的工程文件中:

(2)在Debug文件夹中新建password.txt,并暂时写入1234567作为密码:

(3)在ollydbg中打开程序,并在memcpy函数处下断点:

(4)运行程序至断点处,再步过函数运行memcpy函数,此时观察右下角:

        可以看到保存返回地址的地址为0012FB24,向下步过可以看到字符存储地址为0012FAF0:

        两个地址之间的距离为13*4,其为需要填充的长度,MessageBoxA地址为0x77E23D68,ExitProcess地址为0x77E7B0BB,输出参数为bupt,由此可以通过UltraEdit编写password.txt文件,在其中输入payload。弧注入的栈结构如下:

        根据栈结构编写的payload:

        编辑好password.txt中的内容后,运行程序即可看到窗口弹出:

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值