四、实验步骤和结果
1. 输入反汇编命令查看汇编代码(保存在1.txt文件中):
图1
2. 首先找到main函数,发现它调用了从phase1到phase6这六个函数:
图2
由反汇编代码可以知道phase_1为字符串比较,根据下图3打印出0x80497c0得到下图4,故可以得到答案“Publicspeaking is very easy.”:
图3
|
图4
3. 再看phase_2,进入到08048fd8 <read_six_numbers>中,看到图5的语句,打印出来得到图6,即可知需要输入6个数,然后由0x8048b63可知第一个数为1,再由下面的循环语句可得到后面的5个数,见图7,检测后得到图8,答案正确:
图5
图6
图7
图8
4. 继续看phase_3,如下图,由0x8048bb1的打印结果知道要输入两个整形数和一个字符,如图9。然后由0x8048bd6可推测为switch语句,由0x8048bc9知跳转范围为0~7,图10列出了跳转0、1的情况,2~7类似,图11为所有可以通过的情况,图12为测试结果:
图9
图10
图11
图12
5. 继续看phase_4:
1) 由图13和图14知需要输入一个整数:
图13
图14
2) phase_4调用了func4函数,图15为func4函数和函数解析,由此可知为斐波那契数列:
图15
3) 再看phase_4的主体,见图16,可知调用斐波那契数列后%eax的值为37,为第9项,故需要输入的数为9:
图16
4) 测试结果:
图17
6. 继续看phase_5:
1) 打印出代码中有特征的地址:
图17
2) 这是字符串问题,将输入字符的低四位作为“isrveawhobpnutfg”下标,得到字符串后与“giant”相比。输入的字符串低四位需为15 0 5 11 13 1,故而选择输入“opekma”:
图18
3) 测试结果,图19:
图19
7. 看phase_6:
1. 代码出现了read_six_numbers,故而我首先输入“3 4 5 6 7 8”作为测试,但是经过调试后在0x8048dc7发生了爆炸,由下面代码知输入的整数需<=6,故而改为“1 2 3 4 5 6”测试:
图20
2. 调试过程中打印0xbffff0a4起始的十个int型数据还有一些调试中相关的值,图21后面的5张图为1 2 3 4 5 6 对应的值,地址为0x8004b26c、0x8004b260、0x8004b254、、、、、、:
图21
3. “1 2 3 4 5 6”也爆炸了,故而换“6 5 4 3 2 1”尝试,6 5 4 3 2 1映射的地址,保存的值为432 212 997 301 725 253:
图27
4. 由图28知需要将对应值432 212997 301 725 253从大到小排列,即得到4 26 3 1 5:
图28
5. 结果:
五、实验总结与体会
1. 了解了gdb的使用,例如查看寄存器的值,或者查看内存中的几个值:
2. 一些可能对拆弹过程有作用的知识:
1) 函数的调用:
2) 函数的返回:
3) 寄存器的使用:
3. 调试时要看整个过程,不要纠结于细节;
4、参考:http://www.2cto.com/kf/201605/504503.html
注:加油加油加油~!~!~!~!。知识从来不会欺骗你,博客从来不会欺骗你;
加油加油加油~!别人时代的悲哀成为你的悲哀!~~!~