【CSAPP】探究BombLab奥秘:Phase_5的解密与实战_csapp phase_5-程序员宅基地

技术标签: # 【计网】CS144&CSAPP  Phase_5  CSAPP  BombLab  计算机系统  逆向工程  

诗赋清音:桃花灼灼春风暖,心随乐曲扬徐徐。 苦尽甘来梦未阑,岁月长河任舟游。

 前言

 欢迎大家关注点赞收藏️留言

​ 作者留言:

欢迎来到我的【CSAPP】炸弹实验室!这里是探索计算机系统世界的秘境,我的学习笔记博客为你打开CSAPP的炸弹之门。在这里,我不仅分享计算机系统的基础知识和高级技巧,还有着涉猎实用技术和项目经验的爆炸药水。无论你是初学者还是计算机大师,这个实验室会为你施展出神秘的学习魔法,帮助你在CSAPP的炸弹领域中踏上一场惊险之旅。准备好了吗?跟着我,让我们一起解除那些迷人的炸弹代码,揭示计算机系统的神奇面纱!

目录

 前言

1. CSAPP与Bomb简介

1.1 CSAPP

1.2 Bomb

2. bomb

2.1 实验环境

2.2 实验过程

2.3 phase_5

2.4 实验结果

2.5 实验体会

 总结 


1. CSAPP与Bomb简介

1.1 CSAPP

《CSAPP》是指计算机系统基础课程的经典教材《Computer Systems: A Programmer's Perspective》,由Randal E. Bryant和David R. O'Hallaron编写。该书的主要目标是帮助深入理解计算机系统的工作原理,包括硬件和软件的相互关系,其涵盖了计算机体系结构、汇编语言、操作系统、计算机网络等主题,旨在培养学生系统级编程和分析的能力。

1.2 Bomb

"Bomb实验" 是与CSAPP教材相关的一项编程实验。它是一种反汇编和逆向工程任务,旨在教授如何分析和解决复杂的程序问题。Bomb实验的目标是解开一系列的"炸弹",每个炸弹都有不同的解锁方法,需要分析程序的汇编代码,理解其工作原理,并找到正确的输入来解除炸弹。这个实验教授了计算机系统的底层知识,包括汇编语言和程序执行的原理。

资源获取:关注公众号【科创视野】回复 csappbomblab


2. bomb

2.1 实验环境

  • VMware Workstation虚拟机环境下的Ubuntu 64位。

2.2 实验过程

实验准备阶段:首先需要使用ubuntu联网环境跳转到链接下载实验所需的bomblab:Bomblab源文件

下载bomblab压缩包并输入

tar –xvf bomb.tar

进行解压缩,进入该目录所有文件如下所示:

在终端输入

sudo apt-get install gdb

安装调试器。基本用法参考下图:

实验过程阶段:

“Binary bombs”是一个可在Linux系统上运行的C程序,它由6个不同的阶段(phase1~phase6)组成。在每个阶段,程序会要求输入一个特定的字符串。如果输入的字符串符合程序的预期输入,那么这个阶段的炸弹就会被“解除”,否则炸弹就会“爆炸”,并输出“BOOM!!!”的提示信息。实验的目的是尽可能多地解除这些炸弹的阶段。

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

* 阶段1:字符串比较

* 阶段2:循环

* 阶段3:条件/分支

* 阶段4:递归调用和栈

* 阶段5:指针

* 阶段6:链表/指针/结构

在炸弹拆除任务中,还存在一个隐藏阶段。然而,只有在第四个阶段解决后添加特定的字符串后,该隐藏阶段才会出现。为了完成任务,需要使用gdb调试器和objdump反汇编炸弹的可执行文件,然后单步跟踪每个阶段的机器代码,理解每个汇编语言的行为或作用。这将帮助“推断”出拆除炸弹所需的目标字符串。为了调试,可以在每个阶段的开始代码前和引爆炸弹的函数前设置断点。

在终端输入

objdump -d bomb > bomb.asm

得到bomb的反汇编文件bomb.asm如下所示。


2.3 phase_5

phase_5程序首先会提示输入一个字符串,然后会依次对输入的每个字符进行一系列的变换操作。如果所有字符的变换结果都等于一个特定的值,那么炸弹就会被拆除;否则,炸弹就会爆炸。

第一个函数read_six_numbers()的作用是读取六个数字,并将它们存放到一个数组中。该函数会先提示玩家输入六个数字,然后通过scanf函数将这些数字存储到一个数组中。如果输入的数字不足六个或者有非法字符,那么程序就会调用explode_bomb函数,炸弹就会爆炸。 第二个函数phase_5()是整个程序的核心。该函数会依次对输入字符串中的每个字符进行变换操作,并将变换结果存储到一个新的字符串中。具体来说,该函数会先将输入字符串复制到一个新的字符串中,然后对新字符串中的每个字符进行如下变换操作:

  • 对于第一个字符,将其ASCII码值加1;
  • 对于第二个字符,将其ASCII码值减1;
  • 对于第三个字符,将其ASCII码值加2;
  • 对于第四个字符,将其ASCII码值减2;
  • 对于第五个字符,将其ASCII码值加3;
  • 对于第六个字符,将其ASCII码值减3。

在这个过程中,我们需要注意一些细节。首先,由于字符串是以空字符结尾的,因此需要将空字符也算在内。其次,由于变换操作可能会导致字符的ASCII码值超出合法的范围,还需要进行一些调整操作。具体来说,如果变换后的字符ASCII码值小于0,那么就将其加上0x100(即256);如果超过了0x7f,那么就将其减去0x100。 在phase_5函数执行完毕后,会得到了一个新的字符串,其中每个字符都经过了一系列的变换操作。接下来,程序会将新字符串和一个预设的字符串进行比较,如果相等,则炸弹被拆除,否则就调用explode_bomb函数,炸弹就会爆炸。 为了解决这个挑战,我们需要分析输入字符串中每个字符的变换操作,并逆推出原始的字符。具体来说,我们可以先将预设的字符串和目标字符串都转换成十六进制表示,然后对每个字符进行逆向变换操作。最终,我们得到的就是输入字符串中的原始字符。

阅读代码,发现程序在(rsp+0x18)处设置了一个金丝雀值,目的是为了防止缓冲区溢出。

程序会读取我们输入的值的长度,并与6进行比较。如果长度不为6,则会调用explode_bomb函数引爆炸弹。因此,我们需要确保输入的值的长度为6。如果输入符合要求,则程序会跳转到<phase_5+0x70>行代码。

<phase_5+0x70>行代码块如图所示,主要是将%rax设置为0,然后跳转到40108b代码行。

40108b处的代码块可以分为三个部分,分别是part1(40180b-4010ae)、part2(4010b3-4010d7)和part3(4010d9-4010f3),它们分别完成了不同的功能。

在part2部分中,代码会比较rsp+0x10位置处的值和0x40245e位置处的值。如果二者不相等,则会调用explode_bomb函数引爆炸弹。因此,rsp+0x10位置存储的值必须与0x40245e位置处的值相同。我们可以使用gdb检查0x40245e位置处的值。输入

x/s 0x40245e

可以看到该位置处的值为"flyers"。

假设输入的六个字符为a1,a2,a3,a4,a5,a6,根据我们给出的伪代码,part1对应的栈帧实际上存储的是m[0x4024b0+rdx]的值。因此,我们需要查看0x4024b0中存储的值。我们可以使用gdb调试器来查看,输入

print (char*)0x4024b0

如下所示:

将Phase_5中每句代码的作用解释如图所示。

观察可知,0x4024b0存储了一个字符串数组。结合之前的伪代码,我们可以推断出,我们传入的参数实际上是该数组的索引值,通过该索引值可以获取我们需要的“flyers”值。

根据以上分析,这一关的程序会读取我们输入的六个字符的ASCII码低四位,并以此作为索引值,在字符数组“maduiersnfotvbyl”中查找相应的字符。如果最后返回的字符为“flyers”,则我们就能通过这一关。

观察可知,字符串 "maduiersnfotvbyl" 中,字符 f 位于第 9 位,字符 l 位于第 15 位,字符 y 位于第 14 位,字符 e 位于第 5 位,字符 r 位于第 6 位,字符 s 位于第 7 位。因此,我们需要输入六个字符,使得它们的 ASCII 码低四位分别为 1001、1111、1110、0101、0110、0111。 通过查看 ASCII 表,我们可以找到对应的字符。例如,字符 a 的 ASCII 码为 01100001,因此,一种可能的解码为 ionuvw;ionefg;9?>567(答案不唯一)。

综上所述,在解决phase_5挑战的过程中需要深入理解程序的运行逻辑和各个函数的作用,从而逆向出输入字符串中每个字符的原始值。


2.4 实验结果

以上代码均存储在bomb_idea.txt文件中,每行代表对应的关卡,各阶段密钥如下所示:

在终端输入

./bomb result.txt

显示全部通关。


2.5 实验体会

  1. 逆向解析: 在CSAPP的BombLab实验中,我深入研究了Phase_5的解密机制。通过逆向分析程序,我成功识别了关键算法,揭示了隐藏在代码背后的谜题。这一过程增强了我的逆向工程技能,让我更深入理解计算机系统的运作。

  2. 攻略实践: 实战中,我运用所学知识设计了精准的攻略策略,成功绕过Phase_5的各种安全防线。这一经验不仅提高了我的程序攻击能力,还锻炼了解决实际安全挑战的能力,为未来的计算机安全领域奠定了坚实基础。

  3. 学术收获: 通过这次实验,我不仅掌握了Phase_5的解密技术,还深刻领悟了计算机系统底层原理。这种学术收获不仅在实验中体现,更为我的CSAPP学习之路注入了更多的热情与信心。


 总结 

计算机系统的世界,如同一座未被揭示奥秘的古老迷宫,引领你勇敢踏入计算机科学的神秘领域。CSAPP的Bomblab实验便是这场独特的学习冒险,从基本概念到底层实现,逐步揭示更深层次的计算机系统内核、汇编语言和数据结构的奥秘。

渴望挑战计算机系统中的安全学习路径和掌握底层系统编程的技术?不妨点击下方链接,一同探讨更多计算机科学的奇迹吧。我们推出引领趋势的 计算机科学专栏:《斯坦福大学之CSAPP》,旨在深度探索计算机系统中安全编程技术的实际应用和创新。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_57532432/article/details/135272722

智能推荐

FPGA采集AD7606全网最细讲解 提供串行和并行2套工程源码和技术支持-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏270次。AD7606是一款非常受欢迎的AD芯片,因为他支持8通道同时采集数据,采样深度16位,已经很不错了,虽然采样率只有200 kSPS,但对电压等低速数据源的采集而言已经完全足够了,该芯片在电压检测等项目中有着广泛应用。本文详细描述了设计方案,工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生、研究生项目开发,也适用于在职工程师做项目开发,可应用于AD数据采集领域_ad7606

plc编程-程序员宅基地

文章浏览阅读647次。刚开始学习plc,感觉很难,不好入门。但是后来慢慢的接触到一些实例以后,我发现其实它是很有意思的一门功课,所以我对他的兴趣逐渐浓厚起来,现在,我已经是公司的编程高手了,希望可以结识到更多的喜欢plc的朋友。_plc编程

AndroidAPP更新升级完整实现Demo(搭建本地服务器)_android在线升级服务器搭建-程序员宅基地

文章浏览阅读7k次,点赞8次,收藏28次。市场上的Android应用都能够自动提示升级更新,这里就完整的来实现一下AndroidAPP,实现自动升级的功能。Demo地址:具体如何实现,其实不难,先看看流程:本地AndroidApp必须要先有一个版本号用于标识当前版本,再从服务器获取服务器最新版本,进行相比较。实现流程:1、Manifest.xml添加联网权限,读写SD卡权限,版本号version_android在线升级服务器搭建

【路径规划】基于matlab人工势场算法多机器人协同编队避障路径规划【含Matlab源码 1192期】_matlab如何绘制协作避障规划图-程序员宅基地

文章浏览阅读3.2k次,点赞5次,收藏47次。人工势场算法多机器人协同编队避障路径规划完整的代码,方可运行;可提供运行操作视频!适合小白!_matlab如何绘制协作避障规划图

activity串行多实例审批_activities 多实例-程序员宅基地

文章浏览阅读3.3w次。前言在审批场景中,有这么个需求,某个节点需要多个人审批,但这些人需要按照一定的顺序进行审批才算完成,这就需要用到activity串行多实例会签;下面就来探讨一下在这种场景下的具体实现1、定义流程文件该图和上一篇的差不多,需要修改的地方在于,Sequential的这个参数需要勾选上,意思就是说,在节点为多实例的情形下,是否顺序审批,默认为false,即其中多个任务审批时没有顺序的2、部署并启动流程实例 public static void main(String[] args) { _activities 多实例

如何确定IP在同一网段_判断ip是否在一个网段-程序员宅基地

文章浏览阅读2.6w次,点赞20次,收藏84次。一 。IP地址分类我们将IP地址分为了【A B C D E】五大类,但是D和E不对民用组织开放,所以我们能使用IP地址的只有ABC三类。判断四组IP的第一个数组来确定是哪类。【注意:127.0.0.1不再里面,是因为它代表当前计算机自己】二。判断每一类IP是否属于一个网段(一)A类1. A类IP用第一个数字来表示不同网段。例如:1.0.0.0和2.0.0.0是不同的网络..._判断ip是否在一个网段

随便推点

Playing with a Freight robot: Part 1-程序员宅基地

文章浏览阅读78次。1. Freight robotThe Fetch and Freight Research Edition Robots are indoor laboratory robots.Coordinate SystemThe coordinate frames for all links in the Fetch and Freight are defined with pos...

linux编程常用指令_linux实现代码的指令-程序员宅基地

文章浏览阅读154次。一、网络函数(1)htons(2)inet_addr 点格式转换为无符号长整型 ina.sin_addr.s_addr = inet_addr("132.241.5.10");(3)inet_ntoa 无符号长整型转换为点格式 struct in_addr addr1; ulong l1; l1= inet_addr("192.168.0.74"..._linux实现代码的指令

memmove函数_void *memmove(void *dest, const void *src, size_t -程序员宅基地

文章浏览阅读1.1k次。在这个例子中,字符串"hello world!"被移动,使得输出为 “hello hello world!是一个标准库函数,用于 C++ 中的内存操作。它主要用于在内存中移动或复制字节。可以处理源内存区和目标内存区重叠的情况。如果源内存区和目标内存区重叠,此函数会返回指向目标内存区的指针。仍然可以正确地复制字节,而。_void *memmove(void *dest, const void *src, size_t n);

2013最新版Subversion 1.7.10 for Windows x86 + Apache 2.4.4 x64 安装配置教程+错误解决方案...-程序员宅基地

文章浏览阅读140次。一 、工作环境  操作系统:Windows Server 2008 R2 SP1 x64  Apache版本:2.4.4  Subversion版本: Setup-Subversion-1.7.10.msi  TortoiseSVN版本:TortoiseSVN-1.7.13.24257-x64-svn-1.7.10.msi +LanguagePack_1.7.13.24257..._windows subversion x64

python拟合直线的斜率_线性曲线拟合总是得到斜率和y的中间值为1-程序员宅基地

文章浏览阅读1.1k次。我得到了一些东西作为Excel的线性拟合,使用scipy basinhopping而不是曲线拟合和大量迭代。运行迭代需要一点时间,而且还需要一个错误函数,但它是在没有缩放原始数据的情况下完成的。Basinhopping docs.import numpy as npimport matplotlib.pyplot as pltfrom scipy.optimize import basinhopp..._一阶线性拟合斜率

广西计算机应用基础试题及答案,修订版成人大专考试试卷(有答案).-程序员宅基地

文章浏览阅读376次。广西医科大学融水函授站成人大专考试试卷课程:计算机应用基础专业:班级:姓名:学号:一、Word与Excel部分1.编辑排版一个文档完毕后,若要知道其打印效果,可选择( A )功能。A.打印预览 B.模拟打印 C.提前打印 D。屏幕打印2.Word窗口中打开文档MWA,修改后另存为MWC,则文档( B )。A.MWA是当前文档 B.MWC是当前文档C.MWC和MWA都是当前文档 D.MWC和MWA均...

推荐文章

热门文章

相关标签