深入理解计算机系统bomb lab

Data lab

Wercker Wercker Wercker
pic

一:实验梗概

Dr.Evil在你的机器上埋了大量的“”二进制炸弹“,你的任务是输入字符串来拆除炸弹。如果输入了正确的字符串,炸弹将被拆除,否则 ”BOOM!!!“
加油吧,拆弹英雄们!!!



bomb lab共有6个关卡:
1-4关卡 10分一个5-6关卡 比较难,15分一个,总共70分

二:实验工具

①objdump

GNU专用debugger工具,简单好用。如果你从来没有debugger过,建议看看gdb Tutorial,下面列出一些该实验中需要的指令

指令 效果
run 开始运行程序
kill 结束运行
finish 执行完当前函数
nexti 执行一条指令(跳过子程序)
nexti 4 执行4条指令
stepi 执行一条指令
stepi 4 执行4条指令
print/format 打印表达式
break 设置断点
x/format 查看内存里的值
disas function 反汇编函数

其中format是:
n 打印几个单位
o(八进制) …x(十六进制)…d(十进制)…u(unsigned)…t(二进制)…f(浮点),s(字符串)
b(bytes)…h(halfword)…w(word)
例:

x/20b mem  打印地址mem的20个字节
x/s mem   打印地址mem的字符串    
print $esp    (是的,你没看错,在gdb里寄存器是用$前缀)    

②:objdump

objdump -t 反汇编程序

四:实验感受

这里写图片描述
为什么我要把最后的实验感受放在前面呢?因为这个实验深刻教育了我。
当我面对满屏黑漆漆的汇编代码的时候,内心有些小崩溃的,当我开始开始做实验的时候,根本不知道从哪里入手,手忙脚乱的输入指令,却没有一丝思路,内心崩溃程度50%。当终于找到路子,开始拆弹时,看到和cs:app里完全不同的汇编代码,他们混乱,复杂,你会有种盲人摸象的感觉,分析了好长时间的代码,发现根本不是重点,崩溃100%
但是,还是坚强QAQ地拆完了炸弹,写下了这篇blog。经过这一次拆弹体验,我才真正学会了调试,千言万语,尽在不言中。QwQ
所有如果你遇到困难,坚持做下去o( ̄▽ ̄)o
我总结了几个调试经验
①不要试图分析所有代码,分析关键,不然会很浪费时间。
②仔细分析跳转指令,是拆弹的关键
③不要放弃(ಥ _ ಥ)

三:实验步骤

① 我们先大致看看程序的符号表

输入 objdump -t |bomb less
ds
印入你眼前的,是恶心的代码。不要急,慢慢寻找线索。你会慢慢看到

phase_1
phase_2
......
explode_bomb

phase_1应该是关卡1函数的名字,explode_bomb应该是炸弹爆炸函数的名字。
好啦,得到这些信息后就可以开始调试了。

②Gdb调试开始

phase_1

首先设置断点,并运行程序

break phase_1
break explode_bomb
run


然后根据提示,输入第一关的密码。随便输入一个(我输入1234)
然后在反汇编phase_!函数

disas

pic1
看到了这个函数的汇编代码。好咯,开始干活了。

第四行 callq string_not_equaled
第五行:test %eax,%eax
第六行 je 0x4003f  <phase_1+23>
第七行: call explode_bomb

大概就明白了,首先调用函数string_not_equaled,如果返回值是0,拆弹成功,否则BOMB!!!
string_not_equaled,从名字上看,大概是判断字符串是否相等。那我们再运行到string_not_equaled函数里,看看该函数的参数
pic2

x/s $edi
x/s esi

第一个参数显然就是我们的输入
第二个参数是Border relations with Canada have never been better.
呢,答案出来了,判断输入的字符串是否为Border relations with Canada have never been better.,赶快保存起来吧。
pic4

phase_2

还是一样

break phase_2
run
输入密码 (我的输入是1234)
disas

pic4

第5行 callq read_six_number
第6行 cmpl $0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值