CS:APP BombLab题解

bomb Lab

这个题解主要看大体思路,还是需要自己去看汇编代码对照的。

0.分析前的准备

  • 下载好bomb文件
    http://csapp.cs.cmu.edu/3e/labs.html
    下载Self-Study Handout
    在这里插入图片描述

  • 解压

    tar -xzvf bomb.tar 
    

    即可

  • 文件含义
    在这里插入图片描述

    bomb 可执行文件,我们要找的炸弹就在其中

    bomb.c 源文件,包含部分bomb代码,同时缺少某些部分,不能编译成bomb可执行文件。如在这里插入图片描述

    其中support.h phases.h都没有。

    README lab介绍

  • gcc必需命令(以下命令基本够用)

    • 运行
      在这里插入图片描述在这里插入图片描述

    • 打断点在这里插入图片描述

    • 打印值在这里插入图片描述在这里插入图片描述

  • 取得静态汇编代码

    $ objdump -d bomb >bomb.asm
    -d 表示取汇编代码
    >bomb.asm 是重定位输出到文件,单纯执行objdump -d bomb 会将汇编显示到标准输出设备上(显示器)
    $ objdump -t bomb >bomb_tab.asm
    得到bomb的符号表,其内有bomb的所有函数名、全局变量、静态变量常量名...(第7章会学)
    

至此,已准备完成。

1.正式开始

整理格式

打开bomb.asm,整理下格式,可以在vim中

gg=G  #对整个文件进行格式化。  

最好用带行号、智能提示的编辑器来分析。
(我将该文本从虚拟机拿出到了win10)
这里使用的编辑器为notepad2在这里插入图片描述

bomb 符号表

在这里插入图片描述
从反汇编得到的符号表bomb_tab.asm 中可以知道,其内的关卡函数名称。phase_1 phase_2...

phase_1

  • 使用Ctrl+F快速找到phase_1反汇编代码
    在这里插入图片描述

  • 汇编分析在这里插入图片描述

    这个地址十分可疑,因为整个phase_1函数只有这一个地方写了究竟从哪比较数据。所以我们首要目标就是去看看这地址有什么。

  • 开拆

    gdb bomb
    

在这里插入图片描述

先打个断点在这里插入图片描述
运行起来(gdb bomb 只是将文件加载进来,并没有运行)

    run #运行到第一个断点处

在这里插入图片描述

随便输入一些内容。在这里插入图片描述

断点中了。此时我们就可以看看地址0x402400存了什么信息。

x/s 0x402400  #以字符串格式读地址0x402400处

在这里插入图片描述

好,得到phase_1题解。

phase_2

  • 汇编分析在这里插入图片描述在这里插入图片描述

    大意为:
    1.输入6个数
    2.第一个数为1
    3.后面每个数都要为前一个数的2倍
    所以我们需要确定输入值在栈中的顺序,因为它可能是1 2 4 8 16 32也可能是32 16 8 4 2 1

  • 开拆
    输入6个数后,查看栈中值。在这里插入图片描述

    使用该命令,读取寄存器中地址的值。
    但是很奇怪,输入的值没有出现。
    我们看看汇编指令执行到哪了,可以这样:

    (gdb) break phase_2
    Breakpoint 3 at 0x400efc #取得phase_2函数地址
    display /20i 0x400efc #每次执行一条指令就会打印在0x400efc处后20条汇编指令
    

    在这里插入图片描述

    还在这,没有执行read_six_numbers函数,可能该函数将值读到栈中。
    所以我们先执行完该函数试试。使用ni单步执行汇编指令,不要用n,这个单步执行一条c指令,可能对应好几条汇编指令。 在这里插入图片描述
    再次查看栈空间在这里插入图片描述

    格式化一下在这里插入图片描述

    可知,最先输入的在栈顶
    这不就是1 2 4 8 16 32

好,phase_2解决。

phase_3

  • 汇编分析在这里插入图片描述在这里插入图片描述

    看完后,我们需要做:
    1.查看地址 0x4025cf *0x402470(,%rax,8)
    2.查看栈元素
    3.__isoc99_sscanf@plt函数返回值是什么

  • 开拆
    输入值在这里插入图片描述

    运行到此处在这里插入图片描述

    • 栈空间在这里插入图片描述

      7为第一参数 9为第二个参数 ,10不在

    • __isoc99_sscanf@plt函数返回值在这里插入图片描述

      参数个数

    • 0x4025cf在这里插入图片描述

      可能是对输入值的表示方式,用十进制表示,2个参数

    • *0x402470(,%rax,8)在这里插入图片描述

      0x00400f7c0x00400fb9就是phase_3的代码在这里插入图片描述

      也就是说该跳转语句就是跳到后面的区域为eax赋值。
      0x00400f7c处,在这里插入图片描述

      那么使得第二个参数为0xcf即可过关

答案为0 207

phase_4

  • 汇编分析在这里插入图片描述

    func4函数在这里插入图片描述

    由上我们可知:
    1.由func4可知,edi需为0,即第一个参数要为0
    2.由phase_4可知,第二个次数要为0

直接出答案,就是0 0

  • 开拆

phase_5

  • 汇编分析在这里插入图片描述

    我们需要知道:
    1.0x4024b0 0x40245e处的值是什么

  • 开拆

    • 0x4024b0在这里插入图片描述

    • 0x40245e在这里插入图片描述

再分析可知,输入的字符串经过处理(x&=00001111)作为一个偏移值,再去取0x4024b0处的值,存放在(rsp+0x10)处,与"flyers"比较是否相等。
而"flyers"在其中索引为9 F E 5 6 7在这里插入图片描述

而(x&=1111)后为9 F E 5 6 7的有在这里插入图片描述

在此,选取ionefg作为答案

phase_6

  • 汇编分析在这里插入图片描述
    上面代码很多,可以直接看大体步骤再去核对下就好。
    从上可知,主要过程为:
    1.读6个数字
    2.判断每个数字都不相同
    3.判断每个数字在(0,7)之间
    4.值=7-本身,并保存起来
    5.按照保存起来的数排序,对链表进行排序
    6.重排后链表值需要为升序排序
    我们只需要知道0x6032d0处是什么

  • 开拆在这里插入图片描述

    也就是说,我们需要给节点值排序,使其升序排列node3 > node4 > node5 > node6 > node1 > node2
    考虑到前面有x=7-x进行过处理,我们应当输入432165

phase_6题解为432165

拆完在这里插入图片描述

secret_phase

bomb.asm文件中看到了secret_phasefun7俩函数。
其实除了前面的phase_1~6还有一个隐藏关卡。
但phase_6做起来已经让我分析了好久好久。
所以,这个隐藏关卡再等我积累下再来完成。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值