bomblab CSAPP(深入理解计算机系统)

本文详细介绍了CSAPP实验中的bomblab,通过反汇编分析各个phase,逐步解决拆除炸弹的问题。每个phase的关键在于理解代码逻辑,找到正确的输入答案。作者提供了github链接以供参考。
摘要由CSDN通过智能技术生成

CSAPP_lab之bomblab


前言

所有lab的解答可以参考我的github链接
https://github.com/Changjing-Liu/CSAPP_lab

bomblab是这我最喜欢的lab之一,主要思路通过反汇编代码找到拆除炸弹的答案。
拆除炸弹总共需要连续输入6次(phase_1、2。。。。6)正确答案

一、phase_1

第一个炸弹比较简单,就没有注释了。
主要注意0x400ee9这一行,目的是调用strings_not_equal,来比较输入字符串是否与答案相等。随后跳转到0x401338,找到答案存储在0x402400,通过GDB调试可以输出寄存器的值得到答案。

0000000000400ee0 <phase_1>:
  400ee0:	48 83 ec 08          	sub    $0x8,%rsp
  400ee4:	be 00 24 40 00       	mov    $0x402400,%esi
  400ee9:	e8 4a 04 00 00       	callq  401338 <strings_not_equal>
  400eee:	85 c0                	test   %eax,%eax
  400ef0:	74 05                	je     400ef7 <phase_1+0x17>
  400ef2:	e8 43 05 00 00       	callq  40143a <explode_bomb>
  400ef7:	48 83 c4 08          	add    $0x8,%rsp
  400efb:	c3                   	retq   
  答案;"Border relations with Canada have never been better."

二、phase_2

0000000000400efc <phase_2>:
  400efc:	55                   	push   %rbp+
  400efd:	53                   	push   %rbx
  400efe:	48 83 ec 28          	sub    $0x28,%rsp           ;分配空间
  400f02:	48 89 e6             	mov    %rsp,%rsi            ;%rsp指向末尾,赋值给rsi,其代表首位地址
  400f05:	e8 52 05 00 00       	callq  40145c <read_six_numbers>
  400f0a:	83 3c 24 01          	cmpl   $0x1,(%rsp)                  ;compare [%rsp]:1
  400f0e:	74 20                	je     400f30 <phase_2+0x34>        ;if == ,goto 400f030
  400f10:	e8 25 05 00 00       	callq  40143a <explode_bomb>        ;else bomb
  400f15:	eb 19                	jmp    400f30 <phase_2+0x34>        ;goto 400f30
  400f17:	8b 43 fc             	mov    -0x4(%rbx),%eax              ;%eax=%rbx
  400f1a:	01 c0                	add    %eax,%eax                    ;%eax=%eax+%eax   将这个数字乘2
  400f1c:	39 03                	cmp    %eax,(%rbx)                  ;compare R[%rbx]:%eax 是否与下一位数字
  400f1e:	74 05                	je     400f25 <phase_2+0x29>        ;if ==, goto 400f25
  400f20:	e8 15 05 00 00       	callq  40143a <explode_bomb>
  400f25:	48 83 c3 04          	add    $0x4,%rbx                    ;%rbx=%rbx+4  ,移到下一位
  400f29:	48 39 eb             	cmp    %rbp,%rbx                    ;compare %rbx:%rbp 如果这一个数字小于等于最后一个数字
  400f2c:	75 e9                	jne    400f17 <phase_2+0x1b>        ;if <=,goto 400f17
  400f2e:	eb 0c                	jmp    400f3c <phase_2+0x40>
  400f30:	48 8d 5c 24 04       	lea    0x4(%rsp),%rbx               ;%rbx=%rsp+4 此时rbx代表第2个数字
  400f35:	48 8d 6c 24 18       	lea    0x18(%rsp),%rbp              ;%rbp=%rsp+24 代表第6个数字
  400f3a:	eb db                	jmp    400f17 <phase_2+0x1b>        ;goto 400f17
  400f3c:	48 83 c4 28          	add    $0x28,%rsp
  400f40:	5b                   	pop    %rbx
  400f41:	5d                   	pop    %rbp
  400f42:	c3                   	retq 
  答案: 1 2 4 8 16 32

三、phase_3

0000000000400f43 <phase_3>:
  400f43:	48 83 ec 18          	sub    $0x18,%rsp                   ;%分配24位空间
  400f47:	48 8d 4c 24 0c       	lea    0xc(%rsp),%rcx               ;%rcx=%rsp+12(rcx存储第4个数字的地址)
  400f4c:	48 8d 54 24 08       	lea    0x8(%rsp),%rdx               ;%rdx=%rsp+8 (rdx存储第3个数字的地址)
  400f51:	be cf 25 40 00       	mov    $0x4025cf,%esi               ;%esi=0x4025cf
  400f56:	b8 00 00 00 00       	mov    $0x0,%eax                    ;%eax=0x0
  400f5b:	e8 90 fc ff ff       	callq  400bf0 <__isoc99_sscanf@plt> ;读取数据
  400f60:	83 f8 01             	cmp    $0x1,%eax                    ;compare %eax :1
  400f63:	7f 05                	jg     400f6a <phase_3+0x27>        ;if >,goto 400f6a
  400f65:	e8 d0 04 00 00       	callq  40143a <explode_bomb>
  400f6a:	83 7c 24 08 07       	cmpl   $0x7,0x8(%rsp)               ;compare M[%rsp+8]:7 7个索引
  400f6f:	77 3c                	ja     400fad <phase_3+0x6a>        ;if >,goto 400fad, explode_bomb (因此,实际要求<=)
  400f71:	8b 44 24 08          	mov    0x8(%rsp),%eax               ;%eax=M[%rsp+8]
  400f75:	ff 24 c5 70 24 40 00 	jmpq   *0x402470(,%rax,8)           ;goto *(402470+8*%rax) Swith跳转 %rax代表索引
  400f7c:	b8 cf 00 00 00       	mov    $0xcf,%eax                   ;Loc_A;%eax=207
  400f81:	eb 3b                	jmp    400fbe <phase_3+0x7b>        ;goto done
  400f83:	b8 c3 02 00 00       	mov    $0x2c3,%eax                  ;loc_B;%eax=707
  400f88:	eb 34                	jmp    400fbe <phase_3+0x7b>        ;goto done
  400f8a:	b8 00 01 00 00       	mov    $0x100,%eax                  ;loc_c;%eax=256
  400f8f:	eb 2d                	jmp    400fbe <phase_3+0x7b>        ;goto done
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值