CSAPP 3e: Bomb lab (phase_5)

调出phase_5函数:

0000000000401062 <phase_5>:
  401062:    53                       push   %rbx
  401063:    48 83 ec 20              sub    $0x20,%rsp
  401067:    48 89 fb                 mov    %rdi,%rbx
  40106a:    64 48 8b 04 25 28 00     mov    %fs:0x28,%rax    ;此处搞不懂
  401071:    00 00
  401073:    48 89 44 24 18           mov    %rax,0x18(%rsp)
  401078:    31 c0                    xor    %eax,%eax
  40107a:    e8 9c 02 00 00           callq  40131b <string_length>    ;检测字符串长度
  40107f:    83 f8 06                 cmp    $0x6,%eax
  401082:    74 4e                    je     4010d2 <phase_5+0x70>    ;如果字符串长度不为6,bomb。
  401084:    e8 b1 03 00 00           callq  40143a <explode_bomb>
  401089:    eb 47                    jmp    4010d2 <phase_5+0x70>
  40108b:    0f b6 0c 03              movzbl (%rbx,%rax,1),%ecx    ;%ecx=%eax+%ebx。
  40108f:    88 0c 24                 mov    %cl,(%rsp)        ;取%ecx得低8位,相当于%ecx & 0xff,并将值放入内存地址(%rsp)中
  401092:    48 8b 14 24              mov    (%rsp),%rdx
  401096:    83 e2 0f                 and    $0xf,%edx        ;联系上几行,相当于 %ecx & 0xf,并将运算值放入寄存器%edx。
  401099:    0f b6 92 b0 24 40 00     movzbl 0x4024b0(%rdx),%edx    ;根据%edx的值,从内存地址0x4024b0中将数据读入%edx中
  4010a0:    88 54 04 10              mov    %dl,0x10(%rsp,%rax,1);再将读入的数据转移转移到内存地址(%rsp+0x10+%rax)中
  4010a4:    48 83 c0 01              add    $0x1,%rax    ;%rax+=1
  4010a8:    48 83 f8 06              cmp    $0x6,%rax    ;当rax=6跳出循环,这里注意到6等于所需输入的字符串长度
  4010ac:    75 dd                    jne    40108b <phase_5+0x29>
  4010ae:    c6 44 24 16 00           movb   $0x0,0x16(%rsp)    ;由之前关卡可知strings_not_equal函数的运行机制
  4010b3:    be 5e 24 40 00           mov    $0x40245e,%esi    ;%esi存储答案字符串首地址
  4010b8:    48 8d 7c 24 10           lea    0x10(%rsp),%rdi    ;%rdi存储被检测字符串首地址。
  4010bd:    e8 76 02 00 00           callq  401338 <strings_not_equal>
  4010c2:    85 c0                    test   %eax,%eax    ;字符串一一符合则完成破解。
  4010c4:    74 13                    je     4010d9 <phase_5+0x77>    ;这一关重点是在0x4024b0与0x40245e两个字符串之间的关系。
  4010c6:    e8 6f 03 00 00           callq  40143a <explode_bomb>
  4010cb:    0f 1f 44 00 00           nopl   0x0(%rax,%rax,1)
  4010d0:    eb 07                    jmp    4010d9 <phase_5+0x77>
  4010d2:    b8 00 00 00 00           mov    $0x0,%eax
  4010d7:    eb b2                    jmp    40108b <phase_5+0x29>
  4010d9:    48 8b 44 24 18           mov    0x18(%rsp),%rax
  4010de:    64 48 33 04 25 28 00     xor    %fs:0x28,%rax
  4010e5:    00 00
  4010e7:    74 05                    je     4010ee <phase_5+0x8c>
  4010e9:    e8 42 fa ff ff           callq  400b30 <[email protected]>
  4010ee:    48 83 c4 20              add    $0x20,%rsp
  4010f2:    5b                       pop    %rbx
  4010f3:    c3                       retq   

  主要内容在注释中贴出来了,解读如下:

  这一关要求输入一个长度为6的字符串,但是字符串的内容与strings_not_equal函数中%esi存储的地址的字符串不一样,可以看到在这个函数之前有一个转换过程,而且%edi存储的地址是%rsp数据段的地址,这是要点。

  转换过程是取得字符的最低4位,值在0-15之间,通过这个值来调取地址0x4024b0 中的字符,并存入%rsp数据段中,需要%rsp数据段中的字符串与%rsi总的字符串相同,才可以通过这一关。

  地址0x4024b0中的字符串:m a d u i e r s n f o t v b y l  (空格分开只是为了便于查看)

  地址%esi=0x40245e中的字符串:"flyers"

  观察这两个字符串的两两对应关系,要从混乱字符串中选出字符组成"flyers",需要选出的字符序号(从0开始)为 “9,15,4,5,6,7”,十六进制则是"9,f,e,5,6,7"

所以只要输入字符串中对应位的字符的最低4位的数值等于"9,f,e,5,6,7",即可通过这一关。

  比如:通过查看ASCII值,可以得到

  字符最低位值:9  f  e  5  6  7

  对应可选字符:i  o  n  e  f  g

         y       u  v  w

  所以字符串"ionefg"是正确答案。(也可以是"yonefg"或者"yonuvw"都可以,只要字符串满足最低位序号的要求均可以。)

时间: 2024-10-15 15:46:30

CSAPP 3e: Bomb lab (phase_5)的相关文章

CSAPP 3e: Bomb lab (phase_1)

这一个lab拖了好久才开始慢慢完成,花的时间比较多,我也是没想到会需要这么多时间来折腾.考虑到如果把所有关卡的内容都一次发出来,太长了.所以分开操作吧. 然后,有一点是,在开始解题前的确该好好认识一下GDB,因为要使用这个工具.虽然我也感觉有些东西是可以等需要的时候再查的,但是后来找到了一篇介绍gdb命令的,写的比较详细,就下载了打印出来,占用了几节课的时间好好看了一下,就感觉特别有用,比之前更加熟悉了GDB.大概是在网页上看的时候比较急躁,所以吸收不好吧23333.还有,在解题过程中参考了不少

CSAPP 3e: Bomb lab (phase_2) + lab中的GDB 使用

这里是第二关,在这里分享一些在解题过程中用到的GDB功能. 首先,要进行断点,比如,在第二关中,断点操作有: 81: input = read_line(); 82: phase_2(input); 83: phase_defused(); break 81; break 82; break 83; 分别在read_line,phase_2,phase_defused,三个函数入口进行了断点. 另外,还有一个地方需要断点,那就是explode_bomb:操作:break explode_bomb

CSAPP 3e: Bomb lab (secret_phase)

这是秘密关卡,需要通过主动调用secret_phase函数才能触发,可以通过call secret 或者jump *0x地址来调用. 贴出函数:(fun7函数部分没有注释,后边续上了手写的图来解析这个函数了) 0000000000401204 <fun7>: 401204: 48 83 ec 08 sub $0x8,%rsp 401208: 48 85 ff test %rdi,%rdi 40120b: 74 2b je 401238 <fun7+0x34>;如果%rdi==0,r

CSAPP 3e: Bomb lab (phase_6)

这一关很复杂,需要非常耐心.如果感觉容易在循环中绕晕,可以参考一下我最后附上的画图分析法2333,小把戏,不过挺有用的. 先看函数phase_6: 00000000004010f4 <phase_6>: 4010f4: 41 56 push %r14 4010f6: 41 55 push %r13 4010f8: 41 54 push %r12 4010fa: 55 push %rbp 4010fb: 53 push %rbx 4010fc: 48 83 ec 50 sub $0x50,%rs

CSAPP 3e: Bomb lab (phase_4)

先贴出phase_4的代码: 0000000000400fce <func4>: ;%rdi=num_0;%rsi=0;%rdx=0xe; 400fce: 48 83 ec 08 sub $0x8,%rsp 400fd2: 89 d0 mov %edx,%eax ;%eax=0xe; 400fd4: 29 f0 sub %esi,%eax ;%eax=0xe-0==e; 400fd6: 89 c1 mov %eax,%ecx ;%ecx=e; 400fd8: c1 e9 1f shr $0x1

CSAPP 3e : Data lab

/* * CS:APP Data Lab * * <Please put your name and userid here> * * bits.c - Source file with your solutions to the Lab. * This is the file you will hand in to your instructor. * * WARNING: Do not include the <stdio.h> header; it confuses the

CSAPP Bomb Lab记录

记录关于CSAPP 二进制炸弹实验过程 (CSAPP配套教学网站Bomb Lab自学版本,实验地址:http://csapp.cs.cmu.edu/2e/labs.html) (个人体验:对x86汇编寻址模式要有清晰的了解,如mov指令涉及的是计算出的地址所指向的存储单元的值,而lea指令保留的是计算出来的地址,数字是否加$表示常数的问题等: 实验中涉及的跳表的存储方式.链表的处理等是C语言的汇编语言实现方式,处理起来较为复杂,但可对这些方式的对象底层实现方式有一个较为清晰的了解: 涉及指针操作

深入理解计算机系统 (CS:APP) Lab2 - Bomb Lab 解析

原文地址:https://billc.io/2019/04/csapp-bomblab/ 写在前面 CS:APP是这学期的一门硬核课程,应该是目前接触到最底层的课程了.学校的教学也是尝试着尽量和CMU同步,课件和习题都直接照搬原版.包括现在着手的第二个实验室Bomb Lab.这个lab很有意思,没有提供全部c语言代码,需要手动根据反汇编语言推测在每一个阶段需要输入的内容,输入正确就可以进入下一个阶段. 理论上每个人获取到的lab都是不一样的,但对于自学学生而言在官网http://csapp.cs

CSAPP Lab:Bomb Lab(从拆弹到爆炸。。。

这个实验的要做的是用gdb逆向一段code,通过查看汇编代码以及单步调试找出这段code需要你填入的字符串,好像每个人都不一样,所以每个人都需要找到自己的拆弹密码,很有意思. 实验一共有6关,我们一关关来看一下: phase_1 打开bomb.c看些c源码(这里的核心方法已经被删除了,只能看到最外层的代码,但能得到一些线索). 很容易就发现这个phase_1方法是第一题的核心方法,直接逆向它,看下它的汇编. 第一句话是在为函数栈开辟空间,第二句话是关键,讲一个立即数赋值给%esi,然后就调用st