拆解二进制炸弹

拆解二进制炸弹
一、实验目的
1.理解C语言程序的机器级表示。
2.初步掌握GDB调试器的用法。
3.阅读C编译器生成的x86-64机器代码,理解不同控制结构生成的基本指令模式,过程的实现。
二、 实验环境

  1. SecureCRT(10.105.222.110)

  2. Linux

  3. Objdump命令反汇编

  4. GDB调试工具

  5. 。。。。。
    三、实验内容
    登录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 (外循环)jle 0x4011f2 (内循环)——限制读入的6个数必须小于等于6并且互不相等
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意见和建议
建议课件增加相关内容,特别是关于操作符的讲解;
建议课堂增加相关例子,以免不够熟悉无从下手。

Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

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

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。1

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. 注脚的解释 ↩︎

你可能感兴趣的:(拆解二进制炸弹)