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

举报
SarPro 发表于 2024/02/04 23:14:50 2024/02/04
【摘要】 这篇博文深入探讨了CSAPP(Computer Systems: A Programmer's Perspective)课程中的BombLab实验,着重解密了其中的Phase_1,并提供了实战经验。通过分析汇编语言、逆向工程等关键概念,揭示了计算机系统底层原理的奥秘。文章深度剖析了BombLab实验的挑战性,引导读者逐步理解并攻克实验阶段,为学习者提供了一场真实而深刻的计算机科学之旅。

1.gif

7dd2b7f171704327b7d8987c49da4628.gif

🌈个人主页:SarPro
🔥 系列专栏:《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_1

phase_1是一个二进制炸弹,需要输入一个字符串作为密码才能解除炸弹,否则炸弹会爆炸。

进入反汇编文件bomb.asm,

vim bomb.asm

在未插入处输入下列指令以查找phase_1的位置。

/phase_1

​​

分析反汇编代码的phase_1部分内容如下:

1.Sub $0x8,%rsp含义是把将栈顶指针(%rsp)向下移动8个字节,相当于在栈顶分配8个字节的空间。这通常用于在程序中为局部变量或者函数参数分配空间。由于栈是向下生长的,这条指令会将栈顶指针减去8,使得栈顶指针指向的位置向下移动8个字节。


2.mov $0x402400,%esi:将立即数0x402400移动到寄存器%esi中。在汇编语言中,%esi是通用寄存器之一,用于存储指针或者数据,这条指令的作用是将0x402400这个数值存储到%esi寄存器中,以便在后续的指令中使用。


3.callq 401338 <strings_not_equal>:将strings_not_equal函数调用的返回地址压入栈中,并跳转到strings_not_equal函数的起始地址开始执行。在strings_not_equal函数执行完成后,执行流程会返回到该指令之后的下一条指令,继续执行程序。


4.test %eax,%eax:将寄存器%eax中的值与自身进行按位与运算,并更新标志寄存器的状态该指令执行的结果会影响标志寄存器中的零标志(ZF)和符号标志(SF)的状态,这两个标志是CPU用于判断运算结果是否为零或者是否为负数的标志。 如果%eax的值为零,则ZF标志将被设置为1,否则将设置为0;如果%eax的值为负数,则SF标志将被设置为1,否则将设置为0。 test %eax, %eax经常用于条件分支的判断,例如在判断%eax是否为0的时候,可以使用test %eax, %eax指令来判断。如果ZF标志被设置为1,则说明%eax等于0,否则%eax不等于0。


5.je 400ef7 <phase_1+0x17>:根据前面cmp指令的比较结果,如果两个字符串相等,那么跳转到phase_1 + 0x17地址处继续执行。如果两个字符串不相等,则不会跳转,继续执行下一条指令。在该程序中,phase_1 + 0x17地址处是程序正常执行的下一条指令,也就是当输入的字符串正确时,程序会继续执行下去,否则会引爆炸弹,程序结束。


6.callq  40143a <explode_bomb>:调用"explode_bomb"函数,发生爆炸。


7.add $0x8,%rsp: 将栈指针寄存器 %rsp 的值加上常量值 0x8,以释放栈上的8个字节空间。在程序执行过程中,栈指针寄存器 %rsp 会随着程序的运行而不断变化,当需要释放栈上的空间时,就需要执行这条指令来调整栈指针的值,以释放相应的空间。


8.retq: 从函数中返回。

分析发现phase_1函数调用了函数strings_not_equal。在该函数被调用之前,程序将用户输入的字符串作为第一个参数传递给了strings_not_equal函数。这个字符串是用户在运行程序时输入的,它将作为密码来解除炸弹。这个字符串保存在%eax寄存器中,因此可以推断:程序会将用户输入的字符串作为第一个参数传递给strings_not_equal函数。

查看strings_not_equal函数的实现,该函数会将两个字符串进行比较,并返回比较结果。在反汇编代码中,可以看到调用strcmp函数的汇编指令。strcmp函数返回0表示两个字符串相等,否则它们不相等。因此可以得出结论:strings_not_equal函数返回一个非零值表示两个字符串不相等,返回0表示两个字符串相等。

根据汇编代码中的操作,可以发现password字符串保存在了内存地址0x402400处,需要将该地址中的字符串作为比较的第二个参数传递给strings_not_equal函数,故可以得出当比较结果为0时,程序不会引爆炸弹,只需要输入password字符串即可解除炸弹。

打开终端输入

gdb bomb

在gdb输入

print (char*)0x402400

结果返回得到密钥“Border relations with Canada have never been better.”。

​​​

在终端输入

./bomb

填入phase_1返回的密钥:

Border relations with Canada have never been better.

结果显示phase_1通关。

​​综上所述,解决phase_1的过程是分析反汇编代码,找到password字符串的位置,并将该字符串与输入的字符串进行比较。如果比较结果为0,则炸弹解除;否则,炸弹会爆炸。


​​

该循环根据输入数将链表中对应的第输入数个结点的地址复制到 0x20(%rsp) 开始的栈中


🍀2.4 实验结果

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

​​​​

在终端输入

./bomb result.txt

显示全部通关。

​​​


🍀2.5 实验体会

  1. 挑战解密阶段: 在CSAPP的BombLab实验中,我迎接了解密阶段(Phase_1)的挑战。通过逆向工程和深入分析程序逻辑,我成功解开了这个阶段的谜题。这一过程锻炼了我的逻辑思维和逆向分析能力。

  2. 实践与应用: 实验过程中,我将理论知识与实际应用相结合。掌握了汇编语言和程序设计的基本原理后,我能够灵活应用这些知识,通过程序攻击的手段成功完成解密任务,深刻理解了理论知识在实践中的价值。

  3. 启发与收获: 解密Phase_1不仅是一次实验,更是一次深度思考和学术启发的过程。通过这个实验,我不仅获得了对计算机系统底层原理的更深层次理解,同时也培养了解决问题的实际技能,为将来的学术和职业发展奠定了坚实基础。


📝 总结 

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

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

​​7dd2b7f171704327b7d8987c49da4628.gif

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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