笔者只是根据自己的电脑进行环境的配置,不一定适配所有的电脑,也不是万能的方法,如果读者使用本人的方法没有配置成功本人深表抱歉。
gdb的使用
通过网上查阅一些资料获得
gdb查看内存和寄存器以及中断设置(转)_gdb查看寄存器_wfreehorse的博客-CSDN博客
gdb bomb 
disassemble main
disassemble phase_2
break 序号 #设置断点run 断点运行
举例:寻找rbp-0x30地址上的值
前置指令
打第二关的时候 提前把第一关的指令写入文件中
gdb bomb
break phase_2 #在第二个地方设置断点
run sol.txt
输入第二组数据

实验环境的建立
PPT上的好像不好使???感谢战友yt提供的代码
安装# install dependencies
sudo apt-get install     cmake    build-essential    libboost-dev
sudo apt-get install   libqt5xmlpatterns5-dev       qtbase5-dev
sudo apt-get install  libqt5svg5-dev        libgraphviz-dev            libcapstone-dev
sudo apt install edb-debugger
安装# build and run edb
sudo apt install git
git clone --recursive https://github.com/eteran/edb-debugger.git
cd edb-debugger
mkdir build
cd build
cmake ..   如出错 sudo apt-get install --reinstall pkg-config cmake-data
make
./edb           https://www.cnblogs.com/hizf/p/7843463.html   加搜索路径
chmod 777 bomb777 = 111 111 11 二进制表示三种模式都允许
chmod u+x bombu:user x运行允许
拆弹过程
cd 到所在的位置
edb --run bomb阶段1
edb
run运行到readline 随便输入一个字符串让程序运行

随便输入回车后发现运行到下一句mov那里 参数传递+下一句函数调用

看观察窗rax显示输入的内容 ,参数送给rdi,然后继续step out运行 ,执行到调用phase1,然后step into


在调用函数是否相等之前,他调用了一个赋值指令,并且编译器后边提示是一个内容:“And they...."字符串,也可以直接通过地址查看内容:在 data dump区域输入地址



Tesql是做异或操作 但是我不理解为什么 是为了加载一个标志位么
ZF位等于0,表明结果不相等 返回值不是0,不相等就跳转到bombexplode函数,程序结束

将代码写入文件第一关闯关成功!
gdb
转载一个博主的论文,testq 可以看成是否是等于0的指令 eax存的是string not equal的返回值

2.第二关执行相同的操作:先把第一关的正确答案输入,建议用
edb --run bomb1 sol.txt
然后到phase_2的时候也是step into
#分配总共的空间
#rbp的值-0x30给rsi
cmp dword [rbp-0x30],0 #比较四字节大小在位置rbp-0x30的数据和0比较
js判断是否是负数
推测输入的六位数据是存放在rdi 第一个参数寄存器中第二个我是直接看反汇编代码分析--->asm1.txt中
AT&T格式
0000000000401414 <phase_2>:
  401414:	55                   	push   %rbp
  401415:	48 89 e5             	mov    %rsp,%rbp
  401418:	53                   	push   %rbx
  401419:	48 83 ec 28          	sub    $0x28,%rsp        #前几步都是程序的准备工作
  40141d:	48 8d 75 d0          	lea    -0x30(%rbp),%rsi  #rsi = rbp-00x30
  401421:	e8 1a 05 00 00       	call   401940 <read_six_numbers>
  401426:	83 7d d0 00          	cmpl   $0x0,-0x30(%rbp)
  40142a:	78 07                	js     401433 <phase_2+0x1f>
  40142c:	bb 01 00 00 00       	mov    $0x1,%ebx
  401431:	eb 0f                	jmp    401442 <phase_2+0x2e>
  401433:	e8 e6 04 00 00       	call   40191e <explode_bomb>
  401438:	eb f2                	jmp    40142c <phase_2+0x18>
  40143a:	e8 df 04 00 00       	call   40191e <explode_bomb>
  40143f:	83 c3 01             	add    $0x1,%ebx
  401442:	83 fb 05             	cmp    $0x5,%ebx
  401445:	7f 17                	jg     40145e <phase_2+0x4a>
  401447:	48 63 c3             	movslq %ebx,%rax
  40144a:	8d 53 ff             	lea    -0x1(%rbx),%edx
  40144d:	48 63 d2             	movslq %edx,%rdx
  401450:	89 d9                	mov    %ebx,%ecx
  401452:	03 4c 95 d0          	add    -0x30(%rbp,%rdx,4),%ecx
  401456:	39 4c 85 d0          	cmp    %ecx,-0x30(%rbp,%rax,4)
  40145a:	74 e3                	je     40143f <phase_2+0x2b>
  40145c:	eb dc                	jmp    40143a <phase_2+0x26>
  40145e:	48 83 c4 28          	add    $0x28,%rsp
  401462:	5b                   	pop    %rbx
  401463:	5d                   	pop    %rbp
  401464:	c3                   	ret    
看到read six numbers猜测该程序有6个参数,指令cmpl $0x0,-0x30(%rbp) 参数rbp-0x30和0比较如果小于0跳转,推测第一个传入的参数>=0;指令mov $0x1,%ebx 401431 jmp 401442 <phase_2+0x2e call 40191e <explode_bomb> jmp 40142c <phase_2+0x18> call 40191e <explode_bomb> add $0x1,%ebx cmp $0x5,%ebx推测结构类似 for(i = 0; i< 5;i++)结构,ebx是计数器i;edx是ebx-1的前一个编号,利用地址可以得到(%rsp,%rax,4)为第i个参数用类似数组来表示,指令add (%rsp,%rdx,4),%ecx表明后续参数的递推关系式为前一个参数加上当前的计数I(0到5),即对正整数N,二阶段炸弹拆弹字符串

3.
0000000000401465 <phase_3>:
  401465:	55                   	push   %rbp
  401466:	48 89 e5             	mov    %rsp,%rbp
  401469:	48 83 ec 10          	sub    $0x10,%rsp
  40146d:	48 8d 4d f8          	lea    -0x8(%rbp),%rcx
  401471:	48 8d 55 fc          	lea    -0x4(%rbp),%rdx
  401475:	be 0f 33 40 00       	mov    $0x40330f,%esi
  40147a:	b8 00 00 00 00       	mov    $0x0,%eax
  40147f:	e8 8c fc ff ff       	call   401110 <__isoc99_sscanf@plt>
  401484:	83 f8 01             	cmp    $0x1,%eax
  401487:	7e 11                	jle    40149a <phase_3+0x35>
  401489:	8b 45 fc             	mov    -0x4(%rbp),%eax
  40148c:	83 f8 07             	cmp    $0x7,%eax
  40148f:	77 46                	ja     4014d7 <phase_3+0x72>
  401491:	89 c0                	mov    %eax,%eax
  401493:	ff 24 c5 b0 31 40 00 	jmp    *0x4031b0(,%rax,8)
  40149a:	e8 7f 04 00 00       	call   40191e <explode_bomb>
  40149f:	eb e8                	jmp    401489 <phase_3+0x24>
  4014a1:	b8 4c 02 00 00       	mov    $0x24c,%eax
  4014a6:	39 45 f8             	cmp    %eax,-0x8(%rbp)
  4014a9:	75 3f                	jne    4014ea <phase_3+0x85>
  4014ab:	c9                   	leave  
  4014ac:	c3                   	ret    
  4014ad:	b8 34 02 00 00       	mov    $0x234,%eax
  4014b2:	eb f2                	jmp    4014a6 <phase_3+0x41>
  4014b4:	b8 af 01 00 00       	mov    $0x1af,%eax
  4014b9:	eb eb                	jmp    4014a6 <phase_3+0x41>
  4014bb:	b8 12 03 00 00       	mov    $0x312,%eax
  4014c0:	eb e4                	jmp    4014a6 <phase_3+0x41>
  4014c2:	b8 99 01 00 00       	mov    $0x199,%eax
  4014c7:	eb dd                	jmp    4014a6 <phase_3+0x41>
  4014c9:	b8 29 02 00 00       	mov    $0x229,%eax
  4014ce:	eb d6                	jmp    4014a6 <phase_3+0x41>
  4014d0:	b8 11 03 00 00       	mov    $0x311,%eax
  4014d5:	eb cf                	jmp    4014a6 <phase_3+0x41>
  4014d7:	e8 42 04 00 00       	call   40191e <explode_bomb>
  4014dc:	b8 00 00 00 00       	mov    $0x0,%eax
  4014e1:	eb c3                	jmp    4014a6 <phase_3+0x41>
  4014e3:	b8 dc 02 00 00       	mov    $0x2dc,%eax
  4014e8:	eb bc                	jmp    4014a6 <phase_3+0x41>
  4014ea:	e8 2f 04 00 00       	call   40191e <explode_bomb>
  4014ef:	eb ba                	jmp    4014ab <phase_3+0x46>常见的跳转指令
jne 不相等跳转 not equal
js 表示负数跳转 SF
jns非负数跳转
jg great
jge >=
jl 
jle
ja
jae
jb
jbe
test 是按位取异或,相当于取非的操作,test + js如果是非负则跳转

一波操作下来他们的值



















