二进制炸弹任务描述
"二进制炸弹包含若干个阶段,每个阶段需要输入特定的字符串,所有输入正确则炸弹被排除,否则….."
拆弹的任务也就是找出这些字符串将字符串记录到solution.txt文件中,用换行区别不同阶段的字符串,
Linux环境下可按下列方式验证拆弹结果:
主要方法
objdump反汇编与gdb调试。
分析流程
已知数据有编译好的二进制可执行文件bomb,也就是反汇编目标文件,以及bomb.c文件,用于辅助理解代码。
查看bomb.c可知程序利用phase_*函数(*为1~6) 检查输入字符串是否合法,不合法就引爆炸弹。
bomb.c没有给出phase的源码,我们实际的任务就是逆向出每个phase的检查规则,构造出合法字符串。
首先使用
反汇编得到bomb的汇编文件,
以下将逐个分析phase1-phase6。
phase1【字符串对比】
<phase_1>汇编段前三行申请了8字节栈空间,
movl指令在高4字节存入了0x80499a8处的一份数据,随后的两条mov指令将我们提供的phase1的参数存入了栈的低4字节,
紧跟着一条call指令,跳转到<strings_not_equal>处,显然是在进行字符串对比,
通过分析我们可以得到,phase_1实际上是将输入参数与0x80499a8处存储的数据做对比,
在汇编文件中,数据段的内容并没有包含,所以我们需要通过gdb断点输出该处的存储数据,
断点处输出可以得到0x80499a8处的数据,即phase_1的字符串答案I turned the moon into something I like to call a Death Star.
phase2【循环数字】
从8048bbe行可以看出,phase_2的执行与读取6个数字有关,那么输入也应该是6个数字。
从8048bc3、8048bf0、8048bf3行可以得到phase_2的执行,进行了3次循环,也就是6个输入数字进行了3次对比。

最低0.47元/天 解锁文章
1832

被折叠的 条评论
为什么被折叠?



