一、实验目的
通过二进制炸弹实验,熟悉 x86汇编语言,学习使用反汇编工具objdump以及gdb调试工具。

二、实验内容
根据序号表得到一个二进制炸弹:bomb_3。该炸弹需要接收几组输入。每一关都要输入正确的密码,才可以通过,否则炸弹爆炸。通过对炸弹进行反汇编得到相应的反汇编文件。阅读反汇编代码,根据代码之间的内部逻辑,找到相应的通关密钥,即可过关。

三、实验环境
本实验在 Linux 操作系统(kali虚拟机)中完成。
需要用到的工具包括 gdb,objdump,make。


文章目录

  • 第一关 Phase_1
  • 第二关 Phase_2
  • 第三关 Phase_3
  • 第四关 Phase_4
  • 心得体会
  • 问题及反思

第一关 Phase_1

把断点设置在phase_1,然后运行(r)

ca2行调用<strings_not_equal>,判断输入的字符串与程序内部某个字符串是否相当
ca7行比较%eax和 %eax中的内容
反汇编(disas)得到如图所示

test指令:若为0则字符串相等跳转到<+30>;否则,跳转到explode_bomb函数,程序爆炸。

<+4>行中lea指令:用来将一个内存地址直接赋给目的操作数
将0x5555556020a0地址传递给rsi然后进行比较
猜测0x5555556020a0<unique_str>处的数据是程序内置的正确答案
查看(x/s)

进入<strings_not_equal>比较用户输入的字符串rsp和esi处的字符串是否相等,输入验证

第一关通过

第二关 Phase_2

将断点设置在phase_2,运行

<+24>行call指令<read_six_numbers>
进入函数查看(disas read_six_numbers)

<+41>调用scanf函数,读取输入的字符串
查看<+29>fmt_six_num

格式化字符串,即本关要求输入六个十进制整数,并与程序设置答案对比。
分析phase_2

猜测<magic_number>0x555555602080 存放程序设置答案

109 2ec 56 2a5 30d 143 转化为十进制265 748 86 677 781 323
第二关通关

第三关 Phase_3

将断点设置在phase_3

同样调用了sscanf,读取输入的数字后进行比较跳转

由此判断输入两个整数,再分析对输入的数的要求

<+40>cmp指令:jle输入的个数≤1跳转爆炸
<+45>cmpl指令:js输入的数<0跳转爆炸
<+51>cmpl指令:jg(有符号)输入的数>7跳转爆炸
<+57>cmpl指令:ja(无符号)输入的数>7跳转爆炸
下面有8种类似的结构:

以上均为将rsp保存到eax中,如果不等,则跳转爆炸
两段代码中间衔接处:

查看<+70> lea指令 把给rip加上偏移量传递到eax中
汇编代码中是这样写的

猜测为跳转表的索引值
如switch的索引list[0]可以取0,1,2,3,4,5,6,7以及default
以list[0]为例,真实的代码存放在0x555555602060后连续几位对应的实际代码地址

依次为8组对应值,一下任意一组均为答案。

第三关通关

第四关 Phase_4

将断点设置在phase_4,反汇编结果如下图

注意到同样有scanf函数

首先查看要求输入数据的格式

要求输入1位整数,继续分析反汇编代码

<+47>将跳转到函数,下一步查看<+63>该函数,反汇编结果如图所示

发现func4中仍有func4,猜测为递归函数

func4(n)=func4(n-1)+func4(n-2)

<+0>显示终止递归的条件:edi≤1,即传入func4的参数小于1时
回到phase_4主体部分

<+68>行显示:调用后,如果eax中的值≠0x37(十进制转化为55),则爆炸。
即递归函数最终返回值应为55。
编写递归函数如下

#include<iostream>
using namespace std;
int func4(int i)
{if(i<=1)return i == 0? 0:1;return func4(i-1) + func4(i-2);
}int main()
{int num[10];int result[10];for(int i=1;i<=10;i++){num[i-1]=i;result[i-1]=func4(i);}for(int j=0;j<10;j++){cout<<"第"<<num[j]<<"项:"<<result[j]<<endl;}return 0;
}

输出结果如下图

已知程序设定默认项为1,所以当传入参数为9时,输出结果为55。
至此,phase_4通关。

实验结束。

心得体会

第一关是看了教辅的演示,所以刚开始拆第一关更多的是新奇,看着一条条汇编语句也不是很熟悉但是充满了好奇。初步学会了查看内存内容与判读那函数的返回值,对后续的拆弹过程起到引路的作用。第二关反汇编工具也都不太会用,对着百度查各个指令的意思,到最后也看不懂到底是说了些什么,后来没有办法就用gdb的ni指令一条一条的走,看怎么执行。后续两关稍微熟悉了一点,但是具体各种栈的操作和寄存器的变化还是不能很清楚。

问题及反思

(1)本次实验用到的基础命令
objdump -d bomb >bomb.s//将反汇编代码放在bomb.s文本中方便查看
gdb bomb //用gdb调试器调试代码
break + 行号//设置对应行号为断点
break + 函数名称//设置对应函数为断点
info break// 可以查看断点信息
delete + 断点编号//删除对应编号的断点
clear + 行号//删除对应行号断点
delete + (编号起点-编号终点)//删除起点和终点的所有断点(包括起点和终点)
disable + 断点编号//可以禁用断点
run //试运行代码
info x //查看寄存器
disas phase_1 //查看第一个炸弹的汇编代码
x/s 0x402400 //查看对应地址存放的内容 找到解题的线索
x /nfu addr //检测内存值, n 查看几个内存单元 f进制显示 u显示单字节双字节等
quit //退出
print $eax //打印寄存器
I reg //显示所有寄存器值

(2)本次实验涉及到跳转指令较多,故作总结
JE //等于则跳转JNE ;不等于则跳转
JZ //为 0 则跳转JNZ ;不为 0 则跳转
JS //为负则跳转JNS ;不为负则跳转
JC //进位则跳转JNC ;不进位则跳转
JO //溢出则跳转JNO ;不溢出则跳转
JA //无符号大于则跳转JNA ;无符号不大于则跳转
JAE //无符号大于等于则跳转JNAE ;无符号不大于等于则跳转
JG //有符号大于则跳转JNG ;有符号不大于则跳转
JGE //有符号大于等于则跳转JNGE ;有符号不大于等于则跳转
JB //无符号小于则跳转JNB ;无符号不小于则跳转
JBE //无符号小于等于则跳转JNBE ;无符号不小于等于则跳转
JL //有符号小于则跳转JNL ;有符号不小于则跳转
JLE //有符号小于等于则跳转JNLE ;有符号不小于等于则跳转
JP //奇偶位置位则跳转JNP ;奇偶位清除则跳转
JPE //奇偶位相等则跳转JPO ;奇偶位不等则跳转

(3)本次实验遇到的问题
感觉比较难理解的就是几种寻址方式:
① 直接寻址
② 寄存器间接寻址
③ 寄存器相对寻址
④ 基址变址寻址
⑤ 相对基址变址方式
对一些指令操作的内容找不到正确的内存地址,导致反复调试,耗费了很长的时间。

CSAPP实验二——二进制炸弹bomb相关推荐

  1. CSAPP_实验二 拆炸弹 汇编知识应用

    CSAPP--实验二 拆炸弹 Phase1 disas phase_1, 反汇编 phase_1 函数 在 phase_1函数入口处 设置断点 break phase_1 run 开始运行,输入字符串 ...

  2. CSAPP实验二——bomb lab实验

    CSAPP实验二-- bomb lab实验 实验前准备 第一部分(phase_1) 第二部分(phase_2) 第三部分(phase_3) 第四部分(phase_4) 第五部分(phase_5) 第六 ...

  3. CSAPP实验二:二进制炸弹(Bomb Lab)

    本系列文章为中国科学技术大学计算机专业学科基础课<计算机系统>布置的实验,上课所用教材和内容为黑书CSAPP,当时花费很大精力和弯路,现来总结下各个实验,本文章为第二个实验--二进制炸弹( ...

  4. 计算机系统实验:二进制炸弹+缓冲区炸弹 (自我学习笔记)

    本来没想写个博客,结果得知还要验收,发现自己全忘了,那就趁着复习的功夫再捋一遍吧>-< 一.使用工具:IDA-pro 简单使用方式: 1.打开IDA,open需要反汇编的exe. 选则wi ...

  5. 计算机系统基础实验——拆除二进制炸弹

    实验简要介绍:      该实验是书籍深入理解计算机操作系统中最有趣的实验之一,主要使用 gdb来拆解二进制(或者说程序)的一个文件,了解其运行逻辑.我们对这个程序的了解有: 有六个关卡,分别是 ph ...

  6. 【计算机系统基础bomb lab】CSAPP实验:Bomb Lab

    [计算机系统基础bomb lab]CSAPP实验:Bomb Lab CSAPP 实验:Bomb Lab 实验内容简述 实验环境 实验过程:phase 1 phase 1 调试过程 实验过程:phase ...

  7. CSAPP实验记录(二)Bomb Lab

    CSAPP实验记录(二)Bomb Lab 二进制炸弹是由一系列阶段组成的程序.每个阶段都要求你在 stdin 上键入一个特定的字符串.如果你输入了正确的字符串,那么这个阶段就被拆除,炸弹进入下一个阶段 ...

  8. bomb二进制炸弹拆除实验(MIPS)

    上学期计算机系统基础课程的一个实验,在这里再简略整理一下: 实验要求: 仅给定一个MIPS二进制可执行文件bomb,要求运用GDB调试工具,通过分析反汇编代码来输入正确的参数以拆除炸弹. 辅助工具推荐 ...

  9. CSAPP实验——逆向工程拆除“二进制炸弹”程序

    计算机系统基础的实验课,引用了国外的实验,非常好 文章目录 一.实验目的: 二.实验要求 三.实验内容(所修改函数代码,功能以及重要代码的解释): 1.phase_1 2.phase_2 3.phas ...

  10. 《深入理解计算机系统》实验二Bomb Lab下载和官方文档机翻

    前言 <深入理解计算机系统>官网:http://csapp.cs.cmu.edu/3e/labs.html 该篇文章是实验二Bomb Lab的Writeup机翻. 原文:http://cs ...

最新文章

  1. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(添加箱图、带缺口的小提琴图、小提琴图)实战
  2. SAP MM ME1P查询采购订购订单价格历史
  3. cs224n上完后会会获得证书吗_斯坦福NLP组-CS224n: NLP与深度学习-2019春全套资料分享...
  4. SpringCloud-创建服务消费者-Ribbon方式(附代码下载)
  5. BIOS INT 10-13功能调用的“另类”玩法
  6. hdu 1086 线段相交
  7. 安卓下载保存到本地(二)
  8. python保存所有变量值_如何在当前python会话中保存所有变量?
  9. 操作系统概述 记录操作系统相关知识
  10. (转)Spring中的事务操作
  11. 你真的了解 ConcurrentHashMap 吗?
  12. php读取pdf文件乱码,使用php读取pdf文件
  13. linux 超大文件编辑,Linux 修改打开最大文件数
  14. 推荐微信小程序常用的几个UI组
  15. OpenAccessLibrary 网站简单爬取
  16. 智能音箱音效哪个好_四大智能音箱,你觉得哪个才是最好用的?
  17. 软件测试的定义是什么?
  18. R可视化会出现的问题1
  19. 有趣实用的app分享,强烈推荐
  20. Mysql语句DUPLICATE配合IF使用当,插入/更新值大于当前值,更新小于则不更新

热门文章

  1. 基于压缩传感的脉冲GPR成像技术研究(硕士学位论文初稿20120104)
  2. java实现图片去掉水印
  3. ubuntu gnome桌面农历日历显示
  4. Windows10 V2004 正式版发布
  5. latex normal是几号字_Latex之字体 | 学步园
  6. Linux控制Nvidia显卡风扇转速
  7. 当软件定义存储(SDS)遇见区块链(BlockChain)
  8. RAM Parity 和 RAM ECC
  9. html中如何设计圆形图案,纯CSS绘制漂亮的圆形图案效果
  10. c lua语言教程,Lua教程(十九):C调用Lua