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

2023-12-29 01:52

本文主要是介绍【CSAPP】探究BombLab奥秘:Phase_1的解密与实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

📋 前言

​🌈个人主页:Sarapines Programmer
🔥 系列专栏:《斯坦福大学之CSAPP》
⏰诗赋清音:桃花灼灼春风暖,心随乐曲扬徐徐。 苦尽甘来梦未阑,岁月长河任舟游。


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

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

目录

📋 前言

🌺1. CSAPP与Bomb简介

🍀1.1 CSAPP

🍀1.2 Bomb

🌺2. bomb

🍀2.1 实验环境

🍀2.2 实验过程

🍀2.3 phase_1

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

这篇关于【CSAPP】探究BombLab奥秘:Phase_1的解密与实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/548002

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation:做参数校验Mybatis:做数据库的操作Redis:做缓存Junit:单元测试项目部署:springboot项目部署相关的知识 (3)前端 Vite:Vue项目的脚手架Router:路由Pina:状态管理Eleme

深度学习实战:如何利用CNN实现人脸识别考勤系统

1. 何为CNN及其在人脸识别中的应用 卷积神经网络(CNN)是深度学习中的核心技术之一,擅长处理图像数据。CNN通过卷积层提取图像的局部特征,在人脸识别领域尤其适用。CNN的多个层次可以逐步提取面部的特征,最终实现精确的身份识别。对于考勤系统而言,CNN可以自动从摄像头捕捉的视频流中检测并识别出员工的面部。 我们在该项目中采用了 RetinaFace 模型,它基于CNN的结构实现高效、精准的

项目实战系列三: 家居购项目 第四部分

购物车 🌳购物车🍆显示购物车🍆更改商品数量🍆清空购物车&&删除商品 🌳生成订单 🌳购物车 需求分析 1.会员登陆后, 可以添加家居到购物车 2.完成购物车的设计和实现 3.每添加一个家居,购物车的数量+1, 并显示 程序框架图 1.新建src/com/zzw/furns/entity/CartItem.java, CartItem-家居项模型 /***