拆炸弹试验报告_第1页
拆炸弹试验报告_第2页
拆炸弹试验报告_第3页
拆炸弹试验报告_第4页
拆炸弹试验报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、HUNAN UNIVERSITY课程实验报告课程名称:计算机组成与结构实验名称:拆炸弹专业班级:姓名:学号:完成时间:(一)实验目的:程序运行中有6个关卡(6个phase),每个phase需要用户在终端上输入特龙的字 符或者数字才能通关,否则会引爆炸弹!那么如何才能知道输入什么容呢?这需要你使 用gdb工具反汇编出汇编代码,结合c语言文件找到每个关卡的入口函数。然后分析汇 编代码,找到在每个phase程序段中,引导程序跳转到“explode_bomb”程序段的地方, 并分析其成功跳转的条件,以此为突破口寻找应该在命令行输入何种字符通关。(二)实验环境:虚拟机ubuntu系统下32位操作系统,终

2、端,gdb工具。页脚(三)实验目的和操作: 拆炸弹准备操作:查看给出的bomb.c中的代码.得知控制检测密码正误的6个函数分别为:phase_l phase_2t phase_3, phase_4, phase_5 phase_6v使用gbd工具对可执行文件bomb进行反汇编:打开bomb可执行文件所在的文件夹输入反汇编命令objdump-d bomb后,出现了大量 汇编代码,在终端窗口可以看到很多行的汇编代码。也可以使用汇编指令objdump-d bomb l.txt将汇编代码输出到服务器上一个自动生成的叫l.txt的文件中。188049fb4:8049fb7:8049fb8:8049fb9

3、:8049fba:8049fbb:cmp$Oxffffffff#%eaxine8049fa8 do_global_ctors aux+Ox8049faf:83 f8 ff8049fb2:75 f4szm)ubuntu: -/LAB3O8049fbc : l.txtszngubuntu:/LAB3$ szngubuntu:-/LAB3$Disassemblysection ftnt:3 b d 3 0 O8 5 5 c 9 94 X p X b b o c e $ % %d p p t p p d o o e o a p p r n n8049fbC:S3push%ebx8049fbd:83 e

4、c 08sub$0x8,%esp8O49fc0:e8 00 00 00 00call8049fc5 8049fC5:5bPOP%ebx8049fc6:81 C3 2f 20 00 00add$0x2O2f,%ebx8049fcc:e8 5f e9 ff ffcall8048930 8049fdl:83 C4 08add$0x8,%esp8049fd4:5bpop%ebx8049fd5:c3retobjdump -d bonb开始拆炸弹:phase:的反汇编代码如下:0x08048f61 : push0x08048f62 : mov0x08048f64 : sub0x08048f67 : mov

5、l%ebp%esp,%ebp$0xl8,%esp0x804al5c,0x4(%esp) /sp 寄存器地址指向$0x804al5c0x08048f6f : mov0x08048f72 : mov%eaxz(%esp)函数条用的准备过程0x&%ebp),%eax将$0x804al5c的数据移给eax寄存器0x08048f75 : call0x08048f7a : test0x08048f7c : je0x08048f7e : callx8048fab %eax,%eax与这一行比较用户输入和$0x804al5c中的值0x8048f83 x80490dl 0x08048f83 : leave0x0

6、8048f84 : ret通过分析代码可知:phase 1的密码是固怎储存在$0x804al5c中的。令$0x804al5c中的数据与用户输入的数据比页脚较,若相同则跳过explode_bomb,避开炸弹。 用命令x/s 0x804al5c查看其中的数拯如下:(gdb) x/s 0x804al5cOx804al5c:,FWe have to stand with our North Korean allies/1(gdb)输入 We have to stand with our North Korean allies. 结果为:(gdb) rStarting program: yhome/sz

7、m/LAB3/boF)bWelcome to ny fiendlsh little bomb* You have 6 phases with which to blow yourself up Have a nice day!We have to stand with our North Korean allies.Phase 1 defused How about the next onw?结果正确。反汇编代码如下:0x08048d6a : push 0x08048d6b : mov 0x08048d6d : push 0x08048d6e : push 0x08048d6f: sub 0x

8、08048d72 : lea 0x08048d75 :mov 0x08048d79 :mov 0x08048d7c :mov 0x08048d7f:call 0x08048d84 :cmpl 0x08048d88 :jne 0x08048d8a :cmpl 0x08048d8e :je 0x08048d90 :call 0x08048d95 :lea 0x08048d98 :lea 0x08048d9b :mov 0x08048d9e :add 0x08048dal :cmp 0x08048da3 :je 0x08048da5 :call 0x08048daa :add 0x08048dad

9、:cmp 0x08048daf: jne 0x08048dbl :add 0x08048db4 :pop%ebp%esp,%ebp%esi%ebx$0x30,%esp-0x20(%ebp)/%eax%eax,0x4(%esp)0x8(%ebp)z%eax%eax,(%esp)0x804910b 读取六个数字$0x0,-0x20(%ebp) 0和第一个数字比较,不相等则爆炸。0x8048d90 $Oxl,-Oxlc(%ebp) 1和第二个数字比较,相等则跳过爆炸。0x80490dl 0x8048d95 -0xl8(%ebp),%ebx ebx指向第三个数字。-0x8(%ebp)z%esi esi

10、指向第六个数字再向后移一位的地址。-0x4(%ebx),%eax-0x8(%ebx),%eax %eaxz(%ebx)ebx向前第一位的数字赋给eax eax再加上ebx向前第二位的数字。 比较ebx前两位的和与ebx指向的数字。0x8048daa vphase_2+64 相等则跳过爆炸(explode_bomb)0x80490dl $0x4,%ebxebx地址向后移动一位(四个字节)。%esi,%ebx如果还未超过第六位数字,则跳转0x8048d9行。0x8048d9b $0x30,%esp%ebx页脚0x08048db5 :pop%esi0x08048db6 :pop%ebp0x08048

11、db7 :ret从上而的代码分析可知:phase_2的密码需要输入六位数字,并且第一个是0,第二个是1,然后执行到0x8048d9b这 一行代码发现往下运行会出现一个循环,两条重要指令是imull-0x4(%esi,%edx,4),%eax和 cmp%eax,(%esi,%edx,4).其中%eax和。(在每次循环中加1直到寄存器中值超过6,程序 执行完毕。在循环中执行的是一个数等于前两个数之和,寄存器ebx每次循环将向前第一位 的数字赋给寄存器eax。从而实现了计算前6位的斐波那契数列的值为:011 23 5。执行结果如下:Phase 1 defused. How about the nex

12、t one? 0 112 3 5That* s nunber 2. Keep going!反汇编代码如下: 0x08048eal : 0x08048ea2 : 0x08048ea4 : 0x08048ea7 : 0x08048eaa :push mov sub leamov0x08048eae :lea 0x08048ebl :mov 0x08048eb5 :movl 0x08048ebd :mov 0x08048ec0 : mov 0x08048ec3 :call 0x08048ec8 :cmp 0x08048ecb :jg 0x08048ecd :call 0x08048ed2 :cmpl

13、 0x08048ed6 :ja 0x08048ed8 :mov 0x08048edb :jmp 0x08048ee2 :mov 0x08048ee7 :jmp 0x08048ee9 :mov 0x08048eee :xchg 0x08048ef0 : jmp 0x08048ef2 : mov 0x08048ef7 : jmp 0x08048ef9 : mov%ebp%esp,%ebp$0x28,%esp-OxlO(%ebp)/%eax%eax,0 xc(%esp)此处为第二个数字。-Oxc(%ebp),%eax%eax,0x8(%esp)此处为第一个数字。$0x804a23e/0x4(%esp

14、) 用 x/s 0x804a23e 命令查看$0x804a23e 为 0x8(%ebp),%eax %d%d,即要输入两个整数,上而已经指出。 %eax,(%esp)0x8048840 $0xl,%eax以上两行即要求输入至少两组数据,否则引爆。0x8048ed2 0x80490dl $0x7,-0xc(%ebp)第一个数大于7引爆,即第一个数小于等于7。0x8048f43 -Oxc(%ebp),%eax*0x804ala0(/%eax/4)跳转至 0x804ala0+eax*4(第一个数)数据所$0x0,%eax指的行数。0x8048f3c $0x0?%eax%axz%ax0x8048f37

15、 $0x0,%eax0x8048f32 $0x0,%eax页脚0x08048efe : xchg0x08048f00 : jmp0x08048f02 : mov0x08048f07 :jmp0x08048f09 :mov%axz%ax0x8048f2d $OxO,%eax0x8048f28 vphase_3+135$OxOz%eax0x08048f0e :xchg 0x08048fl0 :jmp 0x08048fl2 :mov 0x08048fl7 :jmp 0x08048fl9 :mov 0x08048fle :sub 0x08048f23 :add 0x08048f28 :sub 0x08

16、048f2d :add 0x08048f32 :sub 0x08048f37 :add 0x08048f3c :sub 0x08048f41 :jmp 0x08048f43 :call 0x08048f48 :mov 0x08048f4d:cmpl 0x08048f51 :jg 0x08048f53 :cmp 0x08048f56 :je 0x08048f58 :callx=x-858x=x+751x=x-534 x=x+534 x=x-534 x=x+534 x=x-534%ax,%ax0x8048f23 vphase_3+13O$0x314,%eax当第一个数为0时跳转到此处,第二个数x=

17、788.0x8048fle 跳转到 0x8048fleo$OxOz%eax$0x35a,%eax$0x2ef,%eax$0x216/%eax$0x216/%eax$0x216,%eax$0x216,%eax$0x216/%eax0x8048f4d vphase_3+172 跳转到 0x8048f4d 行。0x80490dl $OxO?%eax$0x5,-0xc(%ebp)第一个数大于5引爆,即第一个数小于等于5。0x8048f58 -OxlO(%ebp)z%eax第一个数是0时,算得x=147,即第二个数 0x8048f5d 为 147 o0x80490dl 0x08048f5d :leave

18、0x08048f5e :xchg %ax,%ax0x08048f60 :ret从以上分析可知:再往下然后看到jmp输入指令x/s0x8049abb,得到0x8049abb:H%d%du,显示出应该输入两个数字。如果输入不 满足两个数,则会引爆炸弹,并且第二个与第一个数的值相关。第一个值得围为05的整 数,当第一个数输入的不是0-5的整数,也会引爆炸弹。输入的第一个数存入在寄存器eax 中,并且根据跳转指令jmp *0x804ala0(,%eax,4)选择将要跳转的位置,执行相应的代码计 算出第二个需要输入的值。1) 当第一个数输入的是0, eax寄存器中对应的值为0,则跳转到指令*0x804a

19、la0用指令查看*0x804ala0的值为:|(gdb) p/x *Ox8O4ala0$1 = 0x8048fl2(qdb 发现*0x804ala0对应的值为0x8048fl2,找到0x08048fl2对应的代码执行发现第二个数计算得结果为:x = 0x(31435a - 2ef-216 +216-216+216-216 + ) = 1472) 当输入的第一个数是1时,同理用指令查看* (0x804ala0+4)的值为页脚(gdb) p/x *(0x804ala0+4)$2 二 0x8048fl9则代码从0x08048fl9对应的代码执行第二个数讣算得结果为:x = Ox(-35a 一 2ef

20、 一 216 +216-216+216-216 + ) = -6413) 同理输入2,3,4,5对应的第二个数字为:217,534,0,-534 结果打印为:反汇编代码如下:0x08048e2e : push 0x08048e2f : mov 0x08048e31 : sub 0x08048e34 : lea 0x08048e37 : mov 0x08048e3b :lea 0x08048e3e :mov 0x08048e42 :movl 0x08048e4a :mov 0x08048e4d :mov 0x08048e50 :call 0x08048e55 :cmp 0x08048e58 :j

21、ne 0x08048e5a :mov 0x08048e5d :test 0x08048e5f : js 0x08048e61 :cmp 0x08048e64 :jle 0x08048e66 :call 0x08048e6b :movl 0x08048e73 :movl 0x08048e7b :mov 0x08048e7e :mov 0x08048e81 :call 0x08048e86 :cmp 0x08048e89 :jne 0x08048e8b :cmpl 0x08048e8f: je 0x08048e91 :lea 0x08048e98 :call%ebp%esp,%ebp$0x28,%

22、esp-OxlO(%ebp)/%eax%eax,Oxc(%esp)此处第二段数字。-Oxc(%ebp),%eax%eax,0x8(%esp)此处第一段数字。$0x804a23e,0x4(%esp)$0x804a23e 为4 %d,即输入两个整数。0x8(%ebp)z%eax%eaxz(%esp)0x8048840 $0x2,%eax以上两行要求之前输入的为两个数据,否则引爆。0x8048e66 -Oxc(%ebp)z%eax%eax,%eax第一段数据大于等于0,否则引爆。0x8048e66 $Oxe,%eax第一段数据小于等于14时跳过引爆。0x8048e6b 0x80490dl $0xez

23、0x&%esp)$0x0,0x4(%esp)-Oxc(%ebp)z%eax%eax,(%esp)0x8048b60 这几行为运行一个递归函数func4来确泄第一$Oxl,%eax段数据的值。0x8048e91 $Oxl,-OxlO(%ebp)第二个数据等于1则跳过爆炸。0x8048e9d OxO(%esi/%eiz,l),%esi0x80490dl 0x08048e9d :leave0x08048e9e :xchg%ax,%ax0x08048ea0 :ret页脚以上对代码的分析可以看出,第二个数拯确左为1。第一个数拯围为大于等于0,小于14, 并且由一个递归函数func4又一次缩小了用。但因为

24、这个递归函数太过繁杂,而第一个数据 囤又不大,直接将第一个数据从0尝试到13,得到了三个数字8、9、11符合要求。因此密 码有三组:8 ! 9 1, 11 lc 反汇编代码如下:0x08048db8 : push 0x08048db9 : mov 0x08048dbb : push 0x08048dbc : push 0x08048dbd : sub 0x08048dc0 : lea 0x08048dc3 :mov 0x08048dc7 :lea 0x08048dca : mov 0x08048dce :movl0x08048dd6 :mov0x08048dd9 :mov0x08048ddc

25、:call0x08048del :cmp0x08048de4 :jg0x08048de6 :call 0x08048deb :mov 0x08048dee :and 0x08048dfl : mov 0x08048df4 : cmp 0x08048df7 :je 0x08048df9 : mov 0x08048dfe : mov 0x08048e03 :mov 0x08048e08 :add 0x08048e0b :mov 0x08048e0e :add 0x08048el0 :cmp 0x08048el3 :jne 0x08048el5 :mov 0x08048el8 :cmp 0x0804

26、8elb :jne 0x08048eld :cmp 0x08048e20 :je 0x08048e22 :call 0x08048e27 :add 0x08048e2a :pop%ebp%esp,%ebp%esi%ebx$0x20,%esp-OxlO(%ebp)/%eax%eax,Oxc(%esp)此处为第二个数。-Oxc(%ebp),%eax%eax,0x8(%esp)此处为第一个数。$0x804a23ez0x4(%esp)$0x804a23e %d %d,即输入两个整数。0x8(%ebp),%eax%eax,(%esp)0x8048840 $Oxl,%eax以上两行保证输入数据多于1组,否

27、则引爆。0x8048deb 0x80490dl Oxc(%ebp),%eax$Oxf,%eax按位与,即保留第一个数的后四位。%eax,-Oxc(%ebp)$Oxf,%eax第一个数二进制后四位不能为(1111)2,否则引爆。0x8048e22 $OxO,%ecx$OxOz%edx$0x804alc0,%ebx $0x804alc0指向的是一个数组,下而分析。$Oxlz%edx(%ebx/%eax/4),%eax%eax,%ecx$Oxf,%eax0x8048e08 以上五行为一个for循环语句,%eax,-Oxc(%ebp)$Oxf,%edx上述的for循环要循环15次。0x8048e22

28、%ecx,-OxlO(%ebp)确定第二个数的值,下面分析。0x8048e27 0x80490dl $0x20,%esp%ebx页脚0x08048e2b :pop %esi 0x08048e2c :pop %ebp 0x08048e2d :ret从代码的分析中可知:需要输入两个数,并且第一个数的后四位不能为1111,若为则引爆炸弹。在程序中我 们会遇到一个给左值0x804alc0o我们可以査看其值为:(gdb) p *0x804alc016$8 = 10, 2, 14, 7, 8, 12, 15, 11, 0, 4, 1, 13, 3, 9, 6, 5査看16个值,因为发现后而的循环中需要循环

29、遍历使用16个数。其中最难懂的代码就是0x08048e0b :mov(%ebx/%eax,4)/%eax这一行代码,ebx对应的是0x804alc0对应的首地址。这句话的意思解释为C语言的意思就是n = ano寄存器ecx保存的是计算得sum的总值。这段代码翻译成c语言类似于:sum=O;for(i=l;n=15;i+)n=an;sum+=n;其中第一次n取的值应为用户输入的第一个数二进制下的后四位。之后每次都等于an, sum为除去第一次之外所有n取值的和。采用逆推的方法来求岀n第一次取的值。序号0123456789101112131415数组1217811104113965042513fo

30、r循环当n为15时终止,因此最后一个n为15,对应序号为上一个n,即6。同理,可 以得到,n从第一个到最后一个为:5 12 3 7 11 13 9 4 8 0 10 1 2 14 6 15o sum=15*16/2-5=115即用户输入的第二个数为115。用户输入第一个数二进制下的后四位 为0101(即第一个n=5)由于第一位只要满足输入的数的后四位不为1111,第二个数为115即可,如:10 115,5 1150反汇编代码如下:0x08048c89 : push %ebp0x08048c8a : mov %esp,%ebp页脚0x08048c8c :push%edi0x08048c8d :p

31、ush%esi0x08048c8e :push%ebx0x08048c8f :sub$0x5cz%esp0x08048c92 :lea-0x30(%ebp)/%eax0x08048c95 :mov%eax,0x4(%esp)0x08048c99 : mov0x8(%ebp),%eax0x08048c9c : mov%eax,(%esp)0x08048c9f : call 0x08048ca4 : mov 0x08048ca9 : lea 0x08048cac : mov 0x08048caf : sub 0x08048cb2 :cmp 0x08048cb5 :jbe 0x08048cb7 :c

32、all 0x08048cbc : add 0x08048cbf : cmp 0x08048cc2 : je 0x08048cc4 : lea 0x08048cc7 : mov 0x08048cca : mov 0x08048cce : cmp 0x08048cd0 :jne 0x08048cd2 :call 0x08048cd7 :addl 0x08048cdb :add 0x08048cde :cmpl 0x08048ce2 :jle 0x08048ce4 :jmp 0x08048ce6 : mov 0x08048ceb : lea 0x08048cee :jmp 0x08048cf0 :

33、mov 0x08048cf3 : add0x804910b $OxO,%esi-Ox3O(%ebp)/%edi(%edi/%esi/4)/%eax 第 esi+1 个数给 eax。开始外层 for 循环。$0xl,%eaxeax0$0x5,%eax eax小于等于5跳过炸弹,即第esi+1个数小于等于6。0x8048cbc 0x80490dl $Oxl,%esi esi+a$Ox6,%esi esi不等于6时不跳转。等于6时跳转至0x8048ce6。0x8048ce6 (%edi/%esi/4),%ebx 第 esi+1 个数给 ebxo%esi,-0x4c(%ebp)-0x4(%edi,%e

34、si,4)/%eax 第 esi 个数给 eaxc 开始层 for 循环。 (%ebx),%eax若eax和ebx不相等则跳过炸弹。0x8048cd7 0x80490dl $0xl/-0x4c(%ebp) 每次加 1 o$0x4z%ebx ebx+=4o$0x5/-0x4c(%ebp)小于等于5时跳转,即能循环6-esi次。0x8048cca 0x8048cac $0x0,%ebx 0x30(%ebp),%edi0x8048d06 跳转到第 0x8048d06 行。 0x8(%edx),%edx此处为两层for循环语句.作用为通过用户 $0xlz%eax输入的六个数字来调整链表中6个元素的位置

35、。0x08048cf6 :cmp %ecx,%eax0x08048cf8 : jne0x08048cfa : mov 0x08048cfe : add 0x08048d01 :cmp 0x08048d04 :je 0x08048d06 :mov 0x08048d08 :mov 0x08048d0b :mov0x8048cf0 %edx/-0x48(%ebp,%esi,4)$Oxl,%ebx$0x6,%ebx0x8048dlc %ebx,%esi(%edi/%ebx/4),%ecx$0x804c0c4/%edx 0x804c0c4查看可知是一个链表,图下附。页脚0x08048dl0 :mov 0

36、x08048dl5 :cmp 0x08048dl8 :g 0x08048dla :mp 0x08048dlc :mov 0x08048dlf :mov 0x08048d22 :mov 0x08048d25 :mov 0x08048d28 :mov 0x08048d2b :mov 0x08048d2e :mov 0x08048d31 :mov 0x08048d34 :mov 0x08048d37 :mov 0x08048d3a :mov 0x08048d3d :movl 0x08048d44 :mov 0x08048d49 :mov 0x08048d4c :mov 0x08048d4e :cmp

37、 0x08048d50 :jge 0x08048d52 :call 0x08048d57 :mov 0x08048d5a :add 0x08048d5d :cmp 0x08048d60 :jne 0x08048d62 :add 0x08048d65 :pop 0x08048d66 :pop 0x08048d67 :pop 0x08048d68 :pop$Oxlz%eax$Oxl,%ecx0x8048cf0 0x8048cfa -0x48(%ebp),%ebx重新排列链表的值。-0x44(%ebp)/%eax%eax,0x8(%ebx)-0x40(%ebp)z%edx%edxzOx&%eax) Ox3c(%ebp)z%eax%eax,Ox&%edx) 0x38(%ebp)z%edx%edxz0x8(%eax) 0x34(%ebp)z%eax%eax,0x8(%edx)对链表的值进行检测。$0x0/0x8(%eax)$OxO,%esi0x8(%ebx)z%eax(%ebx),%edx(%eax),%edx0x8048d57 0x80490dl 0x8(%ebx)/%ebx$Oxl,%esi$0x5?%esi0x8048d49 $0x5c,%esp%ebx%esi%edi%ebp 0x08048

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论