Data lab
一:实验梗概
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
印入你眼前的,是恶心的代码。不要急,慢慢寻找线索。你会慢慢看到
phase_1
phase_2
......
explode_bomb
phase_1应该是关卡1函数的名字,explode_bomb应该是炸弹爆炸函数的名字。
好啦,得到这些信息后就可以开始调试了。
②Gdb调试开始
phase_1
首先设置断点,并运行程序
break phase_1
break explode_bomb
run
然后根据提示,输入第一关的密码。随便输入一个(我输入1234)
然后在反汇编phase_!函数
disas
看到了这个函数的汇编代码。好咯,开始干活了。
第四行 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函数里,看看该函数的参数
x/s $edi
x/s esi
第一个参数显然就是我们的输入
第二个参数是Border relations with Canada have never been better.。
呢,答案出来了,判断输入的字符串是否为Border relations with Canada have never been better.,赶快保存起来吧。
phase_2
还是一样
break phase_2
run
输入密码 (我的输入是1234)
disas
第5行 callq read_six_number
第6行 cmpl $0