bomblab 拆炸弹

#南京航空航天大学《计算机组成原理Ⅱ课程设计》报告

  • 姓名:xx
  • 班级:1617
  • 学号:1617
  • 报告阶段:Bomblab
  • 完成日期:2019.5.26

##目录

文章目录

    • 实验内容
      • 1.Bomb1
      • 2.Bomb2
      • 3.Bomb3
      • 4.Bomb4
      • 5.Bomb5
    • 实验心得
    • 备注

实验内容

objdump –d bomb > asm.txt
对bomb进行反汇编并将汇编代码输出到asm.txt中。

1.Bomb1

思路:
查看汇编源代码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)]

2.Bomb2

思路:
查看汇编源代码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)]

3.Bomb3

思路:
查看汇编源代码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)]

4.Bomb4

思路:
查看汇编源代码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)]

5.Bomb5

思路:
查看汇编源代码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)]

##遇到的问题及解决方案

看代码的时候,没有能够完全理解栈针和栈的使用情况,作图可以很好的解释变化情况,详情请看第二题。


## 实验心得

读代码能力很重要,对于寄存器的使用需要有足够的了解。

你可能感兴趣的:(bomblab 拆炸弹)