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

news2025/1/16 17:58:11

📋 前言

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++篇】讲解string容器及其操作

文章目录 &#x1f354;简述string容器⭐字符串拼接操作⭐查找和替换⭐字符串比较⭐插入和删除⭐获取字串 &#x1f354;简述string容器 在C STL中&#xff0c;string是一个字符串容器&#xff0c;它封装了字符串相关的操作&#xff0c;提供了很多方便的方法来处理字符串。 具…

k8s搭建(三、k8s从节点创建)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

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

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

元道经纬相机信息化赋能光伏电站运维管理

近年来&#xff0c;我国光伏产业高速发展&#xff0c;尤其以分布式光伏发电项目增长迅速&#xff0c;为更好服务新能源发电&#xff0c;大力推广电能替代。与此同时&#xff0c;电力企业亟需改变落后的管理模式&#xff0c;借助信息化软件提升管理效率。 为了进一步提升光伏电…

C++ 一个有bug的贪吃蛇。。。。。。。。

C 一个有bug的贪吃蛇。。。。。。。。 #include <graphics.h> #include<Windows.h> #include<Mmsystem.h> #include<conio.h> #include<time.h> #include<stdio.h> #include<easyx.h> using namespace std; #pragma warning(di…

百度飞桨文心生态成果最新披露:开发者达1070万 模型数超86万

前言 12月28日&#xff0c;由深度学习技术及应用国家工程研究中心主办的WAVE SUMMIT深度学习开发者大会2023在北京召开。百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰现场公布了飞桨文心五载十届最新生态成果&#xff0c;文心一言最新用户规模破1亿&#xf…

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

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

UEFI模拟环境搭建——windows+EDKII

目录 0 说明 1 安装软件 1.1 VS2019的安装 1.2 Python的安装 1.3 IASL的安装 1.4 NASM的安装 1.5 git的下载 2 EDKII的下载 3 配置环境 0 说明 个人感觉UEFI的环境搭建非常复杂&#xff0c;在经过很长一段折磨后&#xff0c;终于还是搭建成功&#xff0c;写下来记录一…

Jenkins实战指南:实现自动化代码拉取和Harbor私有镜像仓库上传

前两篇中&#xff0c;介绍了如何搭建个人私有镜像仓库Harbor&#xff0c;并编写了一个goweb项目进行打包上传&#xff0c;本文则继续介绍如何利用jenkins 实现自动打包镜像并上传。 《云原生必备工具&#xff01;手把手教你搭建Harbor私有仓库(上)》 搭建jenkins mkdir jenk…

二叉树简单题|对称、翻转、合并二叉树

二叉树简单题|对称、翻转、合并二叉树 文章目录 二叉树简单题|对称、翻转、合并二叉树模板代码101 对称二叉树226 翻转二叉树617 合并二叉树 模板代码 private boolean process(TreeNode p, TreeNode q) {if (p null && q null) {return ;} else if (p null &&…

「微服务」微服务架构中的数据一致性

在微服务中&#xff0c;一个逻辑上原子操作可以经常跨越多个微服务。即使是单片系统也可能使用多个数据库或消息传递解决方案。使用多个独立的数据存储解决方案&#xff0c;如果其中一个分布式流程参与者出现故障&#xff0c;我们就会面临数据不一致的风险 - 例如在未下订单的情…

【网络安全 | Misc】世安杯 Banmabanma

该题考察图片隐写 正文 压缩包解压后得到如图png&#xff1a; 很明显是个条形码的图片隐写题&#xff0c;放入网站进行识别即可&#xff1a; https://online-barcode-reader.inliteresearch.com/flag{TENSHINE}

【C语言】程序练习(二)

大家好&#xff0c;这里是争做图书馆扫地僧的小白。 个人主页&#xff1a;争做图书馆扫地僧的小白_-CSDN博客 目标&#xff1a;希望通过学习技术&#xff0c;期待着改变世界。 目录 前言 一、运算符练习 1 算术运算符 1.1 练习题&#xff1a; 2 自加自减运算符 3 关系运…

Vulnhub-Al-Web-1.0 靶机复现完整过程

一、信息收集 1.主机发现 arp-scan -l2.端口扫描 nmap -sV -p- 192.168.200.16PORTSTATESERVICEVERSIONMAC Address80/TCPOpenhttpApache httpd00:0C:29:C4:1B:78 (VMware) 3.目录扫描 python dirsearch.py -u http://192.168.200.16扫描出来这两个文件&#xff0c;首先先…

MATLAB中./和/,.*和*,.^和^的区别

MATLAB中./和/&#xff0c;.*和*&#xff0c;.^ 和^ 的区别 MATLAB中./和/&#xff0c;.*和*&#xff0c;.^ 和^ 的区别./ 和 / 的区别.//实验实验结果 .* 和 * 的区别.**实验实验结果 .^ 和^ 的区别.^n^n实验运行结果 MATLAB中./和/&#xff0c;.和&#xff0c;.^ 和^ 的区别 …

腾讯云轻量服务器和云服务器CVM该怎么选?区别一览

腾讯云轻量服务器和云服务器CVM该怎么选&#xff1f;不差钱选云服务器CVM&#xff0c;追求性价比选择轻量应用服务器&#xff0c;轻量真优惠呀&#xff0c;活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三…

gitee+picgo+typora图床搭建

giteepicgotypora图床搭建 1.安装typora 官网下载直接安装&#xff1a;https://www.typora.io/#download 2.编辑typora图像设置 打开 文件 -> 偏好设置 -> 图像设置 插入图片时 选择 上传图片设置 上传服务 为 PicGo-Core(command line) 3.为typora安装PicGo-Core 点…

怎么设置Facebook双重验证,让Facebook账号更稳定?

对于跨境电商而言&#xff0c;Facebook 账号被封是常有的事&#xff0c;原因之一可能是没有给 Facebook 设置双重验证&#xff0c;今天就和大家科普一下什么是 Facebook双重验证以及如何设置&#xff0c;另外&#xff0c;作为跨境卖家&#xff0c;我们还需要了解如何保护 Faceb…

群晖(Synology)Plex 的服务找不到文件夹

当 Plex 在搜索 NAS 上的文件夹的时候找不到文件夹中的内容。 如下图中显示的内容。 上面的 Public 文件夹中找不到我们的子文件夹&#xff0c;但是我们的子文件夹是有内容的。 问题和解决 出现上面的问题主要还是权限的问题。 选择需要访问的文件夹&#xff0c;然后在文件…

【数据结构】C语言实现单链表的基本操作

单链表基本操作的实现 导言一、查找操作1.1 按位查找1.1.1 按位查找的C语言实现1.1.2 按位查找的时间复杂度 1.2 按值查找1.2.1 按值查找的C语言实现1.2.2 按值查找的时间复杂度 二、插入操作2.1 后插操作2.2 前插操作 三、删除操作结语 导言 大家好&#xff0c;很高兴又和大家…