- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
LABboom实验报告
实验题目:bomblab 实验目的:
熟悉汇编程序及其调试方法,熟悉BGD工具 实验环境:
个人电脑,Linux系统(虚拟机) 实验内容及操作步骤
实验内容:
程序运行在linux环境中,程序运行中有6个关卡,每个phase需要用户在终端上输入特定的字符或者数字才能通关,否则会引爆炸弹。需要使用gdb工具反汇编出汇编代码,结合c语言文件找到每个关卡的入口函数。然后分析汇编代码,找到在每个phase程序段中,引导程序跳转到“explode_bomb”程序段的地方,并分析其成功跳转的条件,以此为突破口寻找应该在命令行输入何种字符通关。
实验需要用到gdb工具,可到网上查找gdb使用方法和参数。
操作步骤:
1、打开终端进入bomb文件夹开始进行实验,反汇编出代码,这里有两种方式可以反汇编,第一种用命令行objdump -d bomb 1.txt ,如下图:
第二种反汇编方式就是用gdb工具,首先gdb bomb进入gdb工具的调试状态然后输入命令“disas 所要返回的函数名”即可得到函数的汇编代码。
2、拆除炸弹
Phase1:
汇编代码
当判断%eax的结果如果不为0的话就会调用 call 0x80490d1 explode_bomb也就是说会爆炸,所以函数strings_not_equal的返回值为0由这个函数名可联想到函数的功能是比较字符串,“字符串不相同”返回值为0证明字符串相同,再往上movl $0x804a15c,0x4(%esp)这里有立即数,按照刚才的分析这应该是一个字符串所以我们在gdb状态下用x/s 0x804a15c查看出现字符串We have to stand with our North Korean allies.这就应该是我们所要输入的字符串了。我们可以先调试一下,在explode_bomb入口 0x80490d1设断点,再进行run操作。
Phase2:
汇编代码
首先看到了call 0x804910b read_six_numbers所以可以猜测这道关可能是要输入6个数字,所以先把汇编代码弄出来。
事实上经过过程的分析我们确实需要输入6个数字并且存储在-0x20(%ebp)到-0xc(%ebp)的位置上,由上述的代码所给出的注释可以得到第一个数为0第二个为1,然后代码进入一个循环,这个循环所表达的意思就是第3个数字等于前两个数字的和也就是1,第四个数字等于第2个和第3个数字的和,以此类推,我们得到这6个数字分别为0 1 1 2 3 5.验证结果如下:
Phase3:
汇编代码
看到0x08048eb5 +20: movl $0x804a23e,0x4(%esp)这行代码,又是一个立即数。同样我们查看地址中的值再结合后面语句中有调用__isoc99_sscanf@plt函数,说明这是要我们输入两个整型值。
注:sscanf的功能是sscanf(),从一个字符串中读进与指定格式相符的数据。它的返回值为被成功赋值的指针变量的个数,如果该函数发生错误,则返回EOF(-1)
根据sscanf的返回值判断可知所输入的值得个数大于1,也就验证上面所说的输入两个整型数值,后面的语句有判断了输入的第一个数值小于7。接下来的语句 0x08048edb +58: jmp *0x804a1a0(,%eax,4) 典型的switch跳转语句,跳转到以0x804a1a0为基址的跳转表中输入p/x *0x804a1a0得到地址0x8048f12,也就是输入0的时候程序会跳转到0x8048f12+113的地方执行。在代码中找到这个地址,从这个地址继续执行将0x314赋给%eax然后跳转到0x08048f1e +125
以下的操作就是0x314-0x35a+0x2ef-0x216+0x216-0x216+0x216-0x216结果为147
cmp -0x10(%ebp),%eax这个语句说明147就是我们所要输入的第二个参数。
验证结果如下:
Phase4:
汇编代码
根据 0x08048e42 +20: movl $0x804a23e,0x4(%esp),我们查看0x804a23e的值结果为:
再根据语句 0x08048e50 +34: call 0x8048840 __isoc99_sscanf@plt
0x08048e55 +39: cmp $0x2,%eax
说明我们要输入两个整型数,下面的工作就是判断这两个整型数分别是什么。由代码
0x08048e6b +61: movl
文档评论(0)