【CSAPP】探究BombLab奥秘:Secret_phase的解密与实战
📋 前言
🌈个人主页:
🔥 系列专栏:《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压缩包并输入
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 Secret_phase
在bomb.c中存在这样一段话:“
/* Wow, they got it! But isn't something... missing? Perhaps
* something they overlooked? Mua ha ha ha ha! */”
说明这个炸弹之中还有一个隐藏关卡,寻找进入secret_phase 的入口
进入bomb.asm中发现了如下汇编代码:
需要找到 secret_phase 函数的入口,也就是调用了 secret_phase 的函数。在 bomb.asm 文件中搜索,发现 phase_defused 函数调用了 secret_phase 函数。而在 bomb.c 文件中,每个 phase 后面都有一个 phase_defused 函数调用。因此可以通过分析 phase_defused 函数来找到调用 secret_phase 函数的位置。
对phase_defused的反汇编内容如图:
解释详细如下:
在4015fa行的代码中,我们可以观察到调用了sscanf函数,它的作用是格式化读取指定的字符串。在调用sscanf函数之前,代码使用了两条mov语句,这两个参数分别是指定的字符串和格式化读取字符串。
根据代码可以猜测,我们需要输入两个数字。为了查看这几个参数对应的字符串,我们可以使用GDB调试器。我们可以先输入之前完成的字符串,并在0x4015fa处设置断点,最后查看断点处的参数。在gdb试探性输入print (char*)0x402619和print (char*)0x603870。
得到格式化字符串 %d %d %s ,而7 0就是phase 4的解码,联系sscanf函数的返回值%eax需要等于3,可以猜想需要在7 0 后面再输入一串字符串,即可进入隐藏关卡。
对phase_defused进行分析发现,在401604行出现了一个奇怪的地址为0x402622,在gdb输入print (char*)0x402622进行解析
为了进入隐藏关卡,我们需要在第四关的解码7 0后面加上字符串"DrEvil"。每次输入密钥可能会很繁琐,因此可以通过创建名为"bomb_idea.txt"的文件来存储所有的拆弹密码如下
并使用命令
./bomb bomb_idea.txt
来运行可执行文件。如果每一关调试结束后,我们可以将新的拆弹密码写入".txt"文件,这样就可以通过验证是否爆炸来避免重复输入之前关卡的拆弹密码。
系统提示成功找到了secret phase!
开始分析secret_phase内容:
Secret_phase汇编代码的解释内容如下:
由于 fun7 函数是调用 phase_defused 函数之前的最后一个函数,因此如果 fun7 函数的返回值 %eax = 2,那么炸弹就会被跳过,拆弹成功。因此需要对 fun7 函数进行分析。首先阅读 fun7 函数的源代码。
在gdb输入下列指令进行解析
x/150 0x6030f0
首先,查看0x6030f0中存放的数据,发现它类似于phase 6中的结构体。在6304xxx地址处应该是一个指针。同时,我们意外地发现,phase 6的指针数组就在下方。这里实际上是一个带有两个指针的结构体。前面的7个结构体的两个指针都是有值的,它们指向其他的结构体。而最后8个结构体的指针是没有值的,只有头部数据。这些指针所指的数据结构是一个二叉树。
fun7函数的逻辑较为复杂,为了便于之后的分析,将其转换为C语言的形式展示如下所示。
需要得到返回值 %eax=2,说明递归顺序为:
1.最底层得到0 return 0
2.向上经过一层 %eax = %eax*2 + 1 得到1 return 1
3.再向上经过一层% eax = %eax*2 得到2 return 2
p所指向的数据结构是二叉搜索树,该树的结构为p = p + 0x10是加载右结点,p = p + 0x8是加载左结点。返回路径如下:
分析可得顺推思路:
1.首先,我们来到二叉树的首地址0x6030f0,对应的数据为36。因为36需要大于x,才能使得%eax = %eax*2成立。因此,指针值应该是%rdi + 8,即加载左结点。指针值为6304016,查看得到值为8。
2.在前文提到的分析过程中,需要注意节点 8 对应的位置。根据题目要求,需要让 %eax 的值乘 2 后再加 1,因此 8 的值需要小于等于 x。根据代码逻辑,我们需要加载右子节点,因此指针值为 0x603110 + 16,即 6304080。通过查看该位置内存的值,我们可以得到节点 8 的值为 22。因此可以推断出,对于输入的 x 值,当 x 大于等于 11 时,答案为 x*2+1;当 x 小于 11 时,答案为 fun7(0x6030f0, x)。
3.最后我们得到了数据22,当我们输入22的时候,因为和指针所处位置对应头部数据的值相等,所以%eax = 0。
因此22为可行解,如下。
在查看22对应的位置时,我们发现该位置还有两个指针,并且不是空指针。我们猜想,如果22大于所需解码,返回值为%eax = %eax*2,同样符合要求。那么指针值应该为0x603150 + 8,即加载左结点。指针值为6304368,查看得到值为20。然而,该位置指针为空,不再继续指向下一结点。因此,20也是一个可行解。
终端验证:
在bomb_idea.txt文件末尾添加20 22如下:
在终端输入
./bomb bomb_idea.txt
系统显示全部关卡通关成功。
🍀2.4 实验结果
以上代码均存储在bomb_idea.txt文件中,每行代表对应的关卡,各阶段密钥如下所示:
在终端输入
./bomb result.txt
显示全部通关。
🍀2.5 实验体会
-
实验环境深刻: BombLab实验在CSAPP课程中为学习者提供了深入理解计算机系统的机会。通过搭建实验环境,深刻感受了底层系统编程的挑战与乐趣。
-
逆向分析揭秘奥秘: 解密Secret_phase成为实验的重点,透过逆向分析的手法,揭示了程序内部的隐藏逻辑。这一过程不仅考验了逻辑思维,也拓展了对程序运行机制的认识。
-
程序攻击实战体验: 通过实际的程序攻击,实战演练了对炸弹的拆解过程。这不仅对计算机系统安全性有了更深层次的认识,同时也提高了解决问题和调试技能。整个实验过程既充实又充满挑战,为深入学习计算机系统打下了坚实基础。
📝 总结
计算机系统的世界,如同一座未被揭示奥秘的古老迷宫,引领你勇敢踏入计算机科学的神秘领域。CSAPP的Bomblab实验便是这场独特的学习冒险,从基本概念到底层实现,逐步揭示更深层次的计算机系统内核、汇编语言和数据结构的奥秘。
渴望挑战计算机系统中的安全学习路径和掌握底层系统编程的技术?不妨点击下方链接,一同探讨更多计算机科学的奇迹吧。我们推出引领趋势的💻 计算机科学专栏:
,旨在深度探索计算机系统中安全编程技术的实际应用和创新。🌐🔍
- 点赞
- 收藏
- 关注作者
评论(0)