7、隐藏炸弹secret_phase解决
得到secret_phase的汇编代码

push   %ebx
sub    $0x18,%esp
call   804919d <read_line>
movl   $0xa,0x8(%esp)
movl   $0x0,0x4(%esp)
mov    %eax,(%esp)
call   80488e0 <strtol@plt>
mov    %eax,%ebx
lea    -0x1(%eax),%eax
cmp    $0x1003e8,%eax
jbe    8048f8e <secret_phase+0x32>
call   8049176 <explode_bomb>
mov    %ebx,0x4(%esp)
movl   $0x804c088,(%esp)
call   8048f0b <fun7>
test   %eax,%eax
je     8048fa7 <secret_phase+0x4b>
call   8049176 <explode_bomb>
movl   $0x804a274,(%esp)
call   8048800 <puts@plt>
call   80492fb <phase_defused>
add    $0x18,%esp
pop    %ebx
ret

通过分析代码发现找不到进入这个炸弹的路径,不过如果我们分析一下主函数代码,就会发现一些有趣的东西:

push   %ebp
mov    %esp,%ebp
push   %ebx
and    $0xfffffff0,%esp
sub    $0x10,%esp
mov    0x8(%ebp),%eax
mov    0xc(%ebp),%ebx
cmp    $0x1,%eax
jne    8048a05 <main+0x21>
mov    0x804c3a4,%eax
mov    %eax,0x804c3d0
jmp    8048a79 <main+0x95>
cmp    $0x2,%eax
jne    8048a53 <main+0x6f>
movl   $0x804a108,0x4(%esp)
mov    0x4(%ebx),%eax
mov    %eax,(%esp)
call   8048880 <fopen@plt>
mov    %eax,0x804c3d0
test   %eax,%eax
jne    8048a79 <main+0x95>
mov    0x4(%ebx),%eax
mov    %eax,0xc(%esp)
mov    (%ebx),%eax
mov    %eax,0x8(%esp)
movl   $0x804a10a,0x4(%esp)
movl   $0x1,(%esp)
call   80488a0 <__printf_chk@plt>
movl   $0x8,(%esp)
call   8048840 <exit@plt>
mov    (%ebx),%eax
mov    %eax,0x8(%esp)
movl   $0x804a127,0x4(%esp)
movl   $0x1,(%esp)
call   80488a0 <__printf_chk@plt>
movl   $0x8,(%esp)
call   8048840 <exit@plt>
call   80490db <initialize_bomb>
movl   $0x804a18c,(%esp)
call   8048800 <puts@plt>
movl   $0x804a1c8,(%esp)
call   8048800 <puts@plt>
call   804919d <read_line>
mov    %eax,(%esp)
call   8048b50 <phase_1>
call   80492fb <phase_defused>
movl   $0x804a1f4,(%esp)
call   8048800 <puts@plt>
call   804919d <read_line>
mov    %eax,(%esp)
call   8048b74 <phase_2>
call   80492fb <phase_defused>
movl   $0x804a141,(%esp)
call   8048800 <puts@plt>
call   804919d <read_line>
mov    %eax,(%esp)
call   8048bbc <phase_3>
call   80492fb <phase_defused>
movl   $0x804a15f,(%esp)
call   8048800 <puts@plt>
call   804919d <read_line>
mov    %eax,(%esp)
call   8048d7e <phase_4>
call   80492fb <phase_defused>
movl   $0x804a220,(%esp)
call   8048800 <puts@plt>
call   804919d <read_line>
mov    %eax,(%esp)
call   8048ded <phase_5>
call   80492fb <phase_defused>
movl   $0x804a16e,(%esp)
call   8048800 <puts@plt>
call   804919d <read_line>
mov    %eax,(%esp)
call   8048e36 <phase_6>
call   80492fb <phase_defused>
mov    $0x0,%eax
mov    -0x4(%ebp),%ebx

可以看到有一个函数被反复地调用,就是这个phase_defused函数,所以我们可以大胆的假设,进入秘密炸弹的方法就在这个函数中,那么我们看一下这个函数:

sub    $0x8c,%esp
mov    %gs:0x14,%eax
mov    %eax,0x7c(%esp)
xor    %eax,%eax
cmpl   $0x6,0x804c3cc
jne    8049388 <phase_defused+0x8d>
lea    0x2c(%esp),%eax
mov    %eax,0x10(%esp)
lea    0x28(%esp),%eax
mov    %eax,0xc(%esp)
lea    0x24(%esp),%eax
mov    %eax,0x8(%esp)
movl   $0x804a489,0x4(%esp)
movl   $0x804c4d0,(%esp)
call   8048870 <__isoc99_sscanf@plt>
cmp    $0x3,%eax
jne    804937c <phase_defused+0x81>
movl   $0x804a492,0x4(%esp)
lea    0x2c(%esp),%eax
mov    %eax,(%esp)
call   8049064 <strings_not_equal>
test   %eax,%eax
jne    804937c <phase_defused+0x81>
movl   $0x804a358,(%esp)
call   8048800 <puts@plt>
movl   $0x804a380,(%esp)
call   8048800 <puts@plt>
call   8048f5c <secret_phase>
movl   $0x804a3b8,(%esp)
call   8048800 <puts@plt>
mov    0x7c(%esp),%eax
xor    %gs:0x14,%eax
je     804939a <phase_defused+0x9f>
call   80487d0 <__stack_chk_fail@plt>
add    $0x8c,%esp
ret

可以看到这里有调用secr_phase这个函数,说明入口就在这里,那么如何进入呢?首先可以看到第一个跳转判断的是6与0x803c3cc地址中的值,如果不等于6直接跳过,说明这里控制的是在六个炸弹都拆完之后才可以进入隐藏炸弹。
继续调试后可以看到这里首先有一个__isoc99_sscanf@plt函数,在调用这个函数前有movl一个地址0x804c4d0,经过查看后发现是包含控制字符两个数字和一个字符串,另外这个函数在phase_4中也出现了,说明可能需要在phase_4中有一个秘密的门可以进入这个秘密炸弹中,而这个隐藏的门的形式是字符串类型,在scanf函数执行完之后,返回的eax是输入的数量,当输入两个数字的时候就是2,加上一个字符串之后就是3,说明如果没有加字符串的话将会直接跳过隐藏炸弹函数。
而且看到有一个strings_not_equal函数,说明需要输入一个和内置相同的字符串,通过gdb调试可以很轻松的得到输入的字符串应该为DrEvil,然后继续分析secret_phase的代码,可以发现这里会调用一个名叫fun7的函数:

push   %ebx
sub    $0x18,%esp
mov    0x20(%esp),%edx
mov    0x24(%esp),%ecx
test   %edx,%edx
je     8048f52 <fun7+0x47>
mov    (%edx),%ebx
cmp    %ecx,%ebx
jle    8048f34 <fun7+0x29>
mov    %ecx,0x4(%esp)
mov    0x4(%edx),%eax
mov    %eax,(%esp)
call   8048f0b <fun7>
add    %eax,%eax
jmp    8048f57 <fun7+0x4c>
mov    $0x0,%eax
cmp    %ecx,%ebx
je     8048f57 <fun7+0x4c>
mov    %ecx,0x4(%esp)
mov    0x8(%edx),%eax
mov    %eax,(%esp)
call   8048f0b <fun7>
lea    0x1(%eax,%eax,1),%eax
jmp    8048f57 <fun7+0x4c>
mov    $0xffffffff,%eax
add    $0x18,%esp
pop    %ebx
ret

可以看到这是一个递归调用的函数,对于输入的数据会进行处理,再回到secret_phase函数的代码,发现要满足的是:输入一个数据,这个数据不能大于1001,否则将会直接爆炸,而且经过func7处理之后的结果与自身相与不能有1。这里看到将一个地址0x804c088作为参数以及输入的数直接过为参数调用func7。那么我们查看这个地址,看一下他干了什么:

实际上func7类似于构建了一个二叉树,他的注释就是节点名称,比方说n xy就是第x行第y个元素值,比方说0x804c088 0x00000024,就是代表注释为0x24的根节点,而后面的0x804c094和0x804c0a0就分别代表他的两棵子树的地址,所以就可以画出如下的二叉树:

二叉树的最大值在最右子节点,最小值在最左子节点。

查看func7函数可以看到,首先edx存放的是根节点的地址,ecx存放的是输入的数据(密码),然后进行递归,递归的结束条件是edx=0:

将会返回-1,表示递归结束,没有找到与输入相同的终点。
接下来看递归走向,可以看到:
首先,二叉树结点中2n为左子树,2n+1为右子树

这一部分是判断如果当前节点的值小于等于输入值,则向右子节点走(eax每次2+1)

这一部分是判断如果当前节点的值大于输入值,则像右子树走(eax每次
2)
这就发现这棵树不仅是一个二叉树,还是一棵BST二叉搜索树,即满足左子节点<根节点<右子节点。
然后会看输入,在二叉树中查找这个值,直到走到根节点,如果根节点的值和输入的值相等,那么就返回这个值,否则将会返回-1。而从secret函数中可以看到要求返回的值必须值必须为全零,所以eax经过func7的计算之后的结果必须为0。
那么就要求在func7函数中必须执行到fun7+41的位置,而能够跳转到func7+41位置的指令又在向左子节点走的模块中,所以就要求我们必须一直向左直到走到最左子节点,然后输入的值必须和最左字节点的数值相等才能够跳转到func7+41位置,然后将0赋值给eax寄存器,并传递到函数外面。
而我的搭档俞阳博就和我不是很一样,他要求eax的值必须为7,相当于一直走右子树,每次取最大值,最终得到的最大值是0x3e9,所以最终我的隐藏炸弹密码是1,而他的是1001。结果如图所示:

由于这个实在是太过复杂,调用了太多的函数,甚至还有递归,所以我没有写出c语言代码。

深入理解操作系统实验——bomb lab(secret_phase)相关推荐

  1. 深入理解操作系统实验——bomb lab(phase_1)

    实验内容及操作步骤: 一.实验基本内容: 二进制炸弹是作为一个目标代码文件,运行时会提示用户输入6个不同的字符串,如果其中任何一个不正确,炸弹就会爆炸,打印出一条错误信息.我们需要通过反汇编和逆向工程 ...

  2. 深入理解操作系统实验——bomb lab(phase_6)

    6.对phase_6解决 得到phase_6的汇编代码,进行反汇编 push %esi push %ebx sub $0x44,%esp lea 0x10(%esp),%eax mov %eax,0x ...

  3. 深入理解操作系统实验——bomb lab(phase_2)

    2.对phase_2破解: 得到phase_2的汇编代码,开始破解 push %es push %ebx sub $0x34,%esp lea 0x18(%esp),%eax mov %eax,0x4 ...

  4. 《深入理解计算机系统》实验二Bomb Lab下载和官方文档机翻

    前言 <深入理解计算机系统>官网:http://csapp.cs.cmu.edu/3e/labs.html 该篇文章是实验二Bomb Lab的Writeup机翻. 原文:http://cs ...

  5. 《深入理解计算机系统》实验二Bomb Lab

    前言 <深入理解计算机系统>实验二Bomb Lab的下载和官网文档的机翻请看 <深入理解计算机系统>实验二Bomb Lab下载和官方文档机翻 用的调试工具是gdb,用到的指令如 ...

  6. CSAPP实验二——bomb lab实验

    CSAPP实验二-- bomb lab实验 实验前准备 第一部分(phase_1) 第二部分(phase_2) 第三部分(phase_3) 第四部分(phase_4) 第五部分(phase_5) 第六 ...

  7. 【计算机系统基础bomb lab】CSAPP实验:Bomb Lab

    [计算机系统基础bomb lab]CSAPP实验:Bomb Lab CSAPP 实验:Bomb Lab 实验内容简述 实验环境 实验过程:phase 1 phase 1 调试过程 实验过程:phase ...

  8. 操作系统实验报告1:ucore Lab 1

    操作系统实验报告1 实验内容 阅读 uCore 实验项目开始文档 (uCore Lab 0),准备实验平台,熟悉实验工具. uCore Lab 1:系统软件启动过程 (1) 编译运行 uCore La ...

  9. CSAPP Lab2 实验记录 ---- Bomb Lab(Phase 1 - Phase 6详细解答 + Secret Phase彩蛋解析)

    文章目录 Lab 总结博客链接 实验前提引子 实验需要指令及准备 Phase 1 Phase 2 Phase 3 Phase 4 Phase 5 Phase 6 Phase Secret(彩蛋Phas ...

  10. CSAPP实验二:二进制炸弹(Bomb Lab)

    本系列文章为中国科学技术大学计算机专业学科基础课<计算机系统>布置的实验,上课所用教材和内容为黑书CSAPP,当时花费很大精力和弯路,现来总结下各个实验,本文章为第二个实验--二进制炸弹( ...

最新文章

  1. 英伟达再发边缘AI计算设备:仅信用卡大小,性能比TX2强15倍
  2. 【小白集合】详解服务器内存和显存基础知识
  3. 从M2M迁移到IIoT工业物联网
  4. windows iis 部署 django项目
  5. STM32之DAC例程
  6. AI (1)---没错,AR其实也是AI
  7. 关于IAP:测试时能获取产品价格,却不能获取产品名称的问题
  8. lambda表达式python_你为什么要用lambda表达式?理解它你就知道了
  9. 理解NLP中的卷积神经网络(CNN)
  10. python装饰器 廖雪峰_python装饰器的一个妙用
  11. MySQL · 性能优化 · SQL错误用法详解
  12. 如何不如计算机科学,第四轮学科评估结果:西交不如华中武大,你怎么看?很多网友表示不满!...
  13. bp神经网络数据预测实例,bp神经网络预测数据
  14. 基于arduino制作激光电子竖琴
  15. 蓝桥杯练习 圆的面积
  16. 项目(百万并发网络通信架构)10.2---recv()函数的极限测试
  17. 鼠标右键转圈圈_鼠标点击右键后一直转圈圈
  18. 大学生计算机应用基础实验6,计算机应用基础实验6.doc
  19. 角度转度分秒lisp函数_自改小程序,提示错误,运行另一个lisp后就不会出错,求帮忙!...
  20. RPC(远程过程调用)详解

热门文章

  1. 基于CS的脉冲GPR成像技术研究(20111)
  2. 海美迪h7四代刷Linux,海美迪H7四代怎么安装第三方软件看电视直播
  3. 作为一个程序员对特修斯之船的理解
  4. 大众点评字体_大众点评字体反爬
  5. #12304;#9733;#28404;#28404;#37329;#34701;#23458;#26381;#30005;#35805;#9733;#12305;
  6. 升级版微生物16s测序报告|解读
  7. 利用qiime2分析微生物组16S rRNA数据小结
  8. UIPATH 浏览器在新标签页中执行操作
  9. 万人连麦的幕后技术详解
  10. 以太坊大厦将倾?老白:EOS不会取代以太坊,各有应用场景