CSAPP lab. binary bomb 二进制炸弹

http://csapp.cs.cmu.edu/public/labs.html 下了个32位的bomb文件。。

使用

-objdump -d bomb

得到反汇编的代码

= =一大坨的完全被吓到了有木有


然后看到有main函数还有6个phase,于是抓住重点开始研究

call <phase_x>  之后如果ret出来再调用<phase_defused>就表示拆蛋。。!弹成功了

不然就会爆炸。

所以我们深入到每个phase_x里面研究。

先来看phase_1

08048b20 <phase_1>:
 8048b20:	55                   	push   %ebp
 8048b21:	89 e5                	mov    %esp,%ebp
 8048b23:	83 ec 08             	sub    $0x8,%esp
 8048b26:	8b 45 08             	mov    0x8(%ebp),%eax
 8048b29:	83 c4 f8             	add    $0xfffffff8,%esp
 8048b2c:	68 c0 97 04 08       	push   $0x80497c0
 8048b31:	50                   	push   %eax
 8048b32:	e8 f9 04 00 00       	call   8049030 <strings_not_equal>  ;这个函数改变了%eax的值
 8048b37:	83 c4 10             	add    $0x10,%esp
 8048b3a:	85 c0                	test   %eax,%eax
 8048b3c:	74 05                	je     8048b43 <phase_1+0x23>       ;如果eax不为0,那么字符串正确
 8048b3e:	e8 b9 09 00 00       	call   80494fc <explode_bomb>
 8048b43:	89 ec                	mov    %ebp,%esp
 8048b45:	5d                   	pop    %ebp
 8048b46:	c3                   	ret    
 8048b47:	90                   	nop

我们看到,

其中会调用<strings_not_equal>函数,之后再判断寄存器%eax是否为0,如果为0的话,phase_1正常ret,不然就调用explode_bomb引爆炸弹

所以关键就是strings_not_equal函数,部分代码见下面:

08049030 <strings_not_equal>:
 8049030:	55                   	push   %ebp
 8049031:	89 e5                	mov    %esp,%ebp
 8049033:	83 ec 0c             	sub    $0xc,%esp
 8049036:	57                   	push   %edi
 8049037:	56                   	push   %esi
 8049038:	53                   	push   %ebx
 8049039:	8b 75 08             	mov    0x8(%ebp),%esi
 804903c:	8b 7d 0c             	mov    0xc(%ebp),%edi
 804903f:	83 c4 f4             	add    $0xfffffff4,%esp

 8049039:	8b 75 08             	mov    0x8(%ebp),%esi
 804903c:	8b 7d 0c             	mov    0xc(%ebp),%edi

这两行可以看出strings_not_equal有两个参数,那么是哪两个呢?我们回到phase_1里面,看到再调用之前的两个进栈命令

进栈的分别是%eax和$0x80497c0,猜测比较两个字符串的函数的参数必然是两个指向char类型的指针,所以继续猜想eax是我们输入的字符串,而0x80497c0就是系统给定的字符串了,然后从整个文件里搜0x80497c0.发现什么都没有= =怎么办好zhaoji!!!。。。。

不过我们好像忘了什么东西!!gdb!!以前调试C的时候用过,发现不方便就再也不用了!没想到它在逆向工程的时候这么逆天!

好了我们  gdb comb

设断点:b *0x8048b2c    

查看字符串内容:p (char*) 0x80497c0

出现了!

“Public speaking is very easy.”   ,nice 第一关pass


接着看phase_2

08048b48 <phase_2>:
 8048b48:	55                   	push   %ebp
 8048b49:	89 e5                	mov    %esp,%ebp
 8048b4b:	83 ec 20             	sub    $0x20,%esp
 8048b4e:	56                   	push   %esi
 8048b4f:	53                   	push   %ebx
 8048b50:	8b 55 08             	mov    0x8(%ebp),%edx           ;phase_2的参数

 8048b53:	83 c4 f8             	add    $0xfffffff8,%esp
 8048b56:	8d 45 e8             	lea    -0x18(%ebp),%eax
 8048b59:	50                   	push   %eax                  ;
 8048b5a:	52                   	push   %edx		      ;read_six_numbers的参数
 8048b5b:	e8 78 04 00 00       	call   8048fd8 <read_six_numbers>
 8048b60:	83 c4 10             	
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值