华科_计算机系统实验报告 联系客服

发布时间 : 星期四 文章华科_计算机系统实验报告更新完毕开始阅读

后一部分反汇编代码,如图2.3.3所示:

图2.3.3

可以显然的发现一个数字要求不能比0x7大,然后就会将第一个数字送入eax中,然后跳转至[eax*4+0x804a1c0]处执行,显然是个分支程序。

重新调试程序输入“1 100”,观察执行到0x8048c86处eax的值,即第二个数应该的值。如图2.3.4所示:

图2.3.4

故第二个数为61。重新执行该程序,直接输入“1 61”,观察结果。如图2.3.5所示:

图2.3.5

4. 实验结果:如图2.3.5所示,阶段三拆弹成功!

阶段三用到了分支,由于没有必要弄懂整个分支的功能,只要选择其中的某一路就可以了,所以解决起来也不是很难,单步执行下去就能很快的找到第二个输入的正确值。

2.2.4 阶段4 递归调用和栈

1. 任务描述:通过phase_4以及func4的反汇编代码推断第四阶段要输入

的数据

2. 实验设计:利用gdb结合断点来动态地分析 3. 实验过程:

观察phase_4的前一部分反汇编代码,如图2.4.1所示:

图2.4.1

发现输入的应该要求__isoc99_sscanf@plt的返回值等于2,于是同阶段三一样测试观察调用__isoc99_sscanf@plt时格式字符串的值,发现为仍然为“%d %d”,而且[esp+0x18]要求小于等于0xe。如图2.4.2所示:

图2.4.2

继续观察phase_4的后一部分反汇编代码,如图2.4.3所示:

图2.4.3

可以不难发现依次将输入的第一个数,以及0x0和0xe作为参数传给func4,要求返回值为0xf而且输入的第二个数与0xf相等才不会爆炸。所以需要输入一个正确的数来保证func4的返回值为0xf。

于是观察func4的反汇编代码,如图2.4.4所示:

图2.4.4

很快就能发现其中有递归调用,仔细分析发现,第一次调用时其中edx,eax,esi依次为x(为输入的第一个数),0x0,0xe。然后ecx=(esi-eax)/2,然后ebx=ecx+eax=(esi+eax)/2,然后根据ebx与edx比较也就是传入func4的第一个参数与后两个参数的平均值的比较结果进行相应的处理。

当第一个参数小于后两个参数的平均值时,就依次将原来的第一次参数、原来的第二个参数、原来后两个参数的平均值减一作为参数调用func4,然后将返回值以及原来的后两个参数的平均值的和作为返回值输出。即原来参数依次为a、b、c,传入参数依次为a、b、(b+c)/2-1;

当第一个参数大于后两个参数的平均值时,就依次将原来的第一次参数、原

来后两个参数的平均值加一、原来的第三个参数作为参数调用func4,然后将返回值以及原来的后两个参数的平均值的和作为返回值输出。即原来参数依次为a、b、c,传入参数依次为a、(b+c)/2+1、c;

当第一个参数等于两个参数的平均值时,就直接将平均值直接输出。 所以通过反推,要求func4的返回值必须为0xf也就是15,显然直接输出平均值不可行。若第一个参数大于0x0与0xe的平均值也就是7的话,则下一层调用func输出的返回值必定大于(8+15)/2>8,故结果必定大于15,所以也不行。

故输入的第一个参数必定小于7,演算之后发现5正好符合要求,第一次调用平均值为7,然后传递5、0、6为参数第二次调用,平均值为3,再次传递5、4、6为参数第三次调用,平均值为5,与输入相等,故输出7+3+5=15,即0xf。

综上,重新执行该程序,直接输入“5 15”,观察结果。如图2.4.5所示:

图2.4.5

4. 实验结果:如图2.4.5所示,阶段四拆弹成功!

阶段四难度开始提升,调用了别的函数,而且函数还有递归调用,这就要求必须完整的看懂递归的函数的功能,分析出来功能后才能反过来推测正确的输入。

2.2.5 阶段5 指针

1. 任务描述:通过phase_5的反汇编代码推断第五阶段要输入的数据 2. 实验设计:利用gdb结合断点来动态地分析 3. 实验过程:

观察phase_5的前一部分反汇编代码,如图2.5.1所示:

图2.5.1

发现输入的应该要求__isoc99_sscanf@plt的返回值大于1,于是同阶段三一样测试观察调用__isoc99_sscanf@plt时格式字符串的值,发现为仍然为