观察循环部分:
由此知当退出循环的条件是取出的数eax为15,而且循环次数为15次
由于115=12+3+7+11+13+9+4+8+10+1+2+14+6+15=a(5)+a(12)......+a(6) 最后得到的ecx值是115,输入的初始数组下标为5。 所以答案为:5 115
4.实验结果:
可知结果正确。
2.2.6 阶段6 phase_6
1.任务描述:拆除一个关于链表/指针/结构的炸弹。 2.实验设计:
19
初步静态分析,此阶段代码有些过长,所以单纯通过静态调试跟踪有些困难,因此我首先找到几个循环体,通过静态调试跟踪和动态调试跟踪的方法来确认循环体的功能,最后将循环体结合起来,拆除此阶段炸断。 3.实验过程:
由于代码较长,为便于分析,先总结一下,phase_6分为:参数读取,一个双层循环,三个单层循环。
首先是参数读取:
由此可见,readsix_number所有参数均小于6且不相等。 由于后面代码部分过多,便采用gdb单步执行来了解代码的功能。 在此,观察到后面:
可以看到输入六个数字的初始地址值在0x804c13c,再由for循环中: 8048ebf: 8b 52 08 mov 0x8(íx),íx
可以看出六个数字按8个字节的顺序进行排列,因此分别调用gdb查看
(0x804c13c)
、
*(0x804c13c+0x8)
、
、
*(*(0x804c13c+0x8)+0x8)
、、
*(*(*(0x804c13c+0x8)+0x8)+0x8) *(*(*(*(0x804c13c+0x8)+0x8)+0x8)+0x8)
*(*(*(*(*(0x804c13c+0x8)+0x8)+0x8)+0x8)+0x8) 的值即可。
20
如图所示:
在下面检测链表值时,要求链表值从大到小排列。由上图可以看出,链表原本各个位置的值按顺序排列位:292 385 c6 3db 7e 308。 按从小到大顺序排列应该为:7ec62923083853db。 由此可以看出,用户应该输入:5 3 1 6 2 4。
4.实验结果:
21
可见结果正确。
1.3 实验小结
本次实验熟悉了obj、gdb的各种操作,对数据在计算机中的存储有了更加清晰的认识,更加加深了对汇编代码的理解,对循环、分支、数组指针结构在机器内部的存储有了更深刻的认识。
22
实验3: 缓冲区溢出攻击
3.1 实验概述
本实验的目的在于加深对IA-32函数调用规则和栈结构的具体理解。实验的主要内容是对一个可执行程序“bufbomb”实施一系列缓冲区溢出攻击(buffer overflow attacks),也就是设法通过造成缓冲区溢出来改变该可执行程序的运行内存映像,继而执行一些原来程序中没有的行为,例如将给定的字节序列插入到其本不应出现的内存位置等。本次实验需要你熟练运用gdb、objdump、gcc等工具完成。
实验中你需要对目标可执行程序BUFBOMB分别完成5个难度递增的缓冲区溢出攻击。5个难度级分别命名为Smoke(level 0)、Fizz(level 1)、Bang(level 2)、Boom(level 3)和Nitro(level 4),其中Smoke级最简单而Nitro级最困难。
实验语言:c;实验环境:linux
3.2 实验内容
设法通过造成缓冲区溢出来改变该可执行程序的运行内存映像,继而执行一些原来程序中没有的行为。 3.2.0 阶段0 smoke
1.任务描述:将getbuf函数执行return后执行test函数改为执行smoke函数。 2.实验设计:首先根据反汇编代码求得buf离返回地址的字节距离,确定要填充几个字节,然后找到smoke函数的起始地址,把这个地址填入buf末尾,即可实现该功能。
3.实验过程:首先通过gdb工具对bufbomb文件进行反汇编,查看getbuf的汇编代码:
23