ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:1.03MB ,
资源ID:4069147      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4069147.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(LAB boom实验报告.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

LAB boom实验报告.docx

1、LAB boom实验报告实验题目:bomblab实验目的:熟悉汇编程序及其调试方法,熟悉BGD工具实验环境:个人电脑,Linux系统(虚拟机)实验内容及操作步骤:实验内容: 程序运行在linux环境中,程序运行中有6个关卡,每个phase需要用户在终端上输入特定的字符或者数字才能通关,否则会引爆炸弹。需要使用gdb工具反汇编出汇编代码,结合c语言文件找到每个关卡的入口函数。然后分析汇编代码,找到在每个phase程序段中,引导程序跳转到“explode_bomb”程序段的地方,并分析其成功跳转的条件,以此为突破口寻找应该在命令行输入何种字符通关。 实验需要用到gdb工具,可到网上查找gdb使用方

2、法和参数。操作步骤:1、打开终端进入bomb文件夹开始进行实验,反汇编出代码,这里有两种方式可以反汇编,第一种用命令行objdump -d bomb 1.txt ,如下图: 第二种反汇编方式就是用gdb工具,首先gdb bomb进入gdb工具的调试状态然后输入命令“disas 所要返回的函数名”即可得到函数的汇编代码。2、拆除炸弹Phase1:汇编代码 当判断%eax的结果如果不为0的话就会调用 call 0x80490d1 也就是说会爆炸,所以函数strings_not_equal的返回值为0由这个函数名可联想到函数的功能是比较字符串,“字符串不相同”返回值为0证明字符串相同,再往上movl

3、 $0x804a15c,0x4(%esp)这里有立即数,按照刚才的分析这应该是一个字符串所以我们在gdb状态下用x/s 0x804a15c查看出现字符串We have to stand with our North Korean allies.这就应该是我们所要输入的字符串了。我们可以先调试一下,在explode_bomb入口 0x80490d1设断点,再进行run操作。Phase2:汇编代码 首先看到了call 0x804910b 所以可以猜测这道关可能是要输入6个数字,所以先把汇编代码弄出来。事实上经过过程的分析我们确实需要输入6个数字并且存储在-0x20(%ebp)到-0xc(%ebp)

4、的位置上,由上述的代码所给出的注释可以得到第一个数为0第二个为1,然后代码进入一个循环,这个循环所表达的意思就是第3个数字等于前两个数字的和也就是1,第四个数字等于第2个和第3个数字的和,以此类推,我们得到这6个数字分别为0 1 1 2 3 5.验证结果如下:Phase3:汇编代码调用sscanf函数 看到0x08048eb5 : movl $0x804a23e,0x4(%esp)这行代码,又是一个立即数。同样我们查看地址中的值再结合后面语句中有调用_isoc99_sscanfplt函数,说明这是要我们输入两个整型值。 注:sscanf的功能是sscanf(),从一个字符串中读进与指定格式相符

5、的数据。它的返回值为被成功赋值的指针变量的个数,如果该函数发生错误,则返回EOF(-1)根据sscanf的返回值判断可知所输入的值得个数大于1,也就验证上面所说的输入两个整型数值,后面的语句有判断了输入的第一个数值小于7。接下来的语句 0x08048edb : jmp *0x804a1a0(,%eax,4) 典型的switch跳转语句,跳转到以0x804a1a0为基址的跳转表中输入p/x *0x804a1a0得到地址0x8048f12,也就是输入0的时候程序会跳转到0x8048f12的地方执行。在代码中找到这个地址,从这个地址继续执行将0x314赋给%eax然后跳转到0x08048f1e 以下

6、的操作就是0x314-0x35a+0x2ef-0x216+0x216-0x216+0x216-0x216结果为147cmp -0x10(%ebp),%eax这个语句说明147就是我们所要输入的第二个参数。验证结果如下: Phase4:汇编代码 根据 0x08048e42 : movl $0x804a23e,0x4(%esp),我们查看0x804a23e的值结果为: 再根据语句 0x08048e50 : call 0x8048840 0x08048e55 : cmp $0x2,%eax 说明我们要输入两个整型数,下面的工作就是判断这两个整型数分别是什么。由代码 0x08048e6b : movl

7、 $0xe,0x8(%esp) 0x08048e73 : movl $0x0,0x4(%esp) 0x08048e7b : mov -0xc(%ebp),%eax 0x08048e7e : mov %eax,(%esp)可以看出我们以第一个参数,0 ,14为参数传入递归函数中而且返回值为1,所以我们这时做的事情就是分析func4函数,看第一个参数为多少时返回值能为1,而第二个参数有代码 0x08048e8b : cmpl $0x1,-0x10(%ebp) 0x08048e8f : je 0x8048e9d 可知第二个参数就为1。 下面分析func4根据判断条件jle 0x8048ba0 和jg

8、e 0x8048bc0 可知这个函数就是参数2和参数3经过一系列的操作最终等于参数1。参数1在这个过程中是不变的。我们第一次传入func4的参数为参数1,0,14,结果返回值要求为1,也就是%eax的值为1,我用的是反向推理的方法。首先如果使返回值为1,根据0x08048bbc : lea 0x1(%eax,%eax,1),%eax这条语句我们可以使这条语句为最后返回的值也就是说我们第一次调用func4是在 0x08048bb7 : call 0x8048b60 那么就是说参数1大于7,在此条件下我们将(9,8,14)传入再次调用func4,调用func4后我们希望它的返回值为0这样根据0x1

9、(%eax,%eax,1),%eax返回值就是1了,最简单的一种情况就是14 和8经过运算后结果为11而参数1恰好等于11的情况,更复杂一些的情况就是它又调用了0x08048b97 : call 0x8048b60 ,再由它的返回值再继续推理,所以此题有多种答案,最简单的就是11,1。 Phase5:汇编代码Dump of assembler code for function phase_5: 0x08048db8 : push %ebp 0x08048db9 : mov %esp,%ebp 0x08048dbb : push %esi 0x08048dbc : push %ebx 0x08

10、048dbd : sub $0x20,%esp 0x08048dc0 : lea -0x10(%ebp),%eax 0x08048dc3 : mov %eax,0xc(%esp) 0x08048dc7 : lea -0xc(%ebp),%eax 0x08048dca : mov %eax,0x8(%esp) 0x08048dce : movl $0x804a23e,0x4(%esp) 0x08048dd6 : mov 0x8(%ebp),%eax 0x08048dd9 : mov %eax,(%esp) 0x08048ddc : call 0x8048840 0x08048de1 : cmp

11、$0x1,%eax /所输入的值的个数应该大于1 0x08048de4 : jg 0x8048deb 0x08048de6 : call 0x80490d1 0x08048deb : mov -0xc(%ebp),%eax 0x08048dee : and $0xf,%eax /将%eax中的值与0xf做逻辑与运算 0x08048df1 : mov %eax,-0xc(%ebp) /将相与后的结果传入地址-0xc(%ebp) 0x08048df4 : cmp $0xf,%eax /比较%eax中的值,结果不能等于15 0x08048df7 : je 0x8048e22 0x08048df9 :

12、 mov $0x0,%ecx 0x08048dfe : mov $0x0,%edx 0x08048e03 : mov $0x804a1c0,%ebx /将数组的首地址中的值传入%edx 0x08048e08 : add $0x1,%edx /进入循环 0x08048e0b : mov (%ebx,%eax,4),%eax /将数组中第%eax位置的值传 给%eax 0x08048e0e : add %eax,%ecx /将每次%eax的值累加起来 0x08048e10 : cmp $0xf,%eax /比较%eax和15若等于则跳出循环 0x08048e13 : jne 0x8048e08 0

13、x08048e15 : mov %eax,-0xc(%ebp) /将得到的%eax的值传入-0xc(%ebp) 0x08048e18 : cmp $0xf,%edx /比较%edx和15,如不等于会bomb!所以 循环以后%edx必定等于15 0x08048e1b : jne 0x8048e22 0x08048e1d : cmp %ecx,-0x10(%ebp) / 我们所输入的第二个参数的值 等于循环之后%ecx的结果,也就是数组中15个值累加的结果 0x08048e20 : je 0x8048e27 0x08048e22 : call 0x80490d1 0x08048e27 : add

14、$0x20,%esp 0x08048e2a : pop %ebx 0x08048e2b : pop %esi 0x08048e2c : pop %ebp 0x08048e2d : ret 与phase3相同0x08048dce : movl $0x804a23e,0x4(%esp)我们查看这个语句中地址的值得到“%d,%d”结合语句0x08048ddc : call 0x8048840 0x08048de1 : cmp $0x1,%eax说明和phase3一样我们需要输入两个整型数,下面的工作就是确定整型数的值,首先取我们所要输入的第一个参数的后四位,如果它的后四位全为1那么就会爆炸,所以后四

15、位不可能全为1.接着就是一个循环的过程了,这个循环我们可以尝试写成c代码来解决c代码如下:int c=0;int d=0;int b=a0;While(an!=15) d+; n=an; c=c+n;根据0x08048e18 : cmp $0xf,%edx 我们知道c代码中的d在最后循环结束时的值为15,也就是循环要进行15次,根据 0x08048e1d : cmp %ecx,-0x10(%ebp)最后c的值就是第二个参数。而第一个参数在取后四位之后循环之后的结果是15。看到循环中的 0x08048dce : movl $0x804a23e,0x4(%esp)语句我最开始想到的是又是一个立即数

16、所以我查看了它的值发现如下图所示,加上0x08048e0b : mov (%ebx,%eax,4),%eax我联想到这是一个数组,0x804a1c0是数组的首地址,我们用p/x *(0x804a1c0)16来查看这个数组。如下图所示:根据最后的%eax的值15来推出最开始的值,我们可以根据n=an来:n=an=15 n=an=6 n=an=14 n=an=2 n=an=1 n=an=10 n=an=0 n=an=8 n=an=4 n=an=9 n=an=13 n=an=11 n=an=7 n=an=3 n=an=12 * n=an=5 实际上循环执行了15次也就是第一次迭代n所得到的值是12,

17、那么此时传进的n是5也就是第一个参数的后4位就是0101也就是5,而第二个参数等于这15个过程的累加也就是115,。第一个参数后四位为5的之都可以,最后我选择的参数是5,115,验证过程如图所示:再试一个53 115 Phase6:汇编代码%eax值小于6两参数值不同到判断6个参数每个都小于等于6并且互不相同。%edx的值必须大于%eax中的值到将-0x48(%ebp)到 -0x34(%ebp)的值按照距离为0x8的地址排列起来。到排列的六个值是递减的也就是说 -0x48(%ebp),中的值大于-0x44(%ebp)的值大于-0x40(%ebp)以此类推。实验结果: 收获与体会:我觉得此次试验

18、主要考察的是对汇编代码的理解以及gdb工具的使用。开始的时候面对汇编代码很惧怕特别是像3和6这长代码,对一些语句也不是很理解,绕来绕去的循环递归也很让人头疼,不过参考了老师给的资料以及网上一些大神的报告,对照着看过几个函数后就上手一些了,也不至于无从下手了。我觉得这是一个很有意思的实验,拆炸弹的过程中虽然有些代码很长很无聊,但是拆好了后感觉很棒,也能从中找出规律来,比如说看到这一个函数该从哪里入手,像是还有立即数的传入都可能是我们入手的切点还有对于有些代码从后向前推更容易解出,还有很多时候你不知道这一条语句是什么意思,这时候不必纠结于这一条,也许结合后面就能明白它的意思。经过此次试验感觉自己对汇编代码更为熟悉了也了解和使用了gdb工具。当然,少不了同学的帮助。实验成绩

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1