前言
个人主页:Sarapines Programmer
系列专栏:《斯坦福大学之CSAPP》
⏰诗赋清音:桃花灼灼春风暖,心随乐曲扬徐徐。 苦尽甘来梦未阑,岁月长河任舟游。
欢迎大家关注点赞收藏⭐️留言
作者留言:欢迎来到我的【CSAPP】炸弹实验室!这里是探索计算机系统世界的秘境,我的学习笔记博客为你打开CSAPP的炸弹之门。在这里,我不仅分享计算机系统的基础知识和高级技巧,还有着涉猎实用技术和项目经验的爆炸药水。无论你是初学者还是计算机大师,这个实验室会为你施展出神秘的学习魔法,帮助你在CSAPP的炸弹领域中踏上一场惊险之旅。准备好了吗?跟着我,让我们一起解除那些迷人的炸弹代码,揭示计算机系统的神奇面纱!
目录
前言
1. CSAPP与Bomb简介
1.1 CSAPP
1.2 Bomb
2. bomb
2.1 实验环境
2.2 实验过程
2.3phase_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实验的目标是解开一系列的”炸弹”,每个炸弹都有不同的解锁方法,需要分析程序的汇编代码,理解其工作原理,并找到正确的输入来解除炸弹。这个实验教授了计算机系统的底层知识,包括汇编语言和程序执行的原理。
资源获取:关注文末公众号回复 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.3phase_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。如果输入符合要求,则程序会跳转到行代码。
行代码块如图所示,主要是将%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″ />
综上所述,在解决phase_5挑战的过程中需要深入理解程序的运行逻辑和各个函数的作用,从而逆向出输入字符串中每个字符的原始值。
2.4实验结果
以上代码均存储在bomb_idea.txt文件中,每行代表对应的关卡,各阶段密钥如下所示:
在终端输入
./bomb result.txt
显示全部通关。
2.5实验体会
逆向解析: 在CSAPP的BombLab实验中,我深入研究了Phase_5的解密机制。通过逆向分析程序,我成功识别了关键算法,揭示了隐藏在代码背后的谜题。这一过程增强了我的逆向工程技能,让我更深入理解计算机系统的运作。
攻略实践: 实战中,我运用所学知识设计了精准的攻略策略,成功绕过Phase_5的各种安全防线。这一经验不仅提高了我的程序攻击能力,还锻炼了解决实际安全挑战的能力,为未来的计算机安全领域奠定了坚实基础。
学术收获: 通过这次实验,我不仅掌握了Phase_5的解密技术,还深刻领悟了计算机系统底层原理。这种学术收获不仅在实验中体现,更为我的CSAPP学习之路注入了更多的热情与信心。
总结
计算机系统的世界,如同一座未被揭示奥秘的古老迷宫,引领你勇敢踏入计算机科学的神秘领域。CSAPP的Bomblab实验便是这场独特的学习冒险,从基本概念到底层实现,逐步揭示更深层次的计算机系统内核、汇编语言和数据结构的奥秘。
渴望挑战计算机系统中的安全学习路径和掌握底层系统编程的技术?不妨点击下方链接,一同探讨更多计算机科学的奇迹吧。我们推出引领趋势的 计算机科学专栏:《斯坦福大学之CSAPP》,旨在深度探索计算机系统中安全编程技术的实际应用和创新。