目 录
第1章 实验基本信息........................................................................................ - 3 -
1.1 实验目的....................................................................................................... - 3 -
1.2 实验环境与工具........................................................................................... - 3 -
1.2.1 硬件环境.................................................................................................... - 3 -
1.2.2 软件环境.................................................................................................... - 3 -
1.2.3 开发工具.................................................................................................... - 3 -
1.3 实验预习....................................................................................................... - 3 -
第2章 实验环境建立........................................................................................ - 7 -
2.1 Ubuntu下CodeBlocks反汇编(10分)..................................................... - 7 -
2.2 Ubuntu下EDB运行环境建立(10分)..................................................... - 7 -
第3章 各阶段炸弹破解与分析........................................................................ - 9 -
3.1 阶段1的破解与分析................................................................................... - 9 -
3.2 阶段2的破解与分析................................................................................... - 9 -
3.3 阶段3的破解与分析................................................................................. - 10 -
3.4 阶段4的破解与分析.................................................................................. - 11 -
3.5 阶段5的破解与分析................................................................................. - 12 -
3.6 阶段6的破解与分析................................................................................. - 13 -
3.7 阶段7的破解与分析(隐藏阶段)............................................................... - 15 -
第4章 总结...................................................................................................... - 19 -
4.1 请总结本次实验的收获............................................................................. - 19 -
4.2 请给出对本次实验内容的建议................................................................. - 19 -
参考文献............................................................................................................ - 20 -
第1章 实验基本信息
1.1 实验目的
熟练掌握计算机系统的ISA指令系统与寻址方式
熟练掌握Linux下调试器的反汇编调试跟踪分析机器语言的方法
增强对程序机器级表示、汇编语言、调试器和逆向工程等的理解
1.2 实验环境与工具
1.2.1 硬件环境
X64 CPU;2GHz;2G RAM;256GHD Disk 以上
1.2.2 软件环境
Windows7/10 64位以上;VirtualBox/Vmware 11以上;Ubuntu 16.04 LTS 64位/优麒麟 64位 以上;
1.2.3 开发工具
Visual Studio 2010 64位以上;CodeBlocks 64位;vi/vim/gedit+gcc
1.3 实验预习
第2章 实验环境建立
熟练掌握Linux下调试器的反汇编调试跟踪分析机器语言的方法
增强对程序机器级表示、汇编语言、调试器和逆向工程等的理解
1.2 实验环境与工具
1.2.1 硬件环境
X64 CPU;2GHz;2G RAM;256GHD Disk 以上
1.2.2 软件环境
Windows7/10 64位以上;VirtualBox/Vmware 11以上;Ubuntu 16.04 LTS 64位/优麒麟 64位 以上;
1.2.3 开发工具
Visual Studio 2010 64位以上;CodeBlocks 64位;vi/vim/gedit+gcc
1.3 实验预习
第2章 实验环境建立
1.2 实验环境与工具
1.2.1 硬件环境
X64 CPU;2GHz;2G RAM;256GHD Disk 以上
1.2.2 软件环境
Windows7/10 64位以上;VirtualBox/Vmware 11以上;Ubuntu 16.04 LTS 64位/优麒麟 64位 以上;
1.2.3 开发工具
Visual Studio 2010 64位以上;CodeBlocks 64位;vi/vim/gedit+gcc
1.3 实验预习
第2章 实验环境建立
X64 CPU;2GHz;2G RAM;256GHD Disk 以上
1.2.2 软件环境
Windows7/10 64位以上;VirtualBox/Vmware 11以上;Ubuntu 16.04 LTS 64位/优麒麟 64位 以上;
1.2.3 开发工具
Visual Studio 2010 64位以上;CodeBlocks 64位;vi/vim/gedit+gcc
1.3 实验预习
第2章 实验环境建立
Windows7/10 64位以上;VirtualBox/Vmware 11以上;Ubuntu 16.04 LTS 64位/优麒麟 64位 以上;
1.2.3 开发工具
Visual Studio 2010 64位以上;CodeBlocks 64位;vi/vim/gedit+gcc
1.3 实验预习
第2章 实验环境建立
Visual Studio 2010 64位以上;CodeBlocks 64位;vi/vim/gedit+gcc
1.3 实验预习
第2章 实验环境建立
第2章 实验环境建立
2.1 Ubuntu下CodeBlocks反汇编(10分)
CodeBlocks运行hello.c。反汇编查看printf函数的实现。
要求:C、ASM、内存(显示hello等内容)、堆栈(call printf前)、寄存器同时在一个窗口。
图2-1 Ubuntu下CodeBlocks反汇编截图
2.2 Ubuntu下EDB运行环境建立(10分)
用EDB调试hello.c的执行文件,截图,要求同2.1
图2-2 Ubuntu下EDB截图
第3章 各阶段炸弹破解与分析
每阶段30分,密码10分,分析20分,总分不超过80分
3.1 阶段1的破解与分析
密码如下:There are rumors on the internets.
破解过程:
Esi的值是立即数0x403150,推测推测用户输入的字符串经过readline函数存储在edi,与stringnotequal比较,拆弹字符串救=就储存在地址0x403150
3.2 阶段2的破解与分析
密码如下:N,N+1,N+1+2,N+1+2+3,N+1+2+3+4,N+1+2+3+4+5
破解过程:
如图所示为p2的反汇编,易知函数申请了32的内存空间并调用了read six numbers函数,推测p2的参数为6个数字,指令 cmpl $0x0,(%rsp)参数和0比较小于0跳转,推测第一个传入的参数大于等于0;指令mov $0x1,%ebx,add $0x1,%ebx、cmp $0x5,%ebx、jg 40144d
3.3 阶段3的破解与分析
密码如下:0 472
破解过程:
与阶段二类似,eax为isco99sscanf的返回参数,比较eax小于等于1跳转到explode_bomb,因次传入参数的个数至少为2,且传入的参数应小于7由指令jmpq *0x4031a0(,%rax,8)是一个间接跳转,地址0x4031a0储存着0x40148e,根据n的不同变差n*8个单位,恰好0x40148是一个命令使eax赋值为472,因此有一个0 472的拆弹密码
3.4 阶段4的破解与分析
密码如下:4 2和5 2
破解过程:
显然phase4接受两个数字,一个经过fun4返回值是2,另一个值为2,观察fun4函数发现传递三个变量,edi为传入的一个参数,eax,esi初始分别为14和0分别用a,b表示,函数的返回值是1/2*(signal(a-b)+a-b)+b,等于edi时退出,大于时b=1/2*(signal(a-b)+a-b)+b+1,再次调用fun4并返回结果的2倍+1,小于时a=(signal(a-b)+a-b)+b-1,调用fun4返回结果的2倍,已知结果是2,逆推猜测传入参数是4或者5,因此拆弹密码为4 2和5 2
3.5 阶段5的破解与分析
密码如下:5 115
破解过程:
指令and $0xf, %eax取得第一个参数的后四位,且要求第一个参数不能是15,edx为计数器,ecx为累加,根据当次循环eax的值去寻址mov 0x4031e0(,%rax,4),%eax取到数组中的下一个不连续的元素,结束循环的条件是eax取到15时edx计数到15次,第二个参数与ecx相等。查看地址 0x4031e0(,%rax,4)的元素,观察数组有唯一确定的跳转表
5-12-3-7-11-13-9-4-8-0-10-1-2-14-6-15,累加和115因此得到拆弹密码5 115
3.6 阶段6的破解与分析
密码如下:5 2 4 6 3 1
破解过程:
观察phase6结构,调用了read_six_numbers推测输入为6个整数,首先ebp,ebx分别作为计数器形成双重循环的for结构判断输入的6个数字是否互不相同,如果有相同元素直接爆炸。
第二部分为将0x4052d0中储存的6个节点按照输入的1-6的6个数字编号的顺序顺次相连形成链表,这6个节点分别是:
第三部分为双层循环检查链表中元素是否为降序,如果非降序立刻爆炸,因次得到唯一降序的一组标号5 2 4 6 3 1为拆弹密码
3.7 阶段7的破解与分析(隐藏阶段)
密码如下:
破解过程:
观察phase_defused函数,发现有一个与0x403382地址储存的字符串匹配的步骤,怀疑这就是进入隐藏问题的密码。Gdb查看内存中的字符串,发现密码为DrEvil
观察secret_phase,要求输入的数字小于等于1001,且要求带入进fun7的输出结果为7
根据带入参数与rdi的大小关系带入rdi的左或右子树,若相等返回0,若小于返回fun7的2倍,若大于返回fun7的2倍加1.访问0x4050f0观察二叉树的结构。
将结果7分解为((0*2+1)*2+1)*2+1,故要求输入值是根节点的右子树的右子树的右子树,即1001为拆弹密码
第4章 总结
4.1 请总结本次实验的收获
更加深入理解了汇编语言的指令和不同c语句对应的在汇编语言下的形式,
学会了edb等工具的使用
4.2 请给出对本次实验内容的建议
Ppt里还是有打错的地方,有一些指令希望能有更详细的注释
注:本章为酌情加分项。
参考文献
为完成本次实验你翻阅的书籍与网站等
[1] CSAPP大黑书



