【CSAPP]-binarybomb实验

目录

实验目的与要求

实验原理与内容

实验设备与软件环境

实验过程与结果(可贴图)

操作异常问题与解决方案

实验总结


实验目的与要求

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

实验原理与内容

一个“binary bombs”(二进制炸弹,下文将简称为炸弹)是一个Linux可执行C程序,包含了7个阶段(phase1~phase6和一个隐藏阶段)。炸弹运行的每个阶段要求学生输入一个特定的字符串,若的输入符合程序预期的输入,该阶段的炸弹就被“拆除”,否则炸弹“爆炸”并打印输出 "BOOM!!!"字样。实验的目标是拆除尽可能多的炸弹层次。
每个炸弹阶段考察了机器级语言程序的一个不同方面,难度逐级递增:
阶段1:字符串比较
阶段2:for循环
阶段3:switch分支
阶段4:递归函数
阶段5:数组元素按序访问
阶段6:链表
隐藏阶段:只有在阶段4的拆解字符串后再附加一特定字符串后才会出现(作为最后一个阶段)
为了完成二进制炸弹拆除任务,需要使用gdb调试器和objdump来反汇编炸弹的可执行文件,并单步跟踪调试每一阶段的机器代码,从中理解每一汇编语言代码的行为或作用,进而设法“推断”出拆除炸弹所需的目标字符串。这可能需要在每一阶段的开始代码前和引爆炸弹的函数前设置断点,以便于调试。
拆弹密码的输入分文两种模式。
模式1:正常手动输入,每次程序运行到某一阶段会停下来要求用户输入数据。这种方式比较原始,不推荐使用。如果使用这种做法,在程序调试到后期时,每次为了进入后期的断点位置都需要在之前的每一个阶段进行手动输入,极其浪费时间。
模式2:采用输入重定向。首先将答案文本写至一个.txt文本中,每个阶段的拆弹密码占一行。


实验设备与软件环境

1.Linux操作系统—64位 Ubuntu 18.04
2. C编译环境(gcc)
3. 计算机

实验过程与结果(可贴图)


在Linux中,以下是几个常见的命令:

"cd"命令用于更改当前工作目录。通过输入"cd"命令,然后加上要更改到的目录路径,就可以进入该目录。

"ls"命令用于列出目录中的文件和子目录。如果不指定参数,它将显示当前目录中的所有文件和子目录。

"vi"命令是一种文本编辑器,用于创建和编辑文本文件。它允许用户以不同的模式浏览和编辑文件,包括插入模式、命令行模式和普通模式。

"cat"命令可以用于查看文件内容。它将打印文件的内容到终端上。

"objdump"是一个强大的调试工具,它可以用于分析可执行文件和目标文件的二进制代码。objdump可以显示程序的汇编代码、符号表、重定位表等信息,帮助开发人员进行调试和优化。

objdump的语法如下:

objdump [选项] 文件名
其中,文件名参数可以是可执行文件、目标文件或共享库文件。常用的选项包括:

-d 显示汇编代码
-t 显示符号表
-r 显示重定位表
-S 显示源代码和汇编代码
例如,要显示可执行文件"hello"的汇编代码,可以使用以下命令:

objdump -d hello

本次实验主要是要学会运用gdb调式器来查看汇编代码和寄存器。

常用的指令:

break (b)设置断点,接函数名或者*地址

x 查看地址中的数据,后面可以接/c(数据为字符串),/d(数据为数字)
也可以直接x/s
disas 查看当前函数的汇编代码

i r 查看寄存器的值

stepi n 运行n步(会进入别的函数)

nexti n 运行n部(跳过别的函数,只在当前函数)

phase_1

首先gdb启动bomb

这时候再使用run指令,让bomb跑起来

这个时候我们就到了第一阶段的答题部分
输入正确的答案就会提示闯关成功
是否进入下一关
否则就会使炸弹爆炸,显示bomb字样

我们可以知道,第一关是让我们输入一个特定的字符串
如果字符串的某个字符和比较的字符串不相等,都会引发炸弹爆炸
这个时候我们可以disas phase_1
查看一阶段的汇编代码

首先给了8个字节的空间给rsp
然后加载了一个字符串使得与输入的字符串进行比较

这个时候我们可以先看一下这个圈中的地址里面的字符串
这是我们要比较的字符串

我们可以看到,这个显示的字符串会和我们输入的字符串进行比较
那么也就是说
只要我们输入的字符串是这个字符串
就会闯关成功
    我们来试试看


输入run使得bomb运行


输入刚刚我们查看到的指令
And they have no disregard for human life.


可以看到,

也就是说我们第一关已经通过了

Phase_2

来到第二关,第二关是一个for循环的关卡
在解答之前
我们可以把上一关的答案放到一个文本文件中,可以新建也可以放在自己有的空白文本文件中。

这样做的好处是我们不用每一关都手动输入前面关卡的答案
只需要运行这个文本文件就可以直接解答下一关。

我们先看一下这个循环的汇编代码
在这之前
我们可以先打上一个断点,这样即使我们的答案有误
炸弹也不会被引爆


第一个圈是提供这个程序所需的空间,fs是一个防止栈溢出的操作

这个关卡让我们输入六个数字,我们可以看到,我们的第一位会和一
进行比较
如果不相等,就会引发45行的bomb指令,发生爆炸
所以我们基本可以确定,第一个数字是1

再往下看63行,这里是将eax的值再加上一个eax也就是
说eax的值乘以两倍
在六次循环里,eax每次都会以它的二倍进行储值

到了这一步,我们基本可以确定
六个数字分别为
1 2 4 8 16 32

运行一下我们刚刚保存的文本文件,看看答案是否正确


通过显示的字符
我们可以确定
答案是正确的

Phase_3


第三关是一个switch循环

我们把上一关的断点删除,用delete指令
然后重新打上断点


我们输入的第一个字符
会和0-7进行判断
如果大于7
那么就会引发炸弹
所以我们可以确定这个switch循环有7或8个case语句

再往下看,可以看到有很多的mov和cmpl指令
我这里选择的是0x6f和0x150

既然我们有7个case语句
我这里用0进入查看case0是否是答案之一


我们用x/s查看这个地址要我们输入什么
一个整形,一个字符,一个整形
我们可以确定第一个整形是0
第二个应该是0x6f
第三个是0x150

我们用p指令将它们换算成相对应的值

到这里,我们可以知道第三位是336,
那么第二位这个字符是什么呢
这个时候我们借助ascll表进行查看
可以看到111对应的是英语字母o
我们试着输入一下看看


0 o 336

可以看到显示闯关成功
那么为了验证我们的思路没有问题
我们试着将case1也进行解答


那么case1对应的就是下一段mov和cmpl
0x77和0x12d

119对应的是w


由此我们可以断定
解题思路是正确的
将答案写入文本文件中。

Phase_4


先给b打上断点,然后disas查看汇编代码

可以看到四阶段有重复调用自身代码的操作,基本可以判断是
递归函数

Mov 0xe
16进制中e是14
也就是说第一位答案应该是在0-14之间

我们接着看一下
0x555555556aaf
里面的要求

要求我们输入两个整形
第一个可以确定为0-14
第二个我们可以看

Eax是第一个值存储在一个临时变量里面
Rsp此时存的是我们输入的第二个值
当这个值不等于0x23
也就是16x2+3时
就会发生爆炸

这个时候我们只需要进行不断的输入判断
就可以知道正确答案


这里1不是我们的正确答案
那么经过我们的逐个判断
最后确定8 35
是正确答案


将答案保存在文本文件中之后。
关闭terminal
关闭虚拟机。


操作异常问题与解决方案


实验总结


通过这次实验,我初步了解了可以通过反汇编指令获得反汇编代码。在本次拆弹实验,对于汇编代码的查看可以先找到炸弹语句,反推出避免爆炸条件。可以根据函数名初步确定函数功能,再到具体代码进行详细分析。根据输入函数的格式可以初步确定思路内容方向。由跳转表语句或者数组语句可确定相关结构方向。内存数据可以通过gdb查看。Gdb还可查看跳转表,数组,链表等相关结构。可灵活运用gdb的断点调试功能确定猜测以及函数功能。了解了汇编代码在实际一个小工程的运行流程。进一步加深了相关知识点的理解。如内存数据的存取,函数的调用,参数寄存器的设置,栈帧中关于寄存器的保护、临时变量、数组创建的实现的理解。同时也加深了关于gdb工具的学习使用,受益良多。


学习是循序渐进的,生活中有许多未知的事情等着我们去探索,这个bomb实验还是挺好玩的,做了一个就想会第二个,学习就是如此,加油吧!骚年!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/761641.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Soul社交元宇宙智能连接安全相伴,打造值得用户信赖的社交环境

随着人工智能技术的快速发展,社交平台正在迎来一场革命性的变革。从智能推荐到情感分析,社交平台通过深度学习和数据分析为用户提供更加个性化、智能化的社交体验。与此同时,数字时代人们的安全意识正逐渐增强。为此,一个智能、安全的社交平台成为人们迫切需要。而新型社交平台…

CSRF verification failed. Request aborted.

最近在学习django,遇到这个问题。CSRF verification failed. Request aborted. 解决方案: 1、在Html template中加入csrf_token 2、在view.py中对应的view函数上加上装饰器 再启动运行,报错就解决了。

Zabbix HA高可用集群部署

Zabbix HA高可用集群介绍 关键基础设施通常需要高可用性 (HA),因为这些基础设施几乎不会造成停机。因此,对于任何可能失败的服务,都必须有一个故障转移选项,以便在当前服务失败时接管。 Zabbix 提供了易于设置的本机高可用性解决…

c#学习日志用CLI(命令行窗口)创建c#工程

创建Helloworld.Proj和Program.cs两个文件然后运行即可,一种方法是用记事本创建,写入代码,这种比较费劲,主要代码如下 Program.cs中代码如下 System.Console.WriteLine("Hello World!!"); Helloworld.Proj中的代码如…

提升写作效率:探索AI在现代办公自动化中的应用

工欲善其事,必先利其器。 随着AI技术与各个行业或细分场景的深度融合,日常工作可使用的AI工具呈现出井喷式发展的趋势,AI工具的类别也从最初的AI文本生成、AI绘画工具,逐渐扩展到AI思维导图工具、AI流程图工具、AI生成PPT工具、AI…

DELL:利用大语言模型(LLM)生成评论与解释,革新虚假信息检测

ACL 2024 DELL: Generating Reactions and Explanations for LLM-Based Misinformation Detection https://arxiv.org/abs/2402.10426https://arxiv.org/abs/2402.10426 1.概述 大型语言模型(LLM)虽在诸多领域显示出色性能,但在直接应用于新闻真实性鉴别时,面临两大核心挑…

嵌入式Linux系统编程 — 5.6 Linux系统申请堆内存

目录 1 内存概念 1.1 什么是堆内存 1.2 内存分布 2 malloc、free在堆上分配与释放内存 2.1 malloc函数 2.2 free函数 2.3 示例程序 注意事项: 3 calloc分配内存 3.1 calloc函数介绍 3.2 示例程序 4 分配对齐内存 4.1 函数介绍 4.2 示例程序 1 内存概念…

【QT】输入类控件

目录 Line Edit 核心属性 核心信号 正则表达式 示例:使用正则表达式验证输入框内容 示例:切换输入框密码模式下的显示状态 Text Edit 核心属性 核心信号 示例:获取多行输入框的内容同步显示到label 示例:获取文本的选…

Navcat Premium17破解安装及数据库连接教程

一、前言 Navicat Premium 是一套数据库开发工具,是一个可多重连接数据库的管理工具。Navicat Premium让你从单一应用程序中同时连接 MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 数据库。目前17已经支持了很久都没有支持的Redis数据库了。…

【办公软件使用分享—Word篇】实用技巧 一学就会 沈阳电脑办公软件基础培训

在平时的工作学习中,Word真真是让很多人头疼的一件事,今天给大家分享20个案例,感受下Word真正的力量! 1.插入自动目录 没有目录的文档不是一份合格的文档,很多人认为在Word里插入目录是一件很麻烦的事,其…

[leetcode]max-consecutive-ones 最大连续1的个数

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int findMaxConsecutiveOnes(vector<int>& nums) {int maxCount 0, count 0;int n nums.size();for (int i 0; i < n; i) {if (nums[i] 1) {count;maxCount max(maxCount, count);} else…

4面体空间含支链4点结构种类与占比

在30个点的4面体内取4个点&#xff0c;要求这4个点可以是直链或支链&#xff0c; 共有188个结构符合要求&#xff0c;36个直链结构每个有4个。 这种支链结构每个有10个 这种支链结构每个有1个 旋转对称关系为 A B C D 0 120 240 0 120 240 0 120 240 0 120 240…

Steam商店报错、进不去 Steam105错误代码的处理方法

逛Steam商店现在已然成为大部分游戏玩家每日必做的事情之一&#xff0c;玩家们在商店浏览、购买并享受各种类型的游戏和应用&#xff0c;找到适合自己的一款&#xff0c;最近steam夏促活动正在进行&#xff0c;很多玩家都前往Steam商店查看各种低价游戏&#xff0c;但是很多玩家…

第2章-Python编程基础

#本章目标 1&#xff0c;了解什么是计算机程序 2&#xff0c;了解什么是编程语言 3&#xff0c;了解编程语言的分类 4&#xff0c;了解静态语言与脚本语言的区别 5&#xff0c;掌握IPO程序编写方法 6&#xff0c;熟练应用输出函数print与输入函数input 7&#xff0c;掌握Python…

泛型的使用(<T>)

文章目录 前言一、泛型是什么&#xff1f;二、泛型的使用 1.定义泛型类2.泛型的常规用法总结 前言 强制类型转换存在一定隐患&#xff0c;如数据丢失、内存溢出、运行时错误、程序逻辑错误等。所以提供了泛型机制&#xff0c;使程序员可以定义安全的数据类型进行操作。通俗的理…

【postgresql】 基础知识学习

PostgreSQL是一个高度可扩展的开源对象关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;它以其强大的功能、灵活性和可靠性而闻名。 官网地址&#xff1a;https://www.postgresql.org/ 中文社区&#xff1a;文档目录/Document Index: 世界上功能最强大的开源…

GP37-S-N、GP37-S-E、GP37-S-R比例电磁铁驱动放大器

比例阀用电磁铁EP45-C、EP37-E、EP45-G、EP45-N、GP37-3-A、GP37-S-N、GP37-S-E、GP37-S-R在直流12V/24V的电液比例控制系统中与BEUEC比例控制放大器配套使用&#xff0c;共同作用于比例阀的控制。电磁铁输出力通过负载弹簧转换成位移&#xff0c;实现电流-力-位移线性转换&…

嵌入式问题分析思路

BUG解决总体思路: 1.1 定位bug范围及性质 要有效解决问题&#xff0c;首先要缩小范围&#xff0c;集中关注最近的代码变化。这有助于迅速定位可能引入问题的部分&#xff0c;避免无谓的时间浪费。检查最近的代码提交记录和修改日志&#xff0c;找出可能影响现有功能的变更。然…

减肥期间三餐饮食搭配

减肥期间三餐饮食搭配 早起洗漱后早餐前:一杯温水大口喝下,清洁肠道!!! 减肥期间早餐搭配 早餐9点前完成✅ ❤必须喝(纯牛奶、无糖豆浆、无糖酸奶、黑咖啡都可以,四选一) ❤必须吃1~2个鸡蛋 (蒸,煮,煎,炒都可以) ❤必须吃主食 (红薯、玉米、南瓜、紫薯、山药…

基于单片机的 LED 照明灯智能调光系统设计

摘  要&#xff1a; 社会经济的不断发展&#xff0c;推动了智能化生活的进程&#xff0c;智能调光技术开始广泛应用在生活中&#xff0c;人们也逐渐提高了灯光亮灯率等的要求。基于此&#xff0c;笔者主要设计了基于单片机的 LED 照明灯智能调光系统&#xff0c;希望能够为相关…