商城网站建设报价表,推荐常州模板网站建设,贵阳seo排名,集团网站设计开发#x1f4cb; 前言 #x1f308;个人主页#xff1a;Sarapines Programmer#x1f525; 系列专栏#xff1a;《斯坦福大学之CSAPP》⏰诗赋清音#xff1a;桃花灼灼春风暖#xff0c;心随乐曲扬徐徐。 苦尽甘来梦未阑#xff0c;岁月长河任舟游。 #x1f389;欢迎… 前言 个人主页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 Programmers Perspective》由Randal E. Bryant和David R. OHallaron编写。该书的主要目标是帮助深入理解计算机系统的工作原理包括硬件和软件的相互关系其涵盖了计算机体系结构、汇编语言、操作系统、计算机网络等主题旨在培养学生系统级编程和分析的能力。 1.2 Bomb
Bomb实验 是与CSAPP教材相关的一项编程实验。它是一种反汇编和逆向工程任务旨在教授如何分析和解决复杂的程序问题。Bomb实验的目标是解开一系列的炸弹每个炸弹都有不同的解锁方法需要分析程序的汇编代码理解其工作原理并找到正确的输入来解除炸弹。这个实验教授了计算机系统的底层知识包括汇编语言和程序执行的原理。
CSAPP BombLab实验解决源码亲测有效 2. bomb
2.1 实验环境
VMware Workstation虚拟机环境下的Ubuntu 64位。 2.2 实验过程
实验准备阶段首先需要使用ubuntu联网环境跳转到链接下载实验所需的bomblabBomblab源文件
下载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_10x17根据前面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 实验体会 挑战解密阶段 在CSAPP的BombLab实验中我迎接了解密阶段Phase_1的挑战。通过逆向工程和深入分析程序逻辑我成功解开了这个阶段的谜题。这一过程锻炼了我的逻辑思维和逆向分析能力。 实践与应用 实验过程中我将理论知识与实际应用相结合。掌握了汇编语言和程序设计的基本原理后我能够灵活应用这些知识通过程序攻击的手段成功完成解密任务深刻理解了理论知识在实践中的价值。 启发与收获 解密Phase_1不仅是一次实验更是一次深度思考和学术启发的过程。通过这个实验我不仅获得了对计算机系统底层原理的更深层次理解同时也培养了解决问题的实际技能为将来的学术和职业发展奠定了坚实基础。 总结
计算机系统的世界如同一座未被揭示奥秘的古老迷宫引领你勇敢踏入计算机科学的神秘领域。CSAPP的Bomblab实验便是这场独特的学习冒险从基本概念到底层实现逐步揭示更深层次的计算机系统内核、汇编语言和数据结构的奥秘。
渴望挑战计算机系统中的安全学习路径和掌握底层系统编程的技术不妨点击下方链接一同探讨更多计算机科学的奇迹吧。我们推出引领趋势的 计算机科学专栏《斯坦福大学之CSAPP》旨在深度探索计算机系统中安全编程技术的实际应用和创新。