




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程名称:计算机系统原理实验实验课时: 32 课时实验项目名称: BombLab 二进制炸弹实验材料:实验环境:可执行文件 bomb 、源代码 bomb.c 、说明 README Linux 操作系统(安装虚拟机和 Ubuntu)实验工具:调试工具 gdb实验内容:程序运行中有 6 道关卡(phases ),每道关卡需要用户在终端上输入特定的字符串。输入正确则炸弹解除,错误则炸弹引爆。 实验方法:1. 将程序反汇编成汇编语言。2. 结合 C 语言文件找到每个关卡的入口函数。3. 然后分析汇编代码, 找到每个 phase 中引导程序跳转到 explode_bomb 程序的地方。 4.分析其成功跳
2、转的条件以此为突破口寻找应该输入的字符串!【实验分析】预先准备资料.首先查看整个 bomb.c 的代码,发现整个炸弹组是由 6 个小炸弹(函数)组成的。整个 main 函数比较简单,函数间变量几乎没有影响。因此,只需要依次解除 6 个小炸弹即可。实验材料只有一个可执行文件,先把他用 objdump -d 反汇编得到汇编文件。打开文件发 现对应 6 个 phase ,对应的汇编文件十分长,因此我们直接步入phase 部分。phase_1 :1. 利用 gdb 调试, gdb bomb2. disassemble phaes_1经分析,答案极有可能存放在 0x804a15c 处3. 可看汇编代码如
3、上图所示,以下为栈帧的计算过程4. 我们看到如上图所示,调用了一个 函数,根据名字判断是判断两个字符串是否相等。我们找到这个函数来验证我们的猜想是否正确:5. 在 gdb 下调试,设立断点,并检验phase_2 :1. disassemble phase_2可看到 phase_2 的汇编代码以及理解,利用一个循环,不断计算出这个六位密 码。2. 栈帧的计算步骤Q纟自兮亍eVvQIL F5*3 VOpQWi 爲i6j 一置rlna-i crs 4aL2 十5 pr二 7 ) rlisg2 rb :i袒5-:ICrxE(g2p,2 丄口:=?I Qf-AX V4-A S=F 二帝公 U产沐j *E
4、-d 上 W冥吏 Z ft2 ctrff蚩 Wdd f, ?XZS ?昭H冒 霽倉票WW鳴書裟s-m3sl=6-aoHo alll a-2llao+alll a-3HaM+aull2a-4ll3 a-5ll55.即答案猜想为 0 1 1 2 3 5 ,下面进行检验3. gdb 下进行调试检验总结通过这次拆弹的历练, 我对数据在内存中以及汇编的表示方法有了更加深刻的认识, 做 得过程可能有时候会摸不着头脑,这个时候告诉自己冷静,相信自己。phase_3 :6. 利用 gdb 调试, gdb bomb7. disassemble phaes_3资料.通过汇编代码画出栈的情况可看汇编代码如上图所示,
5、以下为栈帧的计算过程可以看到调用 函数 sscanf ,那么 sscanf 函数是做什么用的的呢?查阅资料如下:functionsscanfint sscanf ( const char * s, const char * format, .);Read formatted data from stringReads data from s and stores them according to parameterformat into the locations given bythe additional arguments, as ifscanf was used, but readi
6、ng froms instead of the standard input( stdin ).The additional arguments should point to already allocated objects of the type specified by their corresponding format specifier within theformat string.Return ValueOn success, the function returns the number of items in the argument list successfully
7、filled. This count can match the expected number of items or be less (even zero) in the case of a matching failure.In the case of an input failure before any data could be successfully interpreted,EOF is returned.成功时 , 该函数返回已成功填充的参数列表中的个数。在匹配的失败情况下 , 此计数可以与 预期的参数个数匹配 , 或小于 (甚至为零 )。在成功解释任何数据之前输入失败的情况
8、下 , 将返回 EOF 即这个函数的返回值为函数接收到的有效参数的个数结合有疑问的语句movl $0x804a23e,0x4(%esp)0x08048eb5 :%eax,(%esp)查看该处将地址 0x804a23e 传给了 0x4(%esp) , 0x8(%edp) 传给了 (%esp)经过分析,是让我们输入两个十进制整数加上对 sscanf 函数的理解并结合上面两句,将函数 _isoc99_sscanfplt 的返回值与1 比较,即输入的数据数目应该大于一个,那就应该是两个数据了,并且输入的第一个数还 要比 7 小。当看到汇编代码后半部分时,发现当输入的第一个数大于 5 时,炸弹依旧会爆炸
9、,因 此判断第一个数的取值范围为 0-5.接下来看汇编代码:此句话有着至关重要的位置,因为它是典型的 switch 语句,调试 *0x804a1a0 处,我 们看见了其调用的初步步骤,接下来开始实验检查。设置断点,追踪验证断点 1: 0x08048ed2 : 断点 2: 0x08048f53 : 第三关的初始输入值我们先输入cmpl $0x7,-0xc(%ebp) cmp -0x10(%ebp),%eax0 9999 进行下一步操作可以看到,输入第一个之后,系统会生成一个数与输入的第二个数作比较,即和 eax 作比 较,不相同时炸弹就会 bomb !由此可知, 0 147 是本关卡的一个正确答
10、案,剩下的结果均可以照此方法得出本周收获:一些指令的使用更加轻松一些,结合老师讲的栈的内容做了一些深入复习, 同时在计算机系统课上又得到了巩固,效果很好。四、phase_4 :8. 利用 gdb 调试, gdb bomb9. disassemble phaes_4经过分析,是让我们输入两个十进制整数,和第三关一样,查看 0x804a23e 处的值,结合 语句 cmp $0x2,%eax , jne0x8048e66 ,加上对 sscanf 函数的理解,将函数 _isoc99_sscanfplt 的返回值与 2 比较可知,输入的参数个数必须为两个, 不然就会引发爆炸 .这里将第一个参数传给 ea
11、x ,然后执行 js 指令则当 eax 为负数时会引爆炸弹,然后将 eax与 14 作比较当它大于 14 时会引爆炸弹,压栈,并调用 func4 函数。func4 函数内部:经过检验得到函数 func4 的 C 语言代码:int func4( int b,int a,int a1) int x,y;y = b;y = y -a;x = y;x = ( unsigned )x31;y = x + y;y = y/2;y+=a;if(y-a1)0)y = y-1;func4(y,a,a1);return 2*a;elsea = 0;if(y-a1)0)y = y+1;func4(b,y,a1);r
12、eturn 2*a+1;return 0;phase_4 最后将 14 .0 ,和第一个我们输入的参数传进 func4 函数,比较 func4 的返回值, 其要求返回值只能为 1 ,否则就会爆炸。并且第二个参数也只能为 1. 经过编译运行,第一个参数值为8、 9、11.即其答案为:8 1;9 1;11 1 。五、phase_51. 利用 gdb 调试, gdb bomb2.disassemble phaes_4可以看到, 栈进行初始化时,使用了被调用者保存寄存器,并且如前两关一样,查了寄存器 的使用如下: 程序寄存器是唯一一个被所有过程共享的资源。虽然在给定时刻只能有一个过程是活动的, 我们必
13、须保证当一个过程(调用者)调用另一个(被调用者)时,被调用者不会覆盖某个调 用者稍后会使用的寄存器的值。为此, IA32 采用了一组统一的寄存器使用惯例,所有的过 程都必须遵守,包括程序库中的过程。根据惯例,寄存器 eax ,edx , ecx 被划分为调用者保存( caller save )寄存器。当过程 P 调用 Q 时,Q 可以覆盖这些寄存器,而不会破坏 P所需要的数据。另外,寄存器 ebx ,esi 和 edi 被划分为被调用者保存( callee save )寄存器。这意味着 Q 必须在覆盖它们之前, 将这些寄存器的值保存到栈中,并在返回前恢复它们,因为P(或某个更高层次的过程)可能
14、会在今后的计算中需要这些值。 此外,根据这里描述的惯例, 必须保存寄存器 ebp ,esp 。过程 P在调用 Q 之前计算 y,但是它必须保证 y的值在 Q 返回后是可用的。有两种方式可 以做到这一点:1:它可以在调用 Q 之前,将 y 的值存放在自己的栈帧中;当 Q 返回时,它可以从栈中取 出 y 的值。2:它可以将 y 的值保存在被调用者保存寄存器中。如果 Q ,或任何其他 Q 调用的程序, 想使用这个寄存器,它必须将这个寄存器的值保存在栈帧中,并在返回前恢复该值。因此, 当 Q 返回到 P时,y 的值会在被调用者保存寄存器中,或者是因为寄存器根本就没有改变, 或者是因为它被保存并恢复了。
15、这里还是要输入两个数, eax 要大于 1 ,不然炸弹就爆炸,那么返回值肯定是 2 。如果 eax 此时等于 1111 ,炸弹爆炸,即原输入参数 1 与 0xf 作位与不能为 1111 。所以参数 1 的低 4 位不能都为 1. 经过分析,参数 1 的范围为 0-14 。可以看到这个地址里存放着一串数字。接着看,把 ebx (也就是 0x804a1c0 )加 4 倍 eax 的地址处的值,传给 eax ,如果这次的 eax 低 4 位不是 1111 ,就回到 继续循环。这里当 eax 不等 15 时就会一直 循环并且每次循环 edx 会加 1, ecx 会不断加上 eax 的值。而上面那一串数
16、字中也有 15 这个数字。2 的值需要通过循环将完成循环的 ecx 和参数 2 进行比较,相等就顺利结束,可知,参数来计算。故得到:15-6 6-14 14-2 2-1 1-1010-0 0-8 8-44-9 9-1313-11 11-77-3 3-1212-5 ,即有 5 12 3 71113 9 4 8 0 10 12 14 6 1510214781215110411339650123456789101112131415第二个输入的参数与 ecx 的值进行了比较, 我们知道 ecx 是每次 eax 的值累加得到所以可 以计算得出第二个参数是 115得到一组密码为 5 115 ,其他解类推。
17、六、phase_61. 利用 gdb 调试, gdb bomb2.disassemble phaes_4接下来把 eax-1 与 5 比,如果小于等于就继续,大于就爆炸,所以 eax 的值小于等于 6, 又因为 jbe 是无符号操作,所以 eax 的值的范围确定为 1、2、3、4、 5、6这段表示,将输入的第二个数的地址给 ebx ,将地址 ebx 中的内容与第一个输入作比较, 相等时就会爆炸。将 ebp-76 的值加 1,即 ebp-76 为 2;如果 ebp-76 的值小于等于 5 ,跳到 65 行,大于 5 跳到 35 行ebp-48 及其之前的 5 个数即为要输入的数, 之前就是对这
18、6 个数做操作, 我们现在对 ebp-48 定义为参数 1, ebp-44 是参数 2, ebp-40 是参数 3,ebp-36 是参数 4, ebp-32 是参数 5, ebp-28 是参数 6。并且它们的取值范围为 1-6 ,相邻两个数不能相等, 差值不能是 4 的倍数。检查地址 0x804c0c4 中的内容。可以看到,这里存放的是一个链表。有关链表操作时,有一个跳转条件是 0x08048d15 :cmp $0x1,%ecx ,而 ecx 就是某一个参数,这些参数的值是 1 6 中的。在做这一步的分析时,就需要我们假设输入的 这个数列是某个顺序才能继续计算下去了,假设原数列为2,3,5,
19、6,1,4,则有参数 1为节点 2 的值,参数 2 是节点 3 的值,循环的任务是把原来的数列中值为 i 的数,换成链表 中对应节点 i 的值。对于我假定的这个数列,完成这个循环之后的结果就是:( Node2.data , Node3.dataNode5.data , Node6.data , Node1.data , Node4.data )判断上一步生成的六个结点的值的大小应该是由大到小排列的, 不然就爆炸。 链表中的六个 值分别是: 1a7 6c 155 187 3bd 255 要按照从大到小排序,为:3bd 255 1a7 187 155 6c 故输入的数字应该是 5 6 1 4 3
20、2 。感想: 第六关感觉比较难, 用了很长时间, 向班级同学问, 他们给我做了解答, 目前只是做了大概, 在他们的讲解下理解了,自己还要多练习,深刻理解汇编代码。实验材料只有一个可执行文件,先把他用 objdump -d 反汇编得到汇编文件。打开文件发 现对应 6 个 phase ,对应的汇编文件十分长,因此我们直接步入phase 部分。前六关已经解决完成,还有最后一个秘密关卡,接下来解决秘密关卡。七、phase_defusedphase_defused 的前半部分很简单,我们可以得知,必须要先解开前六关之后才能进入秘 密关卡。前:0x0804901d : mov%gs:0x14,%eax0x
21、08049023 : mov%eax,-0xc(%ebp)后:0x080490bb : mov-0xc(%ebp),%eax0x080490be : xor%gs:0x14,%eax这段汇编代码前后分别出现了如上代码, 第一次见到他们, 因此我在网上找到了它们的作用:其 为 Linux 栈 溢 出 漏 洞 的 利 用 , 考 查 Linux Canary 绕 过 技 术 及 ROP(Return-Oriented-Programming) 攻击负载的构造。0x01 Linux Canary 介绍首先了解一下 Linux 的 Canary 保护机制。 Canary 是 Linux 众多安全保护机
22、制中的一种, 主要用于防护栈溢出攻击。我们知道,在 32 位系统上,对于栈溢出漏洞,攻击者通常是通 过溢出栈缓冲区,覆盖栈上保存的函数返回地址来达到劫持程序执行流的目的:针对此种攻击情况,如果在函数返回之前,我们能够判断 ret 地址是否被改写,若被改写则 终止程序的执行, 便可以有效地应对攻击。 如何做到呢?一个很自然的想法是在刚进入函数 时,在栈上放置一个标志,在函数结束时,判断该标志是否被改变,如果被改变,则表示有 攻击行为发生。 Linux Canary 保护机制便是如此,如下:攻击者如果要通过栈溢出覆盖 ret ,则必先覆盖 Canary 。如果我们能判断 Canary 前后是 否一
23、致,便能够判断是否有攻击行为发生。说明:上述图例仅用于说明,实际上 canary 并不一定是与栈上保存的 BP 地址相邻的。 0x02 Linux Canary 实现Linux 程序的 Canary 保护是通过 gcc 编译选项来控制的, gcc 与 canary 相关的参数及 其意义分别为:-fstack-protector :启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护 代码-fstack-protector-all-fno-stack-protector在函数开始时,会取:启用堆栈保护,为所有函数插入保护代码。:禁用堆栈保护,为默认选项。gs:0x14 处的值,并放
24、在 %ebp-0xc 的地方 (mov %gs:0x14,%eax, mov %eax,-0xc(%ebp) ,在程序结束时, 会将该值取出, 并与 gs:0x14 的值进行抑或 (mov -0xc(%ebp),%eax ,xor %gs:0x14,%eax) ,如果抑或的结果为 0 ,说明 canary 未被修改, 程序会正常结束, 反之如果抑或结果不为 0 ,说明 canary 已经被非法修改, 存在攻击行为, 此时程序流程会走到 _stack_chk_fail ,从而终止程序。movl $0x804a200,0x4(%esp) 这里读取 为%D %D %S 中输入的 %s为 DrEvil
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 邢台市中医院甲状腺肿瘤切除术主刀资质评审
- 2025人民医院无菌物品召回考核
- 2025年武汉轻工大学专项招聘54人模拟试卷附答案详解(完整版)
- 天津市人民医院胎盘早剥诊断处理应急考核
- 上海市人民医院护理质量持续改进考核
- 大学维生素C课件
- 天津市人民医院肿瘤影像诊断考核
- 2025河北唐山市市直事业单位招聘工作人员277人模拟试卷及答案详解(网校专用)
- 2025北京协和医院妇产科学系中心实验室科研人员招聘模拟试卷及一套完整答案详解
- 2025广东广州市荔湾区沙面街道环卫站招聘管理人员1人模拟试卷及答案详解(易错题)
- 少数民族维吾尔族民俗文化科普介绍图文课件
- 游戏:看表情符号猜成语PPT
- 影视鉴赏-第一章-影视鉴赏的基本概念
- 电厂安全生产运行管理培训课件
- 医院院前急救病历 广州市急救中心
- 输液室运用PDCA降低静脉输液患者外渗的发生率品管圈(QCC)活动成果
- 集约化猪场的规划设计
- 数星星的孩子习题精选及答案
- 摩登情书原著全文下载(通用3篇)
- 材料科学基础复习题及答案
- 抗栓治疗消化道损伤防治策略
评论
0/150
提交评论