二进制炸弹实验(持续更新)
一、前期准备
首先,既然这是CSAPP这本书上的实验,我们就得想办法找到书上的实验素材,不能随便自己编炸弹。这里课本上给了一个卡内基梅隆大学的edu网址csapp.cs.cmu.edu,然而,防火墙阻挡了我们的脚步。这里给大家两种解决思路:
(一)多费点时间精力,CSDN博客园上有少量博主曾在博客里共享过CSAPP的实验资源,例如这一个,亲测可下载:
(二)直接选择科学上网工具,搭梯子即可。
因为二进制炸弹实验网上有很多破解教程,所以写这个炸弹素材的人就很坏,我发现他隔几个月就会发布一版更新炸弹,答案完全不同、解题思路变幻多端。我下载了最新版的炸弹,但目前只破解出了最简单的第一环节(一共六个环节),这篇博客会持续更新的。
二、实验过程
二进制炸弹实验主要考察的就是对反汇编代码的理解能力。题中给出了一个二进制文件(可执行文件),共6个关卡,每关要输入一个密码才能过关,就像解谜游戏一样,还是很有意思的,同时对于程序(函数,返回值,堆栈的组织)如何运行的有更深的理解。
破解唯一可用的线索就只有这个二进制文件了。这题是对于反汇编能有更深入练习,加上还能熟悉gdb,objdump这类调试工具和反汇编工具。每一关的考察点也是由浅入深。
最近娄老师让我们写过的一篇gdb调试堆栈的博客也能更好地帮助我们""
好了,下面进入gdb调试界面开始拆弹把。
在这里对我们提出了警告,题目很调皮。
没有输入拆弹密钥任意往下执行,果然爆炸了。从头再来吧。
我们先反汇编一下这个二进制文件的第一部分:
密钥应该藏在哪里呢?
我们注意看一下地址0x08048b3b,就是在这一步调用(call)引爆了炸弹<explode_bomb>。
可以看到0x8048b22和0x8048b27指令中分别放入了两个字符串,一个在地址0x8049678中,另一个在0x8(%ebp)中。
而0x8(%ebp)是函数phase_1的参数,而0x08048b2a很明显是在判断上面push的两个字 符串是否相等。
所以依此可以判断0x8(%ebp)的内存地址中的值是我们输入的字符串,而0x8049678则可能是程序中硬编码的一个字符串。
那么,找到这个内存地址中的字符串便能解决问题了。
这时候还是要用到gdb来查看内存和寄存器终的值,在这里我们在0x8048b22处设个断点,然后打印0x8049678地址中的值。
解决了!赶快输进去这个拆弹密码试试,第一个炸弹被排除啦。
这是另一个版本的炸弹,第一环节很像,拆弹结果是这样。
三、问题与解决
暂时还没有,有了再写嘻嘻~