Transcript 二进制炸弹实验讲解
炸弹拆除实验讲解 TA:Gu Rong [email protected] 2014/05/27 内容 实验任务回顾 实验准备与规则说明 阶段1拆弹攻略 阶段2拆弹攻略 进一步研究参考 实验任务回顾 本实验的主要通过拆除“binary bombs”增强同学对 汇编语言,general debugger 和逆向工程等技能。 给定的实验材料只是告诉你们它对六次输入做了不 同的处理,但是并没有告知这六次处理的是如何做 的,即phase_1(input); phase_2(input);phase_3(input); phase_4(input); phase_5(input); phase_6(input); 等六个函数的内容 你们并不知道。 本实验只要完成前2个阶段的拆弹任务 实验任务描述 Phase_1()等的具 体实现源码是不给 你们的,需要你们 通过反汇编或逆向 工程得出各个阶段 的input! 实验工具 本实验需要使用objdump(反汇编工具)和gdb(调试工 具),此外需要对理解汇编语言。 1) objdump –t 这个命令可以打印出bomb 的符号表。符号表包含了bomb 中所有函数的名称和存储地址以及全局变量的名称。你可 以通过查看函数名得到一些信息。 2) objdump –d 运用这个命令我们可以对bomb 中的代码进行反汇编。通 过阅读汇编代码可以告诉你bomb 是如何运行的。虽然 objdump –d 给了你很多的信息,但是它并不能告诉你所 有的信息。例如:一个调用sscanf 函数的语句可能显示 为:8048c36: e8 99 fc ff ff call 80488d4 <_init+0x1a0> 你还需要gdb 来帮助你确定这个语句的具体功能。 实验工具 1) Gdb 为了避免你的“bomb”在每次输入错误的字符串后 自动爆炸,要利用gdb 来帮助你对程序进行分析。 GDB 是GNU 开源组织发布的一个强大的UNIX 下 的程序调试工具。 一般来说,GDB 主要帮忙你完成下面几方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心 所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停 住。(断点可以是条件表达式) 3、当程序被停住时,可以检查此时你的程序中所发 生的事。 实验工具 4) strings 这个语句可以显示所有可打印的字符串。 一些主要的命令 实验准备与规则说明 我们有一个弹药库 每个同学都有一个“私人定制”的唯一的binary boom bomb: bomb 的可执行程序(64位)。 bomb.c:bomb 程序的main 函数。 README 文件:包含学号和姓名,请核对。 Index表记录了每位同学拿了哪个炸弹~~ 阶段1炸弹拆除 1.执行objdump -d bomb,可以看到bomb的汇编代 码,其中一段如下所示,不难看出这就是函数 phase_1()的汇编代码。 阶段1炸弹拆除 前几行是压栈以及对寄存器ebp、esp的操作,这是 函数调用时的必要流程。总体来看,phase_1先调用 了一个名为<strings_not_equal>的函数,如果相等 则则正常退出,进入下一关;如果不相等则调用函 数<explode_bomb>,炸弹炸了,这关就失败了。 重点关注这一行: 这是调用函数<strings_not_equal>前的压栈操作, $0x8049360看上去像是一个静态变量的地址,我们 来通过GDB定位到该地址并打印一下。0x80****** 通常是内存地址,其他的内容则很可能是字符串, 当然这要结合上下文来看。 阶段1炸弹拆除 1.首先将二进制的文件进行反汇编: 2.用gdb 打开该二进制文件: 阶段1炸弹拆除 1.首先将二进制的文件进行反汇编: 2.用gdb 打开该二进制文件: 阶段1炸弹拆除 1.在phase_1 处设置断点,然后先用run 命令执行到断点处,之后一步一步执 行; 2.打印$0x8049360,猜想这应该是一个字符串 所以第一个阶段的值应该是: And God saw everything which he had made and it was very good. 阶段2炸弹拆除 进入阶段2: 阶段2炸弹拆除 函数 phase_2 () 中调用 函数 read_six_numbers () 来 循环读取 6 个数并进行一系列操作,我们的目标就是找到这 6个数。程序一 开始创建了个数组来存储这 6个数。 进入read_six_numbers () 函数后首先比较组第一个元素与 0xa的 大小,若不相等则爆炸,说明数组 的第一个元素肯定是 0xa,即10. 若相等,则比较数组第二个元素与 0x12 的大小,若不相等 则爆 炸,说明数 组第二个元素肯定是 0x12,即18. 阶段2炸弹拆除 继续看下面部分: 循环结构,累加为0x8 for(i=2;i<=5;i++) a[i+1]=a[i]+8; 阶段2炸弹拆除 因此,分析可知需要输入的是一个等差数列,10 18 26 34 42 50 进一步拆弹的研究参考 来自计算机经典教材《深入理解计算机系统》 对于后面几个阶段炸弹的拆除攻略请猛戳下面的链接: http://speakingbaicai.blog.51cto.com/5667326/1250688 http://my.oschina.net/gallant/blog/94601 Good Luck! End