【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

智能推荐

11、合宙Air模块Luat开发:通过http协议获取天气信息_合宙获取天气-程序员宅基地

文章浏览阅读4.2k次,点赞3次,收藏14次。目录点击这里查看所有博文  本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。  先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获。  我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考!..._合宙获取天气

EasyMesh和802.11s对比-程序员宅基地

文章浏览阅读7.7k次,点赞2次,收藏41次。1 关于meshMesh的意思是网状物,以前读书的时候,在自动化领域有传感器自组网,zigbee、蓝牙等无线方式实现各个网络节点消息通信,通过各种算法,保证整个网络中所有节点信息能经过多跳最终传递到目的地,用于数据采集。十多年过去了,在无线路由器领域又把这个mesh概念翻炒了一下,各大品牌都推出了mesh路由器,大多数是3个为一组,实现在面积较大的住宅里,增强wifi覆盖范围,智能在多热点之间切换,提升上网体验。因为节点基本上在3个以内,所以mesh的算法不必太复杂,组网形式比较简单。各厂家都自定义了组_802.11s

线程的几种状态_线程状态-程序员宅基地

文章浏览阅读5.2k次,点赞8次,收藏21次。线程的几种状态_线程状态

stack的常见用法详解_stack函数用法-程序员宅基地

文章浏览阅读4.2w次,点赞124次,收藏688次。stack翻译为栈,是STL中实现的一个后进先出的容器。要使用 stack,应先添加头文件include<stack>,并在头文件下面加上“ using namespacestd;"1. stack的定义其定义的写法和其他STL容器相同, typename可以任意基本数据类型或容器:stack<typename> name;2. stack容器内元素的访问..._stack函数用法

2018.11.16javascript课上随笔(DOM)-程序员宅基地

文章浏览阅读71次。<li> <a href = "“#”>-</a></li><li>子节点:文本节点(回车),元素节点,文本节点。不同节点树:  节点(各种类型节点)childNodes:返回子节点的所有子节点的集合,包含任何类型、元素节点(元素类型节点):child。node.getAttribute(at...

python encode和decode函数说明_python中文处理之encode/decode函数-程序员宅基地

文章浏览阅读394次。python中文处理相信迷惑过不少同学。下面说说python2/3的encode和decode函数。python2中,使用decode()和encode()来进行解码和编码,以unicode类型作为中间类型。即decode    encodestr ---------> unicode --------->str示例(注意encode和decode的编码必须保持一致)..._python中decode函数属那个模块

随便推点

5G云计算:5G网络的分层思想_5g分层结构-程序员宅基地

文章浏览阅读3.2k次,点赞6次,收藏13次。分层思想分层思想分层思想-1分层思想-2分层思想-2OSI七层参考模型物理层和数据链路层物理层数据链路层网络层传输层会话层表示层应用层OSI七层模型的分层结构TCP/IP协议族的组成数据封装过程数据解封装过程PDU设备与层的对应关系各层通信分层思想分层思想-1在现实生活种,我们在喝牛奶时,未必了解他的生产过程,我们所接触的或许只是从超时购买牛奶。分层思想-2平时我们在网络时也未必知道数据的传输过程我们的所考虑的就是可以传就可以,不用管他时怎么传输的分层思想-2将复杂的流程分解为几个功能_5g分层结构

基于二值化图像转GCode的单向扫描实现-程序员宅基地

文章浏览阅读191次。在激光雕刻中,单向扫描(Unidirectional Scanning)是一种雕刻技术,其中激光头只在一个方向上移动,而不是来回移动。这种移动方式主要应用于通过激光逐行扫描图像表面的过程。具体而言,单向扫描的过程通常包括以下步骤:横向移动(X轴): 激光头沿X轴方向移动到图像的一侧。纵向移动(Y轴): 激光头沿Y轴方向开始逐行移动,刻蚀图像表面。这一过程是单向的,即在每一行上激光头只在一个方向上移动。返回横向移动: 一旦一行完成,激光头返回到图像的一侧,准备进行下一行的刻蚀。

算法随笔:强连通分量-程序员宅基地

文章浏览阅读577次。强连通:在有向图G中,如果两个点u和v是互相可达的,即从u出发可以到达v,从v出发也可以到达u,则成u和v是强连通的。强连通分量:如果一个有向图G不是强连通图,那么可以把它分成躲个子图,其中每个子图的内部是强连通的,而且这些子图已经扩展到最大,不能与子图外的任一点强连通,成这样的一个“极大连通”子图是G的一个强连通分量(SCC)。强连通分量的一些性质:(1)一个点必须有出度和入度,才会与其他点强连通。(2)把一个SCC从图中挖掉,不影响其他点的强连通性。_强连通分量

Django(2)|templates模板+静态资源目录static_django templates-程序员宅基地

文章浏览阅读3.9k次,点赞5次,收藏18次。在做web开发,要给用户提供一个页面,页面包括静态页面+数据,两者结合起来就是完整的可视化的页面,django的模板系统支持这种功能,首先需要写一个静态页面,然后通过python的模板语法将数据渲染上去。1.创建一个templates目录2.配置。_django templates

linux下的GPU测试软件,Ubuntu等Linux系统显卡性能测试软件 Unigine 3D-程序员宅基地

文章浏览阅读1.7k次。Ubuntu等Linux系统显卡性能测试软件 Unigine 3DUbuntu Intel显卡驱动安装,请参考:ATI和NVIDIA显卡请在软件和更新中的附加驱动中安装。 这里推荐: 运行后,F9就可评分,已测试显卡有K2000 2GB 900+分,GT330m 1GB 340+ 分,GT620 1GB 340+ 分,四代i5核显340+ 分,还有写博客的小盒子100+ 分。relaybot@re...

AppsFlyer Unity V6_edm4u-程序员宅基地

文章浏览阅读1.8k次。AppsFlyer Unity Plugin V6踩坑记录Unity plugin V6 插件链接首先粗略讲一下EDM4U(Unity外部依赖管理器)。EDM4U类似于一个插件管理器,通过Android Resolver 和 iOS Resolver来进行库文件的下载、更新、去重等,目前新的facebook,google,appsflyer等插件都自带这两个玩意儿了。iOS开发需要注意一点,没有安装CocoaPods,则需要使用/Assets/External Dependency Manage_edm4u

推荐文章

热门文章

相关标签