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

这个实验的要做的是用gdb逆向一段code,通过查看汇编代码以及单步调试找出这段code需要你填入的字符串,好像每个人都不一样,所以每个人都需要找到自己的拆弹密码,很有意思。

实验一共有6关,我们一关关来看一下:

phase_1

打开bomb.c看些c源码(这里的核心方法已经被删除了,只能看到最外层的代码,但能得到一些线索)。

很容易就发现这个phase_1方法是第一题的核心方法,直接逆向它,看下它的汇编。

第一句话是在为函数栈开辟空间,第二句话是关键,讲一个立即数赋值给%esi,然后就调用strings not equal方法,推测很用可能这个寄存器中就存着我们拆弹的字符串,于是打断点,单步执行,查看%esi的里的内容:

没错,这就是我们拆弹的钥匙了,输入,第一个炸弹成功拆除!可以将答案放在一个文本文件中,方便之后的解题。

phase_2

实现逆向phase_2函数观察下

观察read_six_numbers发现这次是要我们输入6个数字,通过观察后发现输入的6个数字会依次3存在%rsp,%rsp+4,%rsp+8,%rsp+12...%rsp+24这些位置,那么cmpl $0x1,(%rsp)这句话就很明显可以得出第一个数字是1,再接下去看跳转到52,将%rsp+4也就是第二个数字放进%rbx中,将%rbp设置成%rsp+24(可以猜到%rbp使用来判断循环是否退出的寄存器),之后跳转到27,这里将第一个数赋值给%eax,将%eax*2去和第一个数对比,如果相等就继续,以此类推,可以发现这个循环就是用来判断输入的数字是否依次增大一倍的,所以第二题的拆弹密码就是:1 2 4 8 16 32

phase_3

我首先随意输入一个字符串,调试发现%esi中的字符串内容为"%d %d",由此得知此题需要我们输入两个数字,%eax是scanf的返回值,如果=1则代表非法输入,炸弹爆炸。我们输入两个数字,这里跳转就能通过了。然后发现第一个数字不能大于7,我们随意填了个0,重新调试再试试,然后发现jmp到了57,走下去会发现%eax就是第二个数的答案,所以此题答案为0 0xcf。

其实这道题最简单的解法就是输入两个数,跟着单步调试走,你很容易就能确定两个数字的内容,但是其实你再多看两眼,就会发现其实这里是一个switch结构,答案是不唯一的,跳转表存在*0x402470中,我们打印出这张跳转表,就能得知这道题的所有答案:第一个数字是index,第二个数字就是对应分支赋值给%eax的值。

phase_4

这道题是个递归,花了点时间,但是复杂度还行,只要一步步跟下来就能得出结果。

拆弹关键在func4函数中,发现func4返回的参数eax必须为0才能不爆炸,我们倒退进func4

发现只有当%ecx和%edi的值相等的时候才会将%eax赋值为0,而%edi就是我们的第一个参数,那么我们只需要知道%ecx的值即可,通过推导得出ecx的值可以为7 3 0。

返回phase_4继续走下去发现第二个数为0就能拆弹了。

phase_5

通过这段我们可以知道这一题是要我们输入一串长度为6的字符串。

这一段是核心代码,跳转至112后将%eax赋值为0后跳转到41,然后讲%rbx+%rax的值赋值给%ecx,%rbx是我们输入内容的基地址,%rax是索引,然后做的事情其实就是将当前字符截取底4位。55行这里有个奇怪的地址,将这个地址输出看下得到:,那么这里就是以当前字符低4位的值为索引去读取这个字符串,然后得到的字符放进以$rsp+16为起始地址的内存区域。

解下来可以跳出循环看76-91行了,查看81行的字符串为"flyers",%rdi就是我们循环得到的字符串,然后调用string_not _equal方法,得知只要我们循环得出的字符串等于“flyers”即可拆弹。

分别找到“flyers”在上述字符串中的索引,然后对照ASCII码表,可得到本题答案,答案不唯一,只要低4位符合条件的字符都能拆弹。

phase_6

这题在借助谷歌的力量后才不太顺利的完成了。。

先看第一部分

这部分没有什么难度,但也有一定复杂度,稍微花点时间理一下逻辑,就能发现它是要我们输入6个数字,然后这6个数字要求互不相等,并且都不大于6。

接下来就比较困难了,没想到是用到了链表,而且还涉及到数据对齐的知识。

链表存储在0x6032d0中,链表得到后再进行排序,最后我们可以得到排序后的链表其实是单调递减了,然后反推就能得出我们的答案啦~

原文地址:https://www.cnblogs.com/jarviswhj/p/9349503.html

时间: 2024-10-13 23:25:22

CSAPP Lab:Bomb Lab(从拆弹到爆炸。。。的相关文章

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 (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: 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_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

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 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