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

📋 前言

​🌈个人主页:Sarapines Programmer
🔥 系列专栏:《斯坦福大学之CSAPP》

⏰诗赋清音:桃花灼灼春风暖,心随乐曲扬徐徐。 苦尽甘来梦未阑,岁月长河任舟游。


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

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

目录

📋 前言

🌺1. CSAPP与Bomb简介

🍀1.1 CSAPP

🍀1.2 Bomb

🌺2. bomb

🍀2.1 实验环境

🍀2.2 实验过程

🍀2.3 phase_2

🍀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 BombLab实验解决源码(亲测有效!!!)


🌺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_2

phase_2是一个需要解密密码的关卡,需要输入一个字符串来解锁该关卡。如果输入的字符串符合要求,则可以成功通关,否则会引爆炸弹,导致失败。

进入反汇编文件bomb.asm

vim bomb.asm

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

/phase_2

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

1.push   %rbp: 将寄存器%rbp的值压入栈中。

2.push   %rbx: 将寄存器%rbx的值压入栈中。

3.sub    $0x28,%rsp:修改栈指针寄存器 %rsp 的值,以便在栈上分配一段新的空间。

3.callq  40145c <read_six_numbers>:调用一个名为"read_six_numbers"的函数。

5.je     400f30 <phase_2+0x34>:进行条件跳转。在该指令中,je 表示条件跳转指令,400f30 <phase_2+0x34> 是跳转目标地址,表示如果前面的条件成立,则会跳转到这个地址处执行后续的指令

……

可以发现phase_2函数有以下几个步骤:

  1. 将数据压入栈中;
  2. 减少栈指针40,为局部变量提供空间;
  3. 将栈指针存入%rsi寄存器中;
  4. 调用两个explode_bomb函数;
  5. 调用read_six_numbers函数读取6个数字。

尝试随意输入6个数字,如下:

为了解题,需要使%rsp的值为1,以便程序执行jmp指令跳过explode_bomb函数。jmp指令的目标地址是400f30,对应的指令为lea,用于加载有效地址。在调用read_six_numbers函数时,需要输入6个数字,该函数的地址为40145c,可以发现401480: mov $0x4025c3,%esi ,类似Phase 1向寄存器中转入数据(对应字符串),于是输入print (char*)0x4025c3进行测试,结果如下:

说明密钥需要6个整型数。回到phase_2反汇编进行分析,可以分析有一个循环,此时,结果上述循环,各寄存器对应的值如下:

%rbx

%rbp

%eax

%rsp+4

%rsp+24

(%rsp)*2=2

%rsp+8

(%rsp+4)*2=4

%rsp+12

(%rsp+8)*2=8

%rsp+16

(%rsp+12)*2=16

%rsp+20

(%rsp+16)*2=32

%rsp+24

循环部分对应C代码

int i;
int a[6];
a[0] = 1;
for(i=1;i<6;i++)
{
     a[i] = a[i-1]*2;
}

该代码段实现了对一组数的比较操作,并判断其中是否存在某个数是前一个数的2倍。这段代码是汇编语言的实现,对于不熟悉汇编语言的人来说,可能比较难懂。对这段代码进行详细的解析。

1.这段代码是一个循环操作,它对一组数进行比较,并且判断其中是否存在某个数是前一个数的2倍。这组数存储在栈中,栈顶元素即为第一个数。 在代码执行的开始,我们可以看到一条cmp指令,它将栈顶元素与立即数0x1进行比较。如果相等,说明第一个输入数为1,此时会跳转到地址400f30处;如果不相等,说明第一个输入数不是1,此时会跳转到地址400f17处。

2.在地址400f30处,我们可以看到两条lea指令,它们将%rsp+4和%rsp+24对应的地址分别存储到%rbx和%rbp寄存器中。%rbx寄存器存储的是第二个输入数的地址,%rbp寄存器存储的是第六个输入数后面的地址。

3.代码跳转到地址400f17处。可以看到sub指令,它将%rbx的值减去4,并将其对应的内存地址中的值(即前一个数)存储到%eax寄存器中。接着,将%eax的值乘以2,并将其与%rbx对应的内存地址中的值(即当前数)进行比较。如果相等,说明当前数是前一个数的2倍,此时会跳转到地址400f25处;如果不相等,说明当前数不是前一个数的2倍,此时会跳转到地址400f17处。

4.在地址400f25处,我们可以看到一条add指令,它将%rbx的值加上4。接着,代码会判断%rbx的值是否等于%rbp的值,如果不相等,则说明还没有处理完所有的数,此时会跳转到地址400f17处;如果相等,则说明已经处理完所有的数,此时会跳转到地址400f3c处,结束循环。 在循环中,代码会从栈中逐个取出这些数,并进行比较操作。如果存在某个数是前一个数的2倍,代码会跳转到地址400f25处,否则会跳转到地址400f17处。这个循环会一直执行,直到处理完所有的数,才会跳转到地址400f3c处,结束循环。

通过以上的分析,可以得到这组数的具体值。这组数分别为1,2,4,8,16,32。

在终端输入

./bomb

填入密钥

1 2 4 8 16 32

结果显示phase_2通关。

综上所述,解决phase_2的过程的难点是分析反汇编代码的循环部分,找到循环结束的位置,在循环中,代码会从栈中逐个取出这些数,并进行比较操作。如果存在某个数是前一个数的2倍,代码会跳转到地址400f25处,否则会跳转到地址400f17处。这个循环会一直执行,直到处理完所有的数,才会跳转到地址400f3c处,结束循环。

Phase_2中每句代码的作用解释如下所示。

0000000000400efc <phase_2>:
  400efc:  55                       push   %rbp    //把数据压入栈
  400efd:  53                       push   %rbx   //把数据压入栈
  400efe:  48 83 ec 28              sub    $0x28,%rsp //把栈指针减少40,提供局部变量空间
  //申请空间
  400f02:  48 89 e6                 mov    %rsp,%rsi  //把栈指针状态存入%rsi中
  400f05:  e8 52 05 00 00           callq  40145c <read_six_numbers>  // 调用函数read_six_numbers,读取6个数字,此时(%rsp)已被赋值
 400f0a:   83 3c 24 01              cmpl   $0x1,(%rsp)  //(%rsp)的值即输入的第一个参数的值,将(%rsp)的值与1比较
  400f0e:  74 20                    je     400f30 <phase_2+0x34> //若相等则跳转至400f30
  400f10:  e8 25 05 00 00           callq  40143a <explode_bomb>  //否则爆炸
  400f15:  eb 19                    jmp    400f30 <phase_2+0x34>  //jmp指令无条件跳转,直接跳转至400f30
  400f17:  8b 43 fc                 mov    -0x4(%rbx),%eax
  400f1a:  01 c0                    add    %eax,%eax      //%eax的值*2
  400f1c:  39 03                    cmp    %eax,(%rbx)    //比较%eax的值和此时%rbx对应的内存的值
  400f1e:  74 05                    je     400f25 <phase_2+0x29>    //若相等则跳转至400f25
  400f20:  e8 15 05 00 00           callq  40143a <explode_bomb>     //否则爆炸
  400f25:  48 83 c3 04              add    $0x4,%rbx        //%rbx的值(地址)加4
  400f29:  48 39 eb                 cmp    %rbp,%rbx        //比较两个寄存器的值,判断是否比较完6个数
  400f2c:  75 e9                    jne    400f17 <phase_2+0x1b>   //若不相等,则进行跳转至400f17,即循环没结束
  400f2e:  eb 0c                    jmp    400f3c <phase_2+0x40>   //否则直接跳转至400f3c,循环结束标志
  400f30:  48 8d 5c 24 04           lea    0x4(%rsp),%rbx       //将%rsp+4代表的地址移入%rbx,即第2个输入数的地址
  400f35:  48 8d 6c 24 18           lea    0x18(%rsp),%rbp      //将%rsp+24代表的地址移入%rbp,即第6个输入数的后一块地址
  400f3a:  eb db                    jmp    400f17 <phase_2+0x1b>    //直接跳转至400f17
  //释放空间
  400f3c:  48 83 c4 28              add    $0x28,%rsp
  400f40:  5b                       pop    %rbx
  400f41:  5d                       pop    %rbp
  400f42:    c3                       retq

🍀2.4 实验结果

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

在终端输入

./bomb result.txt

显示全部通关。


🍀2.5 实验体会

  1. 解密挑战: 在CSAPP的BombLab实验中,Phase_2成为了一次解密的重大挑战。通过逆向工程和仔细分析程序逻辑,成功理解了Phase_2的设计思想,揭示了其中隐藏的奥秘。

  2. 实战经验: 实验过程中,通过灵活运用逆向技术和调试工具,顺利攻克了Phase_2的难题。实战经验让我更加熟悉了计算机系统底层的运行机制,为后续学习和实践奠定了坚实基础。

  3. 深刻领悟: 通过探究Phase_2,不仅在技术上有所提升,更对计算机系统的安全性和程序设计的复杂性有了更深刻的领悟。这次实验不仅仅是技术挑战,更是对计算机科学精髓的一次深刻探索。


📝 总结 

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/275592.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cnPuTTY 0.80.0.1—PuTTY Release 0.80中文版本简单说明~~

2023-12-18 官方发布了PuTTY 0.80本次发布主要是针对Terrapin攻击(CVE-2023-48795)的修改发布。 更多详细的内容请查看PuTTY Change Log。 有关Terrapin攻击可用简单参考&#xff1a;警告&#xff01;&#xff01;&#xff01;Terrapin攻击(CVE-2023-48795)~~~ 为了缓解此漏洞…

【线性代数】通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗?

一、通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗&#xff1f; 如果你进行的矩阵乘法涉及一个线性方程组 Ax b&#xff0c;并且你乘以一个可逆矩阵 M&#xff0c;且产生新的方程组 M(Ax) Mb&#xff0c;那么这两个系统是等价的&#xff1b;它们具有相同的解集。这…

【unity3D-粒子系统】粒子系统主模块-Particle System篇

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的粒子系统主模块-Particle System 基础知识 Particle System 介绍&#xff1a;粒子系统的主模块&#xff0c;是必需的模块&#x…

在线客服系统推荐:提升客户满意度与工作效率的利器

客服系统分为售前和售后&#xff0c;售前客户系统是为了能够及时解决客户在购买产品前的问题&#xff0c;通过客服人员让客户了解产品的功能点是能够满足他们的需求点&#xff0c;从未达到转化的目的。 而售后客户系统主要是提供给购买后的客户强大的产品售后支持&#xff0c;…

PiflowX组件-DataGen

DataGen组件 组件说明 按数据生成规则模拟数据。在开发和演示场景下使用比较方便。具体可以查看Flink官方DataGen connector。 计算引擎 flink 有界性 字段的数据全部生成完成后&#xff0c;source 就结束了。 因此&#xff0c;有界性取决于字段的有界性。 组件分组 co…

SQL Server 索引和视图

CSDN 成就一亿技术人&#xff01; 难度指数&#xff1a;* * * CSDN 成就一亿技术人&#xff01; 目录 1.索引 什么是索引&#xff1f; 索引的作用&#xff1f; 索引的分类 1. 唯一索引 2. 主键索引 3. 聚集索引 4.非聚集索引 5.复合索引 6.全文搜索 索引的创建&am…

Springboot拦截器及统一异常处理

文章目录 一、Java中异常相关概念1、异常类2、异常处理方法3、注意事项4、自定义异常 二、配置全局异常处理1、统一返回体定义2、定义异常处理实现类3、全局异常处理类 三、Springboot拦截器1、定义拦截器2、注册拦截器 四、验证效果 一、Java中异常相关概念 1、异常类 Throw…

C语言—每日选择题—Day64

前言 两天没更新了&#xff0c;作者在复习期末考试&#xff0c;更新一波&#xff0c;祝大家都能顺利通过期末考试&#xff01;&#xff01;&#xff01; 指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博…

javaWebssh民宿管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh民宿管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模 式开发。开发环境为TOMCAT7.0,My…

【高可用】使用Keepalived实现SFTP服务的高可用

使用Keepalived实现SFTP服务的高可用 背景 这个事情的背景是生产环境的数据采集流程时不时会出问题&#xff08;这个也是不可避免的&#xff09;&#xff0c;目前的处理手段是&#xff1a;所有的数据接口服务器&#xff08;也就是存放原始数据等待采集的服务器&#xff09;都…

完全背包问题,原理剖析,公式推导,OJ详解

文章目录 前言一、完全背包的状态设计1、状态设计2、状态转移方程3、对比0/1背包问题4、时间复杂度分析 二、完全背包问题的优化1、时间复杂度优化2、空间复杂度优化 三、OJ练习裸题完全背包离散化最小值 前言 完全背包问题&#xff0c;相比0/1背包问题&#xff0c;实就每个物品…

git unable to create temporary file: No space left on device(git报错)

1.问题 1.1 vscode中npm run serve跑项目的时候&#xff0c;进度达到95%的时候一直卡着无进度&#xff1b; 1.2 git命令提交代码报错&#xff1b; 2.具体解决 这个错误通常表示你的磁盘空间已经满了&#xff0c;导致 Git 无法在临时目录中创建文件。2.1 清理磁盘空间&#xf…

浅谈IDC数据中心机房低压配电系统的组成与设计

随着我国移动互联网技术的不断发展&#xff0c;海量的数据资源日益庞大&#xff0c;IDC数据中心存储着这些大量的数据信息&#xff0c;其蕴含着巨大的研究和商业价值&#xff0c;因此数据中心IT设备的运行应具有较高的可靠性和稳定性。数据中心供配电系统是为机房内所有需要动力…

身份自动化工作流,帮助您快速提高工作效率

从工业革命初期&#xff0c;自动化流水线生产以机械设备取代人力的方式&#xff0c;成功地使工人解脱了繁重的体力工作&#xff0c;极大地减少了因人为差错而引发的问题。然而&#xff0c;在现代企业管理中&#xff0c;许多管理人员仍处在繁琐的手动维护大量身份信息的机械操作…

Python 爬取 哔站视频弹幕 并实现词云图可视化

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境介绍: python 3.8 解释器 pycharm 编辑器 第三方模块: requests >>> pip install requests protobuf >>> pip install protobuf 如何安装python第三方模块: win R 输入 cmd 点击确定, 输入安装命…

软件测试面试(面试前一定要做的准备)

目录 一、问题预测 1. 让简单介绍下自己&#xff08;每次面试开场&#xff09; 2. 让说下自己会的内容 3. 看了哪些书籍&#xff08;有问到&#xff09; 4. 了解过哪些技术博客/论坛&#xff08;有问到&#xff09; 5. 是否了解软件测试需要掌握哪些知识&#xff08;问到…

【快速全面掌握 WAMPServer】03.玩转安装和升级

网管小贾 / sysadm.cc 大多数情况我们在了解和学习任何一款软件之前都会先去尝试一下软件的安装&#xff0c;毕竟只有安装好了软件&#xff0c;再通过使用它来进一步学习和掌握。 那么同样的道理&#xff0c;我们要学习和掌握如何动手搭建 PHP 的调试环境&#xff0c;那么作为…

千巡翼X4轻型无人机 赋能智慧矿山

千巡翼X4轻型无人机 赋能智慧矿山 传统的矿山测绘需要大量测绘员通过采用手持RTK、全站仪对被测区域进行外业工作&#xff0c;再通过方格网法、三角网法、断面法等进行计算&#xff0c;需要耗费大量人力和时间。随着无人机航测技术的不断发展&#xff0c;利用无人机作业可以大…

Jupyter Notebook 开启远程登录

Jupyter Notebook可以说是非常好用的小工具&#xff0c;但是不经过配置只能够在本机访问 安装jupyter notebook conda install jupyter notebook 生成默认配置文件 jupyter notebook --generate-config 将会在用户主目录下生成.jupyter文件夹&#xff0c;其中jupyter_noteb…

Vue ThreeJs实现银河系行星运动

预览 可通过右上角调整参数&#xff0c;进行光影练习 代码 <template><div id"body"></div> </template> <script>import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls import …