【CSAPP】探究BombLab奥秘:Phase_5的解密与实战

举报
SarPro 发表于 2024/02/04 23:50:13 2024/02/04
【摘要】 该博文深入剖析了CSAPP(Computer Systems: A Programmer's Perspective)课程中的BombLab实验,着重探讨了实验中的关键阶段——Phase_5。作者通过逆向工程和实战经验,揭示了Phase_5的解密奥秘,探讨了在这个阶段学到的重要计算机系统原理。文章通过详实的解读和实例演示,为读者提供了深入理解计算机系统底层操作的机会,为攻克BombLab实验提供了

1.gif

7dd2b7f171704327b7d8987c49da4628.gif

📋 前言

🌈个人主页:SarPro
🔥 系列专栏:《CSAPP | 奇遇记》
⏰诗赋清音:笔墨奔雷动,心随翠浪飞。山川蕴壮志澎湃,梦驭风云意悠远。

 🎉欢迎大家关注🔍点赞👍收藏⭐️留言📝
 🔔作者留言:

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


🌺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实验的目标是解开一系列的"炸弹",每个炸弹都有不同的解锁方法,需要分析程序的汇编代码,理解其工作原理,并找到正确的输入来解除炸弹。这个实验教授了计算机系统的底层知识,包括汇编语言和程序执行的原理。

资源获取:关注公众号 科创视野 回复  CSAPP Bomb实验


🌺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》,旨在深度探索计算机系统中安全编程技术的实际应用和创新。🌐🔍


7dd2b7f171704327b7d8987c49da4628.gif

end.gif


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。