拆解二进制炸弹
一、实验目的
1.理解C语言程序的机器级表示。
2.初步掌握GDB调试器的用法。
3.阅读C编译器生成的x86-64机器代码,理解不同控制结构生成的基本指令模式,过程的实现。
二、 实验环境
SecureCRT(10.105.222.110)
Linux
Objdump命令反汇编
GDB调试工具
。。。。。
三、实验内容
登录bupt1服务器,在home目录下可以找到Evil博士专门为你量身定制的一个bomb,当运行时,它会要求你输入一个字符串,如果正确,则进入下一关,继续要求你输入下一个字符串;否则,炸弹就会爆炸,输出一行提示信息并向计分服务器提交扣分信息。因此,本实验要求你必须通过反汇编和逆向工程对bomb执行文件进行分析,找到正确的字符串来解除这个的炸弹。
本实验通过要求使用课程所学知识拆除一个“binary bombs”来增强对程序的机器级表示、反汇编代码、调试器和逆向工程等方面原理与技能的掌握。 “binary bombs”是一个Linux可执行程序,包含了5个阶段(或关卡)。炸弹运行的每个阶段要求你输入一个特定字符串,你的输入符合程序预期的输入,该阶段的炸弹就被拆除引信;否则炸弹“爆炸”,打印输出 “BOOM!!!”。炸弹的每个阶段考察了机器级程序语言的一个不同方面,难度逐级递增。
为完成二进制炸弹拆除任务,需要使用gdb调试器和objdump来反汇编bomb文件,可以单步跟踪调试每一阶段的机器代码,也可以阅读反汇编代码,从中理解每一反汇编代码代码的行为或作用,进而设法推断拆除炸弹所需的目标字符串。实验2的具体内容见实验2说明。
四、实验步骤及实验分析
1准备过程:
1.1.通读bomb课件,明白实验大致要求
1.2.查找CSAPP书本、CSAPP课件、gdb使用说明,明白各类操作符含义
1.3.回顾上次实验,复习gdb中设置断点、查找寄存器等各项操作
2启动bomb、断点设置
2.1.登录、查找分配到的bomb(bomb265)。
2.2.解压、读取bomb265。
2.3.启动gdb,查看第一关反汇编代码,确定引爆函数explode_bomb并在其设置断点,运行。
3.第一关
3.1. 查看关卡的反汇编代码
3.2. strings_not_equal——输入为字符串;
x/s查看前一句地址内容得对应字符串“Each successive processor has been designed to be backward compatible.”
4.第二关
4.1. 查看关卡的反汇编代码
4.2. read_six_numbers——输入为六个数字;
cmpl $0x1,(%rsp)——第一个数和1比较;
add %eax,%eax——eax = eax *2;
cmp %eax,0x4(%rbx)——比较此数两倍和后一个数;
jne 0x400f7a
由上述语句可知这是一个首项为1,公比为2的等比数列,故答案为“1 2 4 8 16 32”。
5.第三关
5.1. 查看关卡的反汇编代码
5.2.查看输入格式,输入为两个整数;
5.3.确定第一个数的取值范围为大于1小于7的整数;
5.4. jmpq *0x402720(,%rax,8)——switch语句;
尝试第一个数为“3”,经计算得“-70”;
5.5. cmp 0x4(%rsp),%eax——比较case运算后的数eax与第二个数是否相等;
故其中一组可行的答案为“3 -70”。
6.第四关
6.1. 查看关卡的反汇编代码
6.2.查看输入格式,输入为两个整数;
6.3. cmpl $0xe,(%rsp)——第一个数小于等于14;
callq 0x401073 ——调用函数“func4”;
cmp $0x4,%eax——“func4”运算结果要等于4;
6.4. 查看函数“func4”的反汇编代码,发现是一个递归函数;
6.5.编写逻辑相同的C语言程序,输入小于等于14的整数,查看输出结果是否为4;
经尝试,一组可能的答案是“2 4”。
7.第五关
7.1. 查看关卡的反汇编代码
7.2. callq 0x4013d9
cmp $0x6,%eax——输入的是6 个字符;
and $0xf,%edx——取字符后四位;
movzbl 0x402760(%rdx),%edx——将edx后四位作为0x402760字符数组的索引值;
add $0x1,%rax——循环变量加1;
cmp $0x6,%rax 、 jne 0x401150
callq 0x4013f7
7.3.读取字符串
7.4.“flyers”的各字母位于“maduiersnfotvbyl”的9,15,14,5,6,7位,对比ASCII码表,取一组ASC值化为二进制低四位符合的字符,如“IONEFG”为一组可能的答案。
8第六关
8.1查看关卡的反汇编代码
8.2 callq 0x401701
sub $0x1,%eax;cmp $0x5,%eax——输入的数小于等于6
add $0x4,%r13(更新r13)jmp 0x4011d1
mov $0x7,%edx;sub (%r12),%eax;——将栈中的6个值(假设为x)变为7-x
mov $0x6042f0,%edx——查看edx内存
经查证,edx储存结构为链表
cmp %rax,%rsi;jne 0x401274
cmp %eax,(%rbx)——比较
循环比较——要使新的链表中前一个节点存放的数据值的低4字节都大于后一个节点的值
故参照链表按由大到小的排列依次是:2 3 6 5 4 1
因为x = 7 – x,所以答案是:5 4 1 2 3 6
9秘密关卡
9.1查看phase_defused寻找秘密关卡入口
mov $0x402a07,%esi
mov $0x6048b0,%edi
mov $0x402a10,%esi
lea 0x10(%rsp),%rdi
查看对应字符串
对应在第四关
9.2查看关卡的反汇编代码
9.3cmp $0x3e8,%eax——加入一行数据,它是一个小于等于1001的数值
callq 0x4012cf ——调用fun7
cmp $0x1,%eax——函数返回后令返回值eax与0x1做比较,如果相等则跳过引爆代码,故应返回1
mov $0x604110,%edi——查看edi内存
经查证,edi储存结构为二叉树,每个节点第1个8字节存放数据,第2个8字节存放左子树地址,第3个8字节存放右子树位置。
mov (%rdi),%edx
cmp %esi,%edx
jle 0x4012eb
mov 0x8(%rdi),%rdi——将rdi移到它的左子树的位置
cmp %esi,%edx
je 0x401308
mov 0x10(%rdi),%rdi——将rdi移到它的右子树的位置
即:edi指向一个树的节点,比较edi节点的值与输入的值;若相等,返回0;若大于,rdi移至左子树,返回2 * rax;若小于,rdi移至右子树,2 * rax + 1。因需返回1,故应为“0x2d”即“45”。
五、总结体会
1实验过程中遇到的问题及解决方法:
关卡四递归运算复杂,刚开始手算穷举计算量太大且易算错,后用C语言编程运算;
关卡五找出对比串后不知道比较什么,后经提醒发现有取后四位与ASCII码比较的操作;
2过关或挫败的感受
更深入地了解了汇编操作符的用法,对CSAPP书上内容有了更深的理解;
提高了自学能力,很多操作符用法在书上没有提到,需要借助gdb使用说明查找和了解尝试;
3实验投入的时间和精力
一下午一晚上到凌晨10+h;
4意见和建议
建议课件增加相关内容,特别是关于操作符的讲解;
建议课堂增加相关例子,以免不够熟悉无从下手。
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' |
‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" |
“Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash |
– is en-dash, — is em-dash |
一个具有注脚的文本。1
Markdown将文本转换为 HTML。
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
我们依旧会支持flowchart的流程图:
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎