笔者只是根据自己的电脑进行环境的配置,不一定适配所有的电脑,也不是万能的方法,如果读者使用本人的方法没有配置成功本人深表抱歉。
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 bomb
777 = 111 111 11 二进制表示三种模式都允许
chmod u+x bomb
u: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如果是非负则跳转
一波操作下来他们的值