#南京航空航天大学《计算机组成原理Ⅱ课程设计》报告
##目录
objdump –d bomb > asm.txt
对bomb进行反汇编并将汇编代码输出到asm.txt中。
思路:
查看汇编源代码asm.txt文件,在main函数中找到如下语句
这里为phase1函数在main()函数中被调用的位置):
08048b30 :
8048b30: 55 push %ebp
8048b31: 89 e5 mov %esp,%ebp
8048b33: 83 ec 10 sub $0x10,%esp
8048b36: 68 84 a0 04 08 push $0x804a0
8048b3b: ff 75 08 pushl 0x8(%ebp)
8048b3e: e8 bf 04 00 00 call 8049002
8048b43: 83 c4 10 add $0x10,%esp
8048b46: 85 c0 test %eax,%eax
8048b48: 74 05 je 8048b4f
8048b4a: e8 b6 05 00 00 call 8049105
8048b4f: c9 leave
8048b50: c3 ret
在这里我们可以看到,call 8049002
的前两句是进行压栈操作,根据sub $0x10,%esp
可知前期准备工作中给栈分配了足够的空间,进行压栈时的情况为压入双字,根据小端存储的方式可知栈中存储的地址为08 a0 04 08
。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AveR9Ejj-1584672291157)(C:\Users\Lenovo\Desktop\pa实验报告\bomb37\新建文件夹\1.PNG)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-utDSRexN-1584672291159)(C:\Users\Lenovo\Desktop\pa实验报告\bomb37\新建文件夹\2.PNG)]
思路:
查看汇编源代码asm.txt文件,在main函数中找到如下语句
这里为phase2函数在main()函数中被调用的位置):
08048b51 :
8048b51: 55 push %ebp
8048b52: 89 e5 mov %esp,%ebp
8048b54: 56 push %esi
8048b55: 53 push %ebx
8048b56: 83 ec 28 sub $0x28,%esp
8048b59: 65 a1 14 00 00 00 mov %gs:0x14,%eax
8048b5f: 89 45 f4 mov %eax,-0xc(%ebp)
8048b62: 31 c0 xor %eax,%eax
8048b64: 8d 45 dc lea -0x24(%ebp),%eax
8048b67: 50 push %eax
8048b68: ff 75 08 pushl 0x8(%ebp)
8048b6b: e8 bd 05 00 00 call 804912d
8048b70: 83 c4 10 add $0x10,%esp
8048b73: 83 7d dc 02 cmpl $0x2,-0x24(%ebp)
8048b77: 75 06 jne 8048b7f
8048b79: 83 7d e0 03 cmpl $0x3,-0x20(%ebp)
8048b7d: 74 05 je 8048b84
8048b7f: e8 81 05 00 00 call 8049105
8048b84: 8d 5d dc lea -0x24(%ebp),%ebx
8048b87: be 02 00 00 00 mov $0x2,%esi
8048b8c: 89 f0 mov %esi,%eax
8048b8e: 0f af 03 imul (%ebx),%eax
8048b91: 03 43 04 add 0x4(%ebx),%eax
8048b94: 39 43 08 cmp %eax,0x8(%ebx)
8048b97: 74 05 je 8048b9e
8048b99: e8 67 05 00 00 call 8049105
8048b9e: 83 c6 01 add $0x1,%esi
8048ba1: 83 c3 04 add $0x4,%ebx
8048ba4: 83 fe 06 cmp $0x6,%esi
8048ba7: 75 e3 jne 8048b8c
8048ba9: 8b 45 f4 mov -0xc(%ebp),%eax
8048bac: 65 33 05 14 00 00 00 xor %gs:0x14,%eax
8048bb3: 74 05 je 8048bba
8048bb5: e8 d6 fb ff ff call 8048790 <__stack_chk_fail@plt>
8048bba: 8d 65 f8 lea -0x8(%ebp),%esp
8048bbd: 5b pop %ebx
8048bbe: 5e pop %esi
8048bbf: 5d pop %ebp
8048bc0: c3 ret
根据题目的考查方式可以看出,这道题主要是考查数组栈针的相关问题。关键在于几个跳转语句以及结束条件。
cmpl $0x2,-0x24(%ebp)
jne 8048b7f
这一句表示如果不等于2则跳转到call 8049105
该语句,也就是说第一个数为2(地址为%ebp-24
)。
cmpl $0x3,-0x20(%ebp)
je 8048b84
这一句表示如果等于3则绕过炸弹爆炸,继续执行下列语句,第二个数为3(地址为%ebp-20
)。
-0x24(%ebp),%ebx
这一句为关键句,表示ebx为栈针指向%ebp-24
cmp $0x6,%esi
jne 8048b8c
这两句表示循环结束的条件以及跳转的位置mov %esi,%eax
,%esi
中的值小于6时循环一直进行。
循环过程如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A7FxDtpa-1584672291160)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\1558878252503.png)]
每次指针的移动都在计算结束之后。
所以答案为2 3 7 16 44 124
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QzwcRRKv-1584672291164)(C:\Users\Lenovo\Desktop\pa实验报告\bomb37\新建文件夹\3.PNG)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dQgAApNC-1584672291164)(C:\Users\Lenovo\Desktop\pa实验报告\bomb37\新建文件夹\4.PNG)]
思路:
查看汇编源代码asm.txt文件,在main函数中找到如下语句
这里为phase3函数在main()函数中被调用的位置):
08048bc1 :
8048bc1: 55 push %ebp
8048bc2: 89 e5 mov %esp,%ebp
8048bc4: 83 ec 18 sub $0x18,%esp
8048bc7: 65 a1 14 00 00 00 mov %gs:0x14,%eax
8048bcd: 89 45 f4 mov %eax,-0xc(%ebp)
8048bd0: 31 c0 xor %eax,%eax
8048bd2: 8d 45 f0 lea -0x10(%ebp),%eax
8048bd5: 50 push %eax
8048bd6: 8d 45 ec lea -0x14(%ebp),%eax
8048bd9: 50 push %eax
8048bda: 68 57 a2 04 08 push $0x804a257
8048bdf: ff 75 08 pushl 0x8(%ebp)
8048be2: e8 29 fc ff ff call 8048810 <__isoc99_sscanf@plt>
8048be7: 83 c4 10 add $0x10,%esp
8048bea: 83 f8 01 cmp $0x1,%eax
8048bed: 7f 05 jg 8048bf4
8048bef: e8 11 05 00 00 call 8049105
8048bf4: 83 7d ec 07 cmpl $0x7,-0x14(%ebp)
8048bf8: 77 5b ja 8048c55
8048bfa: 8b 45 ec mov -0x14(%ebp),%eax
8048bfd: ff 24 85 c0 a0 04 08 jmp *0x804a0c0(,%eax,4)
8048c04: b8 93 00 00 00 mov $0x93,%eax
8048c09: eb 05 jmp 8048c10
8048c0b: b8 00 00 00 00 mov $0x0,%eax
8048c10: 2d 2d 03 00 00 sub $0x32d,%eax
8048c15: eb 05 jmp 8048c1c
8048c17: b8 00 00 00 00 mov $0x0,%eax
8048c1c: 05 e0 00 00 00 add $0xe0,%eax
8048c21: eb 05 jmp 8048c28
8048c23: b8 00 00 00 00 mov $0x0,%eax
8048c28: 83 e8 79 sub $0x79,%eax
8048c2b: eb 05 jmp 8048c32
8048c2d: b8 00 00 00 00 mov $0x0,%eax
8048c32: 83 c0 79 add $0x79,%eax
8048c35: eb 05 jmp 8048c3c
8048c37: b8 00 00 00 00 mov $0x0,%eax
8048c3c: 83 e8 79 sub $0x79,%eax
8048c3f: eb 05 jmp 8048c46
8048c41: b8 00 00 00 00 mov $0x0,%eax
8048c46: 83 c0 79 add $0x79,%eax
8048c49: eb 05 jmp 8048c50
8048c4b: b8 00 00 00 00 mov $0x0,%eax
8048c50: 83 e8 79 sub $0x79,%eax
8048c53: eb 0a jmp 8048c5f
8048c55: e8 ab 04 00 00 call 8049105
8048c5a: b8 00 00 00 00 mov $0x0,%eax
8048c5f: 83 7d ec 05 cmpl $0x5,-0x14(%ebp)
8048c63: 7f 05 jg 8048c6a
8048c65: 3b 45 f0 cmp -0x10(%ebp),%eax
8048c68: 74 05 je 8048c6f
8048c6a: e8 96 04 00 00 call 8049105
8048c6f: 8b 45 f4 mov -0xc(%ebp),%eax
8048c72: 65 33 05 14 00 00 00 xor %gs:0x14,%eax
8048c79: 74 05 je 8048c80
8048c7b: e8 10 fb ff ff call 8048790 <__stack_chk_fail@plt>
8048c80: c9 leave
8048c81: c3 ret
该题主要考察switch语句的使用,从已有代码中我们不能知道需要输入的内容,但是根据代码中已知信息我们可以由以下步骤得出答案。
首先从push $0x804a257
查询地址为$0x804a257
的内容,内容为%d %d
由此可知我们在此处需要输入两个整数。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sx0qUbtx-1584672291165)(C:\Users\Lenovo\Desktop\pa实验报告\bomb37\新建文件夹\5.PNG)]
cmp $0x1,%eax
jg 8048bf4
call 8049105
cmpl $0x7,-0x14(%ebp)
ja 8048c55
根据以上代码段可知,我们需要输入的数必须大于1小于7,否则炸弹爆炸。
代码段jmp *0x804a0c0(,%eax,4)
我关键句,这句决定了我们在输入第一个数之后跳转的代码位置。由于*0x804a0c0
表示对该地址内容的访问,所以我们先对该地址的内容进行查询,查询后知道内容为0x804ac04
,根据该语句计算可以得到跳转的位置例如M[%eax]=0,跳转的位置为0x804ac04+0*4=0x804ac04。那么根据8048c04: b8 93 00 00 00 mov $0x93,%eax
依次往下计算可以得到答案为-563.输入其他的数据则跳到相应的语句进行计算。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TwrtqZI4-1584672291167)(C:\Users\Lenovo\Desktop\pa实验报告\bomb37\新建文件夹\6.PNG)]
思路:
查看汇编源代码asm.txt文件,在main函数中找到如下语句
这里为phase3函数在main()函数中被调用的位置):
08048cd9 :
8048cd9: 55 push %ebp
8048cda: 89 e5 mov %esp,%ebp
8048cdc: 83 ec 18 sub $0x18,%esp
8048cdf: 65 a1 14 00 00 00 mov %gs:0x14,%eax
8048ce5: 89 45 f4 mov %eax,-0xc(%ebp)
8048ce8: 31 c0 xor %eax,%eax
8048cea: 8d 45 f0 lea -0x10(%ebp),%eax
8048ced: 50 push %eax
8048cee: 8d 45 ec lea -0x14(%ebp),%eax
8048cf1: 50 push %eax
8048cf2: 68 57 a2 04 08 push $0x804a257
8048cf7: ff 75 08 pushl 0x8(%ebp)
8048cfa: e8 11 fb ff ff call 8048810 <__isoc99_sscanf@plt>
8048cff: 83 c4 10 add $0x10,%esp
8048d02: 83 f8 02 cmp $0x2,%eax
8048d05: 75 06 jne 8048d0d
8048d07: 83 7d ec 0e cmpl $0xe,-0x14(%ebp)
8048d0b: 76 05 jbe 8048d12
8048d0d: e8 f3 03 00 00 call 8049105
8048d12: 83 ec 04 sub $0x4,%esp
8048d15: 6a 0e push $0xe
8048d17: 6a 00 push $0x0
8048d19: ff 75 ec pushl -0x14(%ebp)
8048d1c: e8 61 ff ff ff call 8048c82
8048d21: 83 c4 10 add $0x10,%esp
8048d24: 83 f8 07 cmp $0x7,%eax
8048d27: 75 06 jne 8048d2f
8048d29: 83 7d f0 07 cmpl $0x7,-0x10(%ebp)
8048d2d: 74 05 je 8048d34
8048d2f: e8 d1 03 00 00 call 8049105
8048d34: 8b 45 f4 mov -0xc(%ebp),%eax
8048d37: 65 33 05 14 00 00 00 xor %gs:0x14,%eax
8048d3e: 74 05 je 8048d45
8048d40: e8 4b fa ff ff call 8048790 <__stack_chk_fail@plt>
8048d45: c9 leave
8048d46: c3 ret
观察整个代码,其中涉及到一个函数的调用func4,代码如下:
08048c82 :
8048c82: 55 push %ebp
8048c83: 89 e5 mov %esp,%ebp
8048c85: 56 push %esi
8048c86: 53 push %ebx
8048c87: 8b 55 08 mov 0x8(%ebp),%edx
8048c8a: 8b 4d 0c mov 0xc(%ebp),%ecx
8048c8d: 8b 75 10 mov 0x10(%ebp),%esi
8048c90: 89 f0 mov %esi,%eax
8048c92: 29 c8 sub %ecx,%eax
8048c94: 89 c3 mov %eax,%ebx
8048c96: c1 eb 1f shr $0x1f,%ebx
8048c99: 01 d8 add %ebx,%eax
8048c9b: d1 f8 sar %eax
8048c9d: 8d 1c 08 lea (%eax,%ecx,1),%ebx
8048ca0: 39 d3 cmp %edx,%ebx
8048ca2: 7e 15 jle 8048cb9
8048ca4: 83 ec 04 sub $0x4,%esp
8048ca7: 8d 43 ff lea -0x1(%ebx),%eax
8048caa: 50 push %eax
8048cab: 51 push %ecx
8048cac: 52 push %edx
8048cad: e8 d0 ff ff ff call 8048c82
8048cb2: 83 c4 10 add $0x10,%esp
8048cb5: 01 d8 add %ebx,%eax
8048cb7: eb 19 jmp 8048cd2
8048cb9: 89 d8 mov %ebx,%eax
8048cbb: 39 d3 cmp %edx,%ebx
8048cbd: 7d 13 jge 8048cd2
8048cbf: 83 ec 04 sub $0x4,%esp
8048cc2: 56 push %esi
8048cc3: 8d 43 01 lea 0x1(%ebx),%eax
8048cc6: 50 push %eax
8048cc7: 52 push %edx
8048cc8: e8 b5 ff ff ff call 8048c82
8048ccd: 83 c4 10 add $0x10,%esp
8048cd0: 01 d8 add %ebx,%eax
8048cd2: 8d 65 f8 lea -0x8(%ebp),%esp
8048cd5: 5b pop %ebx
8048cd6: 5e pop %esi
8048cd7: 5d pop %ebp
8048cd8: c3 ret
阅读代码可知,整个反汇编中最重要的是函数中的部分,函数实质是个递归调用的过程。我在解题的时候稍微用的一点取巧的办法。由于两个参数的范围都已知,可以逐个进行配对测试,可以直接测出哪两个参数符合要求。
答案为7 7
.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TtjOMEj4-1584672291169)(C:\Users\Lenovo\Desktop\pa实验报告\bomb37\新建文件夹\00.PNG)]
思路:
查看汇编源代码asm.txt文件,在main函数中找到如下语句
这里为phase3函数在main()函数中被调用的位置):
08048d47 :
8048d47: 55 push %ebp
8048d48: 89 e5 mov %esp,%ebp
8048d4a: 83 ec 18 sub $0x18,%esp
8048d4d: 65 a1 14 00 00 00 mov %gs:0x14,%eax
8048d53: 89 45 f4 mov %eax,-0xc(%ebp)
8048d56: 31 c0 xor %eax,%eax
8048d58: 8d 45 f0 lea -0x10(%ebp),%eax
8048d5b: 50 push %eax
8048d5c: 8d 45 ec lea -0x14(%ebp),%eax
8048d5f: 50 push %eax
8048d60: 68 57 a2 04 08 push $0x804a257
8048d65: ff 75 08 pushl 0x8(%ebp)
8048d68: e8 a3 fa ff ff call 8048810 <__isoc99_sscanf@plt>
8048d6d: 83 c4 10 add $0x10,%esp
8048d70: 83 f8 01 cmp $0x1,%eax
8048d73: 7f 05 jg 8048d7a
8048d75: e8 8b 03 00 00 call 8049105
8048d7a: 8b 45 ec mov -0x14(%ebp),%eax
8048d7d: 83 e0 0f and $0xf,%eax
8048d80: 89 45 ec mov %eax,-0x14(%ebp)
8048d83: 83 f8 0f cmp $0xf,%eax
8048d86: 74 2c je 8048db4
8048d88: b9 00 00 00 00 mov $0x0,%ecx
8048d8d: ba 00 00 00 00 mov $0x0,%edx
8048d92: 83 c2 01 add $0x1,%edx
8048d95: 8b 04 85 e0 a0 04 08 mov 0x804a0e0(,%eax,4),%eax
8048d9c: 01 c1 add %eax,%ecx
8048d9e: 83 f8 0f cmp $0xf,%eax
8048da1: 75 ef jne 8048d92
8048da3: c7 45 ec 0f 00 00 00 movl $0xf,-0x14(%ebp)
8048daa: 83 fa 0f cmp $0xf,%edx
8048dad: 75 05 jne 8048db4
8048daf: 3b 4d f0 cmp -0x10(%ebp),%ecx
8048db2: 74 05 je 8048db9
8048db4: e8 4c 03 00 00 call 8049105
8048db9: 8b 45 f4 mov -0xc(%ebp),%eax
8048dbc: 65 33 05 14 00 00 00 xor %gs:0x14,%eax
8048dc3: 74 05 je 8048dca
8048dc5: e8 c6 f9 ff ff call 8048790 <__stack_chk_fail@plt>
8048dca: c9 leave
8048dcb: c3 ret
查看$0x804a257
处的内容可知,此处需要填入两个整数%d %d
。
比较%eax与1的大小,如果大于1则跳转到8048d7a
处,否则爆炸。将%eax低四位按位取出,并且不为1111。
根据后面的循环体可知,是一个循环累加的过程,加入输入参数5
,将数组中的数进行累加,得到第二个参数115
。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hBZfNhPy-1584672291172)(C:\Users\Lenovo\Desktop\pa实验报告\bomb37\新建文件夹\00.PNG)]
##遇到的问题及解决方案
看代码的时候,没有能够完全理解栈针和栈的使用情况,作图可以很好的解释变化情况,详情请看第二题。
读代码能力很重要,对于寄存器的使用需要有足够的了解。
ret
查看`$0x804a257`处的内容可知,此处需要填入两个整数`%d %d`。
比较%eax与1的大小,如果大于1则跳转到`8048d7a`处,否则爆炸。将%eax低四位按位取出,并且不为1111。
根据后面的循环体可知,是一个循环累加的过程,加入输入参数`5`,将数组中的数进行累加,得到第二个参数`115`。[外链图片转存中...(img-hBZfNhPy-1584672291172)]
##遇到的问题及解决方案
看代码的时候,没有能够完全理解栈针和栈的使用情况,作图可以很好的解释变化情况,详情请看第二题。
## 实验心得
读代码能力很重要,对于寄存器的使用需要有足够的了解。