【BinaryBomb实验】计算机系统基础

这篇具有很好参考价值的文章主要介绍了【BinaryBomb实验】计算机系统基础。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验原理与内容

一个“binary bombs”(二进制炸弹,下文将简称为炸弹)是一个Linux可执行C程序,包含了7个阶段(phase1~phase6和一个隐藏阶段)。炸弹运行的每个阶段要求学生输入一个特定的字符串,若的输入符合程序预期的输入,该阶段的炸弹就被“拆除”,否则炸弹“爆炸”并打印输出 "BOOM!!!"字样。实验的目标是拆除尽可能多的炸弹层次。

每个炸弹阶段考察了机器级语言程序的一个不同方面,难度逐级递增: 

  1. 阶段1:字符串比较
  2. 阶段2:for循环
  3. 阶段3:switch分支
  4. 阶段4:递归函数
  5. 阶段5:数组元素按序访问
  6. 阶段6:链表
  7. 隐藏阶段:只有在阶段4的拆解字符串后再附加一特定字符串后才会出现(作为最后一个阶段)

为了完成二进制炸弹拆除任务,需要使用gdb调试器和objdump来反汇编炸弹的可执行文件,并单步跟踪调试每一阶段的机器代码,从中理解每一汇编语言代码的行为或作用,进而设法“推断”出拆除炸弹所需的目标字符串。这可能需要在每一阶段的开始代码前和引爆炸弹的函数前设置断点,以便于调试。

拆弹密码的输入分文两种模式。

模式1:正常手动输入,每次程序运行到某一阶段会停下来要求用户输入数据。这种方式比较原始,不推荐使用。如果使用这种做法,在程序调试到后期时,每次为了进入后期的断点位置都需要在之前的每一个阶段进行手动输入,极其浪费时间。

模式2:采用输入重定向。首先将答案文本写至一个.txt文本中,每个阶段的拆弹密码占一行。

在调试程序时直接使用输入重定向指令,例如(假设密码已被写入到之前的拆弹密码文本文件solution.txt中):

./bomb < solution.txt

通过执行以上指令即可直接根据屏幕输出来判断程序正确地进行了几个阶段或者在第几个阶段出现了错误。如果密码全部正确,提示结果如下图所示:

【BinaryBomb实验】计算机系统基础

过关前,要了解一下gdb的基本用法:

//编译一个测试程序,-g (可调试)
gcc -g test.c -o test
gdb -q test  //启动gdb;-q(不打印版本信息)
(gdb) list   //查看源码list;注意!默认10行,回车可继续查看
(gdb) run    //运行程序(简写r)
(gdb) b 10   //设置断点(格式:b 行号)例如:在第十行设断点
(gdb) info breakpoints   //显示断点信息
(gdb)quit    //退出
(gdb)layout regs  //进入UI
UI界面内:
(gdb)start   //开始
(gdb)c    //继续运行
(gdb)si    //单步执行
(gdb)p/x    //打印(print)
(gdb)x/s    //查看内存地址内容
(gdb)finish //结束当前函数

前提提醒:

1、每过完一关,就del本关的断点,去设置下一关的断点。 2、在未确定钥匙前,先随便输入一些字符串。

第一关:

 先执行以下代码:进入关卡

gdb bomb      //进入gdb调试器
b phase_1     //设置第一关断点
layout regs   //进入UI界面
start         //开始
run           //运行

由于现在不知道钥匙,先随便输入字符串,回车

使用si指令,单行执行;执行到光标停在callq <string_not_equal>,表示下一个要执行

【BinaryBomb实验】计算机系统基础

 由此看到上一行有 lea ....,%rsi;通过x/s  $rsi指令,查看内容,输入该内容就过关!

【BinaryBomb实验】计算机系统基础

 (注:用IDA可直接看到答案,IDA的用法搜一下就有)

第二关:

执行到callq<read_six_number>里面,lea 0x112a(%rip),%rsi,通过x/s $rsi命令,查看内容,得“需要输入6个数”

【BinaryBomb实验】计算机系统基础

可通过finish指令,跳出函数

第一个数要等于1

【BinaryBomb实验】计算机系统基础

 继续向下执行 由此,可得出第二个数为2

【BinaryBomb实验】计算机系统基础

【BinaryBomb实验】计算机系统基础 

此可以推断,后面的第4、5、6个数为:8、16、32

所以,第二关钥匙为:1、2、4、8、16、32

第三关:

 一样,先查看需要输入多少个数

【BinaryBomb实验】计算机系统基础

继续执行(这里写错了,应该是指:所输入值的个数小于等于1则爆炸,至少要2)

而第一个值不能超过7

【BinaryBomb实验】计算机系统基础

 继续向下执行jmpq  *%rax,跳转到跳转表上

【BinaryBomb实验】计算机系统基础

根据第一个值的不同,跳的位置不同!!!

【BinaryBomb实验】计算机系统基础

 执行结束后,通过界面可看到第二个值为4294966646(第一个值为:2)

【BinaryBomb实验】计算机系统基础

 最后还有个比较:【BinaryBomb实验】计算机系统基础

第四关: 

 第一步,一样,执行到lea 0x15e4(%rip),%rsi,通过x/s $rsi命令,查看到“%d %d”

【BinaryBomb实验】计算机系统基础

 %eax要等于2,(%rsp)输入的第一个值要≤14 (由此,可以得到取值范围)

【BinaryBomb实验】计算机系统基础

 执行到callq <func4>,调用函数内进行计算(递归),计算结束后pop出栈rbx的值->rax

【BinaryBomb实验】计算机系统基础

 计算所得的值 比较 0x13=19;第二个输入的值 比较 0x13=19

由此,可以得到第二个数为:19;第一个数则需要通过符合func4函数的计算;

我采用了穷举法进行得出…

【BinaryBomb实验】计算机系统基础

 第五关:

第一步,一样,需要输入6位

【BinaryBomb实验】计算机系统基础

执行到lea …,%rcx,通过x/16c $rcx可看到数组元素

【BinaryBomb实验】计算机系统基础

 经过运算,得到新的rdx为98“b”——>对应“m”

【BinaryBomb实验】计算机系统基础

 【BinaryBomb实验】计算机系统基础

 以此类推,所输入的6位字节,转换为新的

继续向下执行,可以得到%rsi钥匙“bruins”

【BinaryBomb实验】计算机系统基础

 继续执行,跳到strings_not_equal函数里,可以看到rdi与rsi进行访问以及比较。(rdi:为输入的值通过转换得到全新的值)rsi:钥匙

【BinaryBomb实验】计算机系统基础

【BinaryBomb实验】计算机系统基础

 最后通过test测试【BinaryBomb实验】计算机系统基础

 第六关:

 第一步,一样

执行到callq <six_numbers>,可以知道需要输入6个数

继续执行可以看到需要输入数值的范围,每个数-1后,不能超过5

【BinaryBomb实验】计算机系统基础

 继续跳转,执行后,可以看到需要输入的每个数值都不能相同

【BinaryBomb实验】计算机系统基础

 (此处重点是判断这6个数是否在减1后≤5,并且每个数值都不同)

 继续执行,行用7减每一个数,所得的数存到r12中

【BinaryBomb实验】计算机系统基础

 每个数都要比较,比较完6个数后跳转

【BinaryBomb实验】计算机系统基础 

跳转到重要部分,重排链表指针域

【BinaryBomb实验】计算机系统基础 

 执行完重排后,需要进行比较rax与rbx

 方法:通过x/6c $rax ;x/6c $rbx 命令,去查看双方每个阶段的值

 条件:rbx值≥rax

【BinaryBomb实验】计算机系统基础

 【BinaryBomb实验】计算机系统基础

 【BinaryBomb实验】计算机系统基础

 隐藏阶段:

【BinaryBomb实验】计算机系统基础

 【BinaryBomb实验】计算机系统基础

第7关: 

执行到mov (%rdi),%edx,可以看到值为36

【BinaryBomb实验】计算机系统基础

 继续执行,通过mov 0x8(%rdi),%rdi获得新的值,返回test上,再次进行比较

【BinaryBomb实验】计算机系统基础

 由此,我们可以确定32到8的范围,继续执行【BinaryBomb实验】计算机系统基础

 最后,继续出栈返回(只有前两次才需要相加,最后一次直接出栈返回值rax)总共进行了3次sub $0x8,%rsp 

 要求rax的值等于2【BinaryBomb实验】计算机系统基础

由此,可确定范围只能在36-8之间,再通过测试可知,取36-8的中间值即可

所以,fun7的钥匙为22

 (穷举也行)

实验总结:(cv)

通过此次实验,增强对于程序的机器级表示、汇编语言、调试器和逆向工程等方面原理与技能的掌握。掌握使用gdb调试器和objdump来反汇编炸弹的可执行文件,并单步跟踪调试每一阶段的机器代码,从中理解每一汇编语言代码的行为或作用,进而设法“推断”出拆除炸弹所需的目标字符串。需要拆除尽可能多的炸弹。

为了完成二进制炸弹拆除任务,需要使用gdb调试器和objdump来反汇编炸弹的可执行文件,并单步跟踪调试每一阶段的机器代码,从中理解每一汇编语言代码的行为或作用,进而设法“推断”出拆除炸弹所需的目标字符串。这可能需要在每一阶段的开始代码前和引爆炸弹的函数前设置断点,以便于调试。拆弹密码的输入分文两种模式。

在调试程序时直接使用输入重定向指令,例如(假设密码已被写入到之前的拆弹密码文本文件solution.txt中):

./bomb < solution.txt

通过执行以上指令即可直接根据屏幕输出来判断程序正确地进行了几个阶段或者在第几个阶段出现了错误。文章来源地址https://www.toymoban.com/news/detail-467066.html

到了这里,关于【BinaryBomb实验】计算机系统基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机组成原理实验——一、ALU实验

    1.掌握ALU模块的组成和接口,理解ALU的功 能。 2.通过编程调用ALU模块计算斐波那契数。 3.掌握Verilog中多模块编程方法和实现。 用 Verilog 设计一个算术运算单元 ALU,采 用纯组合逻辑设计,32bit 宽。 利用该 ALU 完成斐波那契数 f(n),其中 2n16。 可选 –改成3段式实现(已实现)

    2023年04月22日
    浏览(49)
  • 计算机组成原理实验 实验一 存储器实验

    目录 实验1  存储器实验 一、实验目的 二、实验原理 三、实验电路 四、实验步骤 五、实验数据分析 六、思考题 1.熟悉DVCC计算机组成原理实验机的结构,掌握其主要操作。 2.掌握静态随机存储器RAM工作特性。 3.掌握静态随机存储器RAM的数据读写方法。 4.能够运用静态随机存

    2023年04月18日
    浏览(65)
  • 计算机组成原理实验——实验1 运算器实验

    (1)掌握算术逻辑运算单元的工作原理。 (2)熟悉简单运算器的电路组成。 (3)熟悉4位运算功能发生器(74LS181)的算术、逻辑运算功能。 (1)做好实验预习,看懂电路图,熟悉实验中所用芯片各引脚的功能和连接方法。 (2)按照实验内容与步骤的要求,认真仔细地完

    2024年02月12日
    浏览(41)
  • 计算机组成原理实验——三、存储器实验

    1.掌握存储器的工作原理和接口。 2.掌握存储器的实现方法和初始化方法。 3.掌握RISC-V中存储器的存取方式。 1.利用vivado IP核创建64 32的ROM,并在 系数文件中设置数据为123489ab; 2.利用vivado IP核创建64 32的RAM,并在 其上封装一个模块,使得其能完成risc-v 的load/store指令功能。

    2024年02月04日
    浏览(55)
  • 计算机组成原理实验——二、寄存器实验

    1.掌握寄存器堆的工作原理和接口。 2.掌握寄存器堆的实现方法。 3.掌握寄存器堆在微处理器中承担的功能。 设计一32*32bit 的寄存器文件,即32 个 32 位的寄存器文件(寄存器组) –具备两组读端口及一组写端口; –通过读端口可从0~31 号的任意地址读取 数据; –通过写端口可

    2024年02月06日
    浏览(48)
  • 计算机组成原理实验(logisim)

      文章目录 目录 文章目录 实验一:Logisim软件的使用 实验二:数据的表示 1.汉字的编码实验: 实验三:运算器组成实验 1.多位串行加法器和多位可控加减电路的设计 2.快速加法器的设计 3.多位算术逻辑单元ALU设计 4.阵列乘法器设计 4.阵列除法器设计 实验四:存储系统综合实

    2024年02月03日
    浏览(54)
  • Hust计算机组成原理实验

    点击 资源栏-Gates 选项中的门电路,即可在右边画布添加 添加成功后如下: 引脚可在菜单栏中找到 也可在 资源栏-Wiring 中找到 添加入画板后,可在属性表中修改面向方向 最后得到如下图 注:方形为输出,圆形为输入。 使用 光标 连接两个结点即可 灰色:线的位宽未知。发

    2024年02月04日
    浏览(47)
  • 【计算机组成原理实验】CPU设计

    设计并实现一个简单处理器模型完成功能验证。 ASUS VivoBook + Windows10 + Vivado2019.2,语言为 Verilog HDL。 1. 处理器应基于 6.5 指令集或 MIPS 指令集或 RISCV 指令集进行设计或自行设计指令集。 2. 处理器的控制器结构应为微程序控制器或集硬布线控制器。 3. 处理器需支持算术运算、

    2024年02月08日
    浏览(47)
  • 计算机组成原理 存储器实验

    计算机组成原理实验环境 掌握静态随机存储器 RAM 的工作特性。 掌握静态随机存储器 RAM 的读写方法。 做好实验预习,熟悉 MEMORY6116 芯片各引脚的元器件的功能和连接方式,熟悉其他实验元器件的功能特性和使用方法,看懂电路图。 按照实验内容与步骤的要求,认真仔细地

    2024年02月02日
    浏览(56)
  • 计算机组成原理 累加器实验

    计算机组成原理实验环境 理解累加器的概念和作用。 连接运算器、存储器和累加器,熟悉计算机的数据通路。 掌握使用微命令执行各种操作的方法。 做好实验预习,读懂实验电路图,熟悉实验元器件的功能特性和使用方法。在实验之前设计好要使用的微命令,填入表 6-2 、

    2024年02月06日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包