Lab4-2实验报告¶
破译密码¶
-
实验结果图:
-
实验步骤阐述:
-
随便尝试一组学号的密码
-
在check处设置断点,并运行程序至check,从check开始逐步观察
-
发现一处类似循环的代码
-
在该代码后的位置设置断点,并运行程序跳过循环
-
继续执行发现一处比较代码,比较后跳转至a0 = -1,并且程序结束
-
观察在比较时,两个被比较寄存器的值
-
猜测一个是我输入的密码,一个是由我的学号生成的实际的密码
-
再运行程序,输入实际密码,结束
-
拆炸弹¶
第一颗¶
-
调试方法:
进入phase_1观察后续调用函数read_four_integer猜测后续读入四个整数,a0返回判断是否是4猜测是输入整数的个数。后根据汇编代码发现栈内元素依次和3,7,11比较,且最后一个数字赋值给a0后经过一系列计算实现与15比较,因此推出答案是3 7 11 15
第二颗¶
-
调试方法:
进入phase_2观察,得知函数将0x5e758开始的16字节内容搬运到phase_2的栈内,再发现后续跳转到memcmp函数中时特地在a1处存放了sp,猜测该函数用于比较。后续调试过程中又发现a0存放了输入的值,最后也是a0和sp在比较,因此只需要将sp内容换成ascii码即可
第三颗¶
-
调试方法:
进入phase_3观察,得知函数在读数后有一系列对于8(sp)的计算。第一个条件要8(sp)∈[100,106]之间。此时可以开始枚举第三个炸弹的答案,但是为了人生安全起见,我们继续看后面的代码。
代码将a5*4,然后对应到后面的一张表上,表中只有当a5取4时能够让a0=0,拆弹成功。因此第三个炸弹的密码为104。
第四颗¶
-
调试方法:
进入phase_4观察,检查栈的元素得知我输入的两个数被存在栈内,而后在secret_func处设置断点,得知函数通过secret_func计算两个数的最大公约数,返回在a0。而后又计算了一堆num1和num2应该满足的条件,即num1,num2 >= a0*10,num2 >= num1即可,随便假设a0 == 4,num1 == 44,num2 == 52成立。
-
调试方法:
进入phase_1观察后续调用函数read_four_integer猜测后续读入四个整数,a0返回判断是否是4猜测是输入整数的个数。后根据汇编代码发现栈内元素依次和3,7,11比较,且最后一个数字赋值给a0后经过一系列计算实现与15比较,因此推出答案是3 7 11 15