CSAPP BOMB LAB 题解(含secret_phase进入方法和答案)

文章目录

    • 准备工作
    • phase1
    • phase2
    • phase3
    • phase4
    • phase5
    • phase6
    • secret phase

准备工作

g++、gdb、vim

phase1

gdb bomb
(gdb) layout asm
(gdb) b phase_1
r

显示汇编界面,并运行至phase1中
CSAPP BOMB LAB 题解(含secret_phase进入方法和答案)_第1张图片
观察phase_1汇编的主题,可以大概了解到程序先给%rsi赋值后进入strings_not_equal函数进行比较,并计算返回值是否为0,如果为0则执行下一条,成功绕过炸弹,若不为0则进入explode_bomb函数,引爆炸弹。
观察到%rsi赋值的语句很可疑,于是我们查看一下0x403150地址中的值,有`

(gdb) x/s *0x403150
0x403150: 	"I am not part of the problem. I am a Republican."

因而得到答案
在strings_not_equal函数中也可以通过查看寄存器%rsi %rbp的值来获取答案
CSAPP BOMB LAB 题解(含secret_phase进入方法和答案)_第2张图片

phase2

进入phase_2后发现这里的要求是读六个数字,并且完成了把栈底指针赋值给%rbx的操作
CSAPP BOMB LAB 题解(含secret_phase进入方法和答案)_第3张图片
在读取完数字后我们尝试输出一下0x14(%rsp)的内容,发现是我们输入的最后一个数字,并将它赋值给了%rbp;再输出一下%rbx指向的内容,发现是输入的第一个数字。由此栈底和栈顶的指针都已经设置好了,跳转到33行


稍加阅读发现33-41行为比较的操作,看输入数列的公差是否为5

24-28行完成的是移动指针并判断是否到达栈顶的操作。若到达则跳过炸弹,返回主函数。
所以我们只要输入6个数字,并保证公差为5即可。

phase3

按照惯例,先查看输入是什么

在这里的输入是一个整数,一个字符,再加一个整数
那么完成输入后势必有三次比较的操作,只要按需阅读汇编代码,找到这三个答案即可。

先检查输入个数,若<=两个则引爆炸弹
接着比较了0xc(%rsp)的内容和7的大小,注意到进入phase_3后开辟了18个byte的栈空间,并分别赋给%rcx %rdx %r8,于是得出这三个分别为输入的三个答案。在这里0xc(%rsp)为我们输入的第一个数字,所以得出第一个整数为7

这里比较了0x38e和输入的第三个key的大小,因此判断出第三个整数答案为910(输入为十进制)

在这里把0x68赋值给%eax/%al 并比较和第二个key的大小
输出一下%al发现是w,那么得出第二个key为w
因此phase3答案为7 w 910

phase4

观察得出phase4要求输入一个整数
成功进入func4
%edi里存输入的答案
观察发现这是一个递归程序,一共循环%edi次,后跳入func4+21行中
CSAPP BOMB LAB 题解(含secret_phase进入方法和答案)_第4张图片
进入递归的后半部分,发现进行*7的操作,于是可以计算出rax最后的返回值并和0x157,也就是343比较,于是可以推断出输入为3
CSAPP BOMB LAB 题解(含secret_phase进入方法和答案)_第5张图片

phase5

观察代码主体,判断任务为输入一个长度为6的字符串,并且和地址为0x4031b7的字符串进行比较,字符串为ravens
但是对输入的字符串要进行一些处理
下面进行分析
CSAPP BOMB LAB 题解(含secret_phase进入方法和答案)_第6张图片
先试着输出一下array.0中的字符
再观察汇编操作,发现是取输入字符ascii码的最后一个byte作为操作数,然后加上array0的地址,由上面输出的字符可以解码得到一种答案(不唯一)为resdka

phase6

phase6的代码量极大,涉及的寄存器也很繁杂,在这里可以列一张表格分辨一下寄存器存的地址/值是什么
在这里简述一下代码框架:先用两个循环判断输入是否互不相同以及是否为1~6中的数字,之后将node_i,i和输入数字顺序一一对应push进栈,之后一一出栈,比较内部存储的数据大小,要求降序排列。
在node全部进栈后,可以输出一下内部的值,然后得出正确答案5 3 6 1 4 2

secret phase

在阅读phase_defused函数时,会发现有一些多出来的东西,当第六次进入该函数时会进行判断,经过解码发现要在phase4的输入后继续输入一个字符串austinpowers来进入secret phase
CSAPP BOMB LAB 题解(含secret_phase进入方法和答案)_第7张图片
CSAPP BOMB LAB 题解(含secret_phase进入方法和答案)_第8张图片
接下去进入secret phase

CSAPP BOMB LAB 题解(含secret_phase进入方法和答案)_第9张图片
这段代码将输入和1000比较,确保输入的数字<=1001,则进入fun7
CSAPP BOMB LAB 题解(含secret_phase进入方法和答案)_第10张图片
fun7的本质也是一个递归,稍微有一些复杂
输出一下中间的寄存器值可以得到答案为36
(不想写了,相信做到这里的人都已经会了:) )

你可能感兴趣的:(C++,c++)