拆解二进制炸弹

一、实验目的

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 (外循环)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意见和建议

建议课件增加相关内容,特别是关于操作符的讲解;

建议课堂增加相关例子,以免不够熟悉无从下手。

带尺寸的图片:

居中的图片:

居中并且带尺寸的图片:

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

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

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

// An highlighted block

var foo = 'bar';

生成一个适合你的列表

项目

项目

项目

项目1

项目2

项目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)=(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.

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

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文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,

继续你的创作。

注脚的解释 ↩︎

二进制拆弹实验详解linux,拆解二进制炸弹相关推荐

  1. 二进制拆弹实验详解_Population Count算法-求二进制数中1的个数

    所谓Population Count算法,即是指计算一个二进制数中1的个数的算法.具体来说,就是任意给定一个无符号整数N,求N的二进制表示中1的个数,比如N = 5(0101)时,返回2:N = 15 ...

  2. 包区别 版本_详解Linux下二进制包、源代码包、rpm包区别与联系

    概述 有时去官网下载文件,因为很多格式,有时总会混淆,不知道哪个是需要的包,今天抽空做个总结,区别一下Linux的二进制包.源代码包.rpm包. 1.二进制包介绍(bin) 二进制包里面包括了已经经过 ...

  3. mysql5.7.11 linux_CentOS 7 中以命令行方式安装 MySQL 5.7.11 for Linux Generic 二进制版本教程详解...

    MySQL 目前的最新版本是 5.7.11,在 Linux 下提供特定发行版安装包(如 .rpm)以及二进制通用版安装包(.tar.gz).一般情况下,很多项目都倾向于采用二进制通用安装包形式来进行安 ...

  4. 详解FTP服务完成Linux和WIN10之间的信息传输(实验详解)

    详解FTP服务完成Linux和WIN10之间的信息传输(实验详解) 一.FTP简介 1. FTP服务--用来传输文件的协议 2.端口 3.数据连接模式 二.相关配置 1.安装FTP服务 2.设置匿名用 ...

  5. 详解 Linux环境中DHCP分配IP地址(实验详解)

    Linux中DHCP小实验详解 一.DHCP中继概述 二.DHCP在linux系统中的相关配置 1.配置DHCP服务器 2.设置全局配置参数 3.subnet网段声明 4.host主机声明 三.实验例 ...

  6. mysql二进制方式_MySQL数据库之MySql二进制连接方式详解

    本文主要向大家介绍了MySQL数据库之MySql二进制连接方式详解 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 使用mysql二进制方式连接 您可以使用MySQL二进制方式进 ...

  7. 十进制与二进制之间转换详解

    文章目录 十进制与二进制之间转换详解 (一)十进制数转二进制数 1.1 十进制正整数转二进制 1.2 十进制负整数转二进制 1.3 十进制小数转二进制数 (二) 二进制数转成十进制数 2.1 二进制整 ...

  8. 汇川小型PLC梯形图编程系列教程(七):数值存储与二进制数据知识详解

    原文链接:汇川小型PLC梯形图编程系列教程(七):数值存储与二进制数据知识详解 PLC数据存储原理简介 H123U小型PLC内部采用的是32位的处理器,PLC中的数据处理和电脑中的数据处理基本是一致的 ...

  9. find linux 目录深度_浪里淘沙,详解Linux系统中Find命令的实用技巧

    知了小巷:浪里淘沙,详解Linux系统中Find命令的实用技巧. 啊哈,找到了! 当我们需要在Linux系统上定位某个文件或目录时,find命令通常是必备之选. 它使用起来非常简单,但有许多不同的可选 ...

最新文章

  1. java商城pom,使用maven创建Java购物商城系统的common工程
  2. 如何在 Linux 下乾坤大挪移?
  3. LOL手游超燃测试好评如潮,没拿到资格不用急,期待一手不删档
  4. 封装性的基本使用练习2
  5. mybatis select 返回值long null_Mybatis框架(二)
  6. 2021泰安市地区高考成绩排名查询,2021年山东高考成绩排名及一分一段表
  7. unicode编码java_JAVA转化Unicode编码
  8. uni-app 基于 Promise 的 request 请求封装
  9. FPGA STA(静态时序分析)
  10. [latex]参考文献格式
  11. Ps钢笔工具抠图、更换背景及边缘优化步骤
  12. 绩效评估常见指标和方法
  13. 高德地图API POI分类编码表(mysql版)
  14. linux下pip升级
  15. 普乐蛙5d飞行影院5d动感影院体验馆设备7d多人互动影院
  16. NFine+Oracle+EF错题集
  17. Zookeeper原理及实战开发-余强-专题视频课程
  18. 很多人认为网站58同城上市是及格
  19. Despair and Despair
  20. android平板f100,2C2A 100W大功率,SlimQ F100氮化镓充电器登陆众筹平台

热门文章

  1. python求二维数组的鞍点_C语言程序,找出一个二维数组的鞍点。
  2. Excel中查找比对VLOOKUP()函数的使用方法一
  3. angelababy机器人唱_Angelababy压轴亮相《机器人争霸》 变身女战神
  4. 艾灸是不是真那么神奇?
  5. double保留两位小数的方法
  6. java实现客户端脚本录制_(二)appium-desktop录制脚本二次开发,生成我司自动化脚本...
  7. 涨薪神作,阿里内部火爆的实战文档和搭建项目笔记,你还怕没有项目可做吗
  8. 【原创】Python 极验滑块验证
  9. mt4下载和安装好后如何使用呢
  10. antd走马灯切换到相应图片