深入理解计算机系统 CSAPP lab:bomb

实验资源下载地址:csapp.cs.cmu.edu/3e/labs.html 请先查看writeup

解压后

当我们运行bomb时,发现该程序要求我们输入行,如果输入错误,程序就会返回BOOM!!!提示我们失败了.

所以我们的目标是输入正确的行.以解开bomb程序.

实验前先详细阅读bomb.c

bomb文件是一个bomb.c编译后的程序,我们由于缺失一些头文件,所以无法编译bomb.c

让我们反编译bomb,以理清程序的具体实现,从而分析出我们要输入的行:

复制代码
objdump -d bomb > bomb.txt
phase_1:

我们可以看到在call strings_not_equal之前传入了一个参数 0x402400我们不知道这是什么,接着看.

call strings_not_equal之后 传入的%esi和%rsi是同一个寄存器,所以参数 0x402400被传到%rbp了,下面我们又看到有(%rbp)的指令很明显了,加载了0x402400,也就是0x402400是一个地址,此时我们希望在运行bomb的时候看一下0x402400地址上是什么东西.这里自然就想到书中和实验网页writeup中提到的gdb调试器了.

复制代码
gdb bomb

加个断点,只需要断在%esi接收到参数0x402400之后即可

复制代码
(gdb)b strings_not_equal

运行:

复制代码
(gdb)run

以字符串形式输出地址上的数据:

复制代码
(gdb)x/s 0x402400

关于gdb的命令,自己在网上查着,每个用一用就会了.

不查不知道一查吓一跳,原来是个字符串啊.我们再联想一下这个函数的名字strings_not_equal.不难猜到这是一个比较字符串的函数.我们把查到的字符串保存在a.txt文件中,然后传入bomb,这里先按ctrl+d退出gdb在运行bomb方便一些.

复制代码
./bomb a.txt

解开阶段一.

phase_2:

gdb命令查看寄存器的值:

复制代码
(gdb)i r

我们先在phase_2中打个断点然后一步步调试.

你看到phase_2里面有一个函数是read_six_numbers ,你就先随便数六个数进去,然后运行起来观察.scanf是如何读取六个数的哦?

第一步 用1和你输入的第一个数相比,相等就跳到0x400f30

第二步 加载你输入的第二个数的地址到 %rbx

第三步 读取第二步的地址减去4字节后的值到%eax 双倍%eax后和第二步的值比较

这三步是一次循环.每次循环对比%rbx和%rbx-4俩地址的值后 给%rbx+4

蓝色框表明的是循环结束的条件,%rbx还没到%rbp循环就继续.

用人话说就是,你输入六个数,先用1和你输入的第一个数相比,然后每次检查下一个数是不是上一个数的两倍,所以答案是1 2 4 8 16 32这六个咯

其实这个不难,但是要你静下心来慢慢看,慢慢来就是最快的~Keep going吧

phase_3:

phase_3还是读取数字的函数.

我们从 jmpq*0x402470(,%rax,8)中明白,这是一个根据%rax的间接跳转, (8乘以%rax)+0x402470计算出地址后跳转到该地址.

利用这个跳转,直接跳转到下方的任意一个mov指令即可 从0x400f7c-0x400fb9

0x402470减去0x400f98等于0x14d8等于5336

5336除以8等于667

所以第三个输入的数就是-667咯

相关推荐
HiDev_5 小时前
【非标自动化】2、认识元器件(数字量输入输出模块)
运维·自动化
桐桐桐6 小时前
Python 实战:批量生成带来源参数的 WhatsApp 短链 + 二维码
服务器·数据库·python·前端框架·ip·跨境电商·独立站
qq_349447956 小时前
在ollama下部署DeepSeek-r1模型(linux机器)
linux·运维·服务器
白猫不黑6 小时前
AI Agent自动化渗透测试实战:从原理到红队实践
运维·人工智能·web安全·网络安全·信息安全·渗透测试·自动化
hehelm6 小时前
仿muduo库实现高并发服务器—Channel类
linux·服务器·开发语言·网络·c++
七夜zippoe6 小时前
DolphinDB 2.x 集群监控运维平台实战:从指标采集到告警自愈
运维·集群·监控·告警·dolphindb·指标采集
末代iOS程序员华仔6 小时前
Cursor 编辑器 + Figma‑MCP 服务器(真正让 Codex 直接读取 Figma 链接,高级方案)
服务器·编辑器·figma
小此方6 小时前
Linux加餐(二):藏在Linux中的设计模式(二)单例模式与线程池
linux·单例模式·设计模式
猫吃了源码6 小时前
Linux系统制作 Ubuntu Server 24.04 启动U盘详细教程
linux·服务器·ubuntu
hehelm6 小时前
仿muduo库实现高并发服务器—EventLoop
linux·服务器·网络·c++