计算机系统 实验三
实验目的:
二进制炸弹是作为一个目标代码文件提供给学生们的程序,运行时,它提示用户输入6个不
同的字符串。如果其中任何一个不正确,炸弹就会“爆炸”:打印出一条错误信息。学生通过反汇 编和逆向工程来确定是哪六个字符串,从而解除他们各自炸弹的雷管。
一、Phase 1
代码
方法
由反汇编代码可知,第二行是将立即数mov到0x4(%esp),所以gdb调试x/s 0x804a1bc查看内容
二、Phase 2
首先我们可以知道的是输入6个数字,而且如果第一个数字不是1就会爆炸,所以第一个数字是1,之后会进入一个循环,自己与自己相加成为第二个数字,第二个数字是1+1=2,第三个数字是2+2=4,以此类推。所以答案是1 2 4 8 16 32
三、Phase 3
主要考查switch语句
从箭头标的地方可以知道,输入的第一个数字是0-5之间的数字,后边的汇编代码指的是switch语句,当第一个数字等于0~5中的一个数,就会输出相应的值。
四、Phase 4
8048cb9: 83 ec 2c sub $0x2c,%esp
8048cbc: 8d 44 24 1c lea 0x1c(%esp),%eax
8048cc0: 89 44 24 0c mov %eax,0xc(%esp)
8048cc4: 8d 44 24 18 lea 0x18(%esp),%eax
8048cc8: 89 44 24 08 mov %eax,0x8(%esp)
8048ccc: c7 44 24 04 af a3 04 movl $0x804a3af,0x4(%esp)
8048cd3: 08
8048cd4: 8b 44 24 30 mov 0x30(%esp),%eax
8048cd8: 89 04 24 mov %eax,(%esp)
8048cdb: e8 90 fb ff ff call 8048870 <__isoc99_sscanf@plt>
8048ce0: 83 f8 02 cmp $0x2,%eax
8048ce3: 75 0d jne 8048cf2 <phase_4+0x39>
8048ce5: 8b 44 24 18 mov 0x18(%esp),%eax
8048ce9: 85 c0 test %eax,%eax
8048ceb: 78 05 js 8048cf2 <phase_4+0x39>
8048ced: 83 f8 0e cmp $0xe,%eax
8048cf0: 7e 05 jle 8048cf7 <phase_4+0x3e>
8048cf2: e8 0f 04 00 00 call 8049106 <explode_bomb>
8048cf7: c7 44 24 08 0e 00 00 movl $0xe,0x8(%esp)
8048cfe: 00
8048cff: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp)
8048d06: 00
8048d07: 8b 44 24 18 mov 0x18(%esp),%eax
8048d0b: 89 04 24 mov %eax,(%esp)
8048d0e: e8 3d ff ff ff call 8048c50 <func4>
8048d13: 83 f8 07 cmp $0x7,%eax
8048d16: 75 07 jne 8048d1f <phase_4+0x66>
8048d18: 83 7c 24 1c 07 cmpl $0x7,0x1c(%esp)
8048d1d: 74 05 je 8048d24 <phase_4+0x6b>
8048d1f: e8 e2 03 00 00 call 8049106 <explode_bomb>
8048d24: 83 c4 2c add $0x2c,%esp
1.这一关需要读入两个输入
2.第一个输入一定要小于等于15
3.第二个参数必须要等于7
五、Phase 5
六、Phase 6
我们输入的6个数实际上就是不同的node节点数,根据我输入的节点号,把节点内的内容重新进行排序,排成递增序列。然后之后还有一个7-链表的值的运算