CSAPP Lab2: 反汇编 二进制炸弹

逆向工程【二进制炸弹】

任务描述

“二进制炸弹包含若干个阶段,每个阶段需要输入特定的字符串,所有输入正确则炸弹被排除,否则……”

拆弹的任务也就是找出这些字符串将字符串记录到solution.txt文件中,用换行区别不同阶段的字符串,Linux环境下可按下列方式验证拆弹结果:
$ ./bomb solution.txt

主要方法

objdump反汇编与gdb调试。

分析流程

已知数据有编译好的二进制可执行文件bomb,也就是反汇编目标文件,以及bomb.c文件,用于辅助理解代码。

查看bomb.c可知程序利用phase_*函数(*为1~6) 检查输入字符串是否合法,不合法就引爆炸弹。

bomb.c没有给出phase的源码,我们实际的任务就是逆向出每个phase的检查规则,构造出合法字符串。

首先使用$ objdump -d bomb > bomb.s反汇编得到bomb的汇编文件,以下将逐个分析phase1-phase6。

phase1【字符串对比】

CSAPP Lab2: 反汇编 二进制炸弹_第1张图片
汇编段前三行申请了8字节栈空间,movl指令在高4字节存入了0x80499a8处的一份数据。随后的两条mov指令将我们提供的phase1的参数存入了栈的低4字节,紧跟着一条call指令,跳转到处,显然是在进行字符串对比。

通过分析我们可以得到,phase_1实际上是将输入参数与0x80499a8处存储的数据做对比。在汇编文件中,数据段的内容并没有包含,所以我们需要通过gdb断点输出该处的存储数据。
CSAPP Lab2: 反汇编 二进制炸弹_第2张图片
断点处输出可以得到0x80499a8处的数据,即phase_1的字符串答案I turned the moon into something I like to call a Death Star.

phase2【循环数字】

CSAPP Lab2: 反汇编 二进制炸弹_第3张图片
从8048bbe行可以看出,phase_2的执行与读取6个数字有关,那么输入也应该是6个数字。

从8048bc3、8048bf0、8048bf3行可以得到phase_2的执行,进行了3次循环,也就是6个输入数字进行了3次对比。

有一个误区是,一开始去分析了read_six_numbers段的汇编码,没有得到什么有用信息,由此可知后面对phase的分析,主要基于phase段的代码,其中涉及到的一些子操作只要按照字面意思理解即可。

分析循环语句中的8048bcc到8048bdd行,可以看到edx寄存器先从栈中读取了一个数字。而后eax寄存器在索引+3(8048bd6行)的情况下,也从栈中读取了一个数字。之后edx寄存器与eax寄存器进行了对比。

从已经分析到的信息可知,phase_2输入6个数字,对比只循环了3次,而对比的两个数字都在栈中(与phase_1不同)且下标相差3,可以猜测phase_2是将用户输入的6个数字中的前3个数字与后3个数字做了对比,下面通过gdb进行调试:
CSAPP Lab2: 反汇编 二进制炸弹_第4张图片
为了避免巧合,测试数据将数字设置成两组五位数,phase_2通过,证明phase_2确实是在对输入的数字进行索引加3

你可能感兴趣的:(逆向工程,CSAPP)