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

下载本文档

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

文档简介

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

2、骤:1、打开终端进入bomb文件夹开始进行实验,反汇编出代码,这里有两种方式可以反汇编,第一种用命令行 objdump-d bomb > 1.txt ,如下图:ogyydogyy-virtual-machine:/LAB3$ objdump -d bomb>l4txt ogyydogyy-virtual-machine:*/LAB3$ |第二种反汇编方式就是用gdb工具,首先gdb bomb 进入gdb工具的调试状态然后输入命令“disas所要返回的函数名”即可得到函数的汇编代码。2、拆除炸弹Phaselgdb) dtsas phase_luup of a&sembler

3、code for function phase_l:0x08048f61<+0>:push&bp0xG8648f62NOV%esp,%ebpsub$0xl8,%esp0x08648f67< + 6>:movl$dx894alSc,0x4(%e sp)Ox08648f6fmov0xB(ebp)(%eaxOx08O48f72mov%EdX,(%25p)0xO8648f75<+20>:call0xfi648fab <strtngs_not_equal>0x08048f7a<+25>:testKedxeaxexB&e48f7c

4、<+27>:je9x8。48f83 <phase_lt34>Or a r.call0x86490dl explode bonb>LibreOfFice Calc4-34>:leaveOx08e48f84retEnd of s&ebler dump*当判断%eax的结果如果不为 0的话就会调用 call 0x80490d1 <explode_bomb> 也就是 说会爆炸,所以函数 strings_not_equal 的返回值为0由这个函数名可联想到函数的功能是比较 字符串,"字符串不相同”返回值为0证明字符串相同,再往上 movl

5、 $0x804a15c,0x4(%esp)这里有立即数,按照刚才的分析这应该是一个字符串所以我们在gdb状态下用x/s 0x804a15c 查看出现字符串"We have to stand with our North Korean allies."这就应该是我们所要输入的字符串了。我们可以先调试一下,在 explode_bomb 入口 0x80490d1 设断点,再进行 run操作。鲁嗡 dogyy)dogyy-virtual-machine: /LAB30x08048f61 十。a:pushStebp0x08048f62 <+l>:mov%esp,%ebpO

6、x08O48f64 <+3>Isub519xl8,将esp0x081348f67 c+6>:movl$0x804al5c,0x4(%esp)Ox08O48f6f -mov0x8(%ebp),%esx0xO8O48f72 c+17>:movKeax,(%esp)0x08048f75 <+20>:call0x8048fab <strtngs_not_equal>Ox08O48f7a <+25>:test0x08048f7c c+27>:0xS048f83 cphase_l+34>0x08048f7e c+29>:call

7、Ox8O490dl cexplode_bomb>0x08048f83 c+34?:leave0x08048f84 <+35:retEnd of assembler dump * (gdb) x/s 0x804al5c0xS04al5c:"We have to stand with our North Korean allies*(gdb) break *0x80490dlBreakpoint 1 at 0x80490dl(gdb) runStarting programi /home/dogyy/LAB3/bombWelcome to ny fiendish little

8、 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 one?Phase2(gdb) dtsas phase_ZDuhd of as5cnblcr code F function phase Z:pushwebp6b u+g黑"p.*cbp取白8048。5d <+3>IpushMestpushKehxBx6BelBd6

9、f <+5>:sub$9x30,«espOxO8O4Bd7Z ct»:lea*OxZO(?iebp) ,%eax0XO8f)4HdT& <r+ll>:和白V*3M,6X4e£p)0xOeO40d79 <+15>:novexBfMcbp) jJtcax0xe804ad7c <+is>:用CW3iedxp(%esp)9xe»04tjd7t <+21>:calL .耳uqjl白b_weadnbers1 JdU 4 三十工八;cmpl56x&, -ex2O(%eb>5、1sUbt0

10、894日H88 *;+30>iJ neBM8948d9f) <phi£e_2+-2B3b;pt$gj(tF-4)c匚(*ebp) . 一. .- 一10x6804ac8e 。十je-OXS0tK|95 yph05U_Z+43>日乂080牛日已9。亡43&、:cltBxHB4g®di <explode_bonb>0X08013(195 <+科3:lea &xlB(Xebp) (%ct>x0fi048d98 c+4fi>:608O4Ud9b c+49>:flOV0xGOO4Qd9e <52>:ad

11、dexa(K<bx),% 亡0X68G4欧:a工 <+55>:Cmp蒐wax, (XetiM )exeso4Qciai <+S7>:jeGxOlSdaa <phse_2*640xe8O40da5 <+59>:call6xS049Gd1 explode_bonb-Type <returft> to continue, r q return> To qutt- returnQxG8f)4Sdda <+64>:add$0x4 febx0xG8048cad <+67>:3P趾、t,双bx9x«H(J4H

12、daf +69>tjne6xa048d9b vphzME/449>3油804Bdbl <;+71>;add$0x3"算 uspf)x0864H:b <+74>rpopMebxDXB8848db5 <+75>:pop%esi0xS8048db6 <+78a;pop*ebp0x88O48db7 <+77>:retEnd of assembler dunp.首先看到了 call 0x804910b <read_six_numbers>所以可以猜测这道关可能是要输入6个数字,所以先把汇编代码弄出来。|(gdb) d

13、i弓Oiinp of a&senbLer codefor function read six nunbers:0KD8G491Ob十日:pu弓h脏bpexO0O491Ot<+l>;riov工已$ 口,依bp<+3> :sub$&X7R±*esp9x08049111<+6> :novGx<C%ebp)(%eax0x00043114lea0xH(%cax) j%cdx0x08049117<+17>:加QM%edK,Oxic(%esp)eK08O4911bleaoxie(%eax)0xese4911eNOV%edx,Ox

14、lfi(%esp)OX0SG49122f+237:leaGxc(Seax)f%edx0X08049125nov%edx,0xi4(%esp)6x98649129leaSxSeax J, %edxeKeaesizc<+33>:non9iedKldxlQ(%esp)0X00049130<+37>llea14(斑取)+%edx<+4fl>:nov* s»d)(,吕 xr(,pvp)0X086d9127nov%e«x,axS(%e£p)0xe864913bnovi$Gx(3gci232,®*4(Jk5p)0x08049143&

15、lt;+50>:novOxaCbp).除;ax0KB8649146mon%电曰黑0X08049149<462>tcaLLex&ai&34G <_i£cc99_sscaftf0x0SG4914ev+67):cnp50x5f0X0804151<+70>:Jg0X6049158 vBdC_slx_rHj眄bej+77,0x986491SS+72t>caLexSS4y0dl <expLcde bonb>Type <return> to 8ntinue,or q <return* to quitreturn

16、0x08091503m;leaveeK0H649159<+78>:retEnd of assembler dump.事实上经过过程的分析我们确实需要输入6个数字并且存储在-0x20 (%ebp )到-0*; (%ebp )的位置上,由上述的代码所给出的注释可以得到第一个数为0第二个为1,然后代码进入一个循环,这个循环所表达的意思就是第3个数字等于前两个数字的和也就是1 ,第四个数字等于第 2个和第3个数字的和,以此类推,我们得到这6个数字分别为0 1 1 2 3 5.验证结果如下:Phase 1 defused. How about the next one? 0 112 3 5

17、That nunbe 2. Kebd QQtn。!Phase3汇编代码(gdb) dtsas phase .3 Dunp of assembler code for function日可<+l>:nov需6xO8Mflea4 <+3>:sub$3x28 H ifiesp<+6>:lea-&xi6t%ebp) *?GeaxexOBD4Btaanov56eax,Oxc(?Sespexe8048eae <+i3>:lea-9xcfxebp)CxOa04Ccblnov加白乂4侬(加5p)x©芯E>48eb耳 * * 2己>:

18、_ 门口城 .4x*Q4日232.»4(抬ewp) Gx6SMet)d <+2B>:nove海(脏bp)*白3区exO83Bec9 <+3L>:nov%&axf(%esp)6x6flMSec5 <+34>:ell KgG4gMG 噎 _tsof99一二Ox0SM8ec8<+J9>enpS3xl p%eax&x68£i48ecba42xjg0xfi&48ed2叩hase_3449>HHEggaEQH6x0806ecdcallDKfl649Qdl<:exp|adebt>nb7日克BK曰白H

19、ed7<+49>Icmpl$9X7,-QMC(Kebp)exOa&4Sedo<+53>:jo0XSO43N3 cph3se 3162>GxOSDBeda<+55>:mo" 9xc(%i?bp)eax-88,4Ufdb*+58a:jnp-9xS8吃;11口if,c口x,4)CxOSO4fiee2<+65>-nov5&s(九¥©司同<4 7&>:jnpeKfie48f3c cphase_3+lSS>GxOSDSee?novS0xGpSeaxexeae4Heea-=+77&g

20、t;:xehg%曰乂,丸白乂-Type <retiirn> to continue, or q <retur n> to quit - - - returnexesaifiefft<479>:Jnpaxae4Bf37<phase_3+iSD6xe8046efJfiov$9x&fKeaxexOSOSef77jnpOKfi048f32<phase_3+145s吕xH89门8er9novt%eaxOxOaD4SefeM+9A;xchq为ak,为hkOxeSMBfBO<+9S>:"P0xSO48f2d <phase_3

21、+14fi>OxO8048fe2<4-97>:nov$6x8 t%eaxOxOS048fO7<+102>:jnp9K8048f28 cphase_3+135>OXO8048f09nov$exo,seax0x0804Sf0e<+169>:xchg%ax,%axOxea048flO<+lll>:jnp0xB648f23 <phd&e_3+130>xe>8G»43F12<+113>:P)OV56x314 .Meax«xe&e4Bfi7加pOxS048fle <phase

22、_3+125>0x03043fl9v+lZth1:mov$OxG,«eax_0x0B®4Hf1<+125>:sub$0x35a,%eax0x08048f23<+130>:add$0x2ef #%eaxOxO8048f28<+13S>:sub$0x216OxO8O4&f2d+140>:add$0x216,%eax0x08948f32<+145>:sub50x216泮唇曰其ex08O4Bf37<+150>:add$6x216,«eax6xe8048f3c<+155>:sub$0

23、x216F«ea«0x0B04Bf41<+160>:jmp9x&048f4d <phase_3+172>电38g48f43<+lG2>:call0xSO49edi <explode_bomb>Type vetug to continue.or q <return> to quit-eturnOxO8048f48<+167>:mov$0x0 eaxOxO8048f4d<+172>:cmpl$0x5,-Dxc(Kebp)0x0B04Sf51<4-176>:jgexse4efs

24、s <phase_3+ie3>0xe804Bf53<+178>:crip-0xlO(Xebp).*cmx0x0B948f56je盹融48干5d <phase_3+188>SxOSMBfSS<+18S>:callOxS049edl <explode_bomb>OxO8048f5dv+188>:leaveOx08O4&f5e<=+189>:xchg%axj%ax0M08048f60<+191>:retEnd of assembler dunp.(gdb) |看到 0x08048eb5 <+20&

25、gt;: movl $0x804a23e,0x4(%esp)这行代码,又是一个立即数。同样我们查看地址中的值再结合后面语句中有调用isoc99_sscanfplt函数,说明这是要我们输入两个整型值。(gdb) x/sb Ox804a23e0x804a23e:"%d Std”注:sscanf的功能是sscanf(),从一个字符串中读进与指定格式相符的数据。它的返回值为 被成功赋值的指针变量的个数,如果该函数发生错误,则返回 EOF (-1)根据sscanf的返回值判断可知所输入的值得个数大于1,也就验证上面所说的输入两个整型数值,后面的语句有判断了入的第一个数值小于7。接下来的语句0x

26、08048edb <+58>: jmp*0x804a1a0(,%eax,4) 典型的switch 跳转语句,跳转到以0x804a1a0 为基址的跳转表中输入p/x *0x804a1a0 得到地址0x8048f12,也就是输入 0的时候程序会跳转到0x8048f12<+113> 的地方执行。在代码中找到这个地址,从这个地址继续执行将0x314赋给%eax然后跳转到0x08048f1e <+125>(gdb) p/x *Ox8O4ala0$1 = Qx8043fl2tgdb)以下的操作就是 0x314-0x35a+0x2ef-0x216+0x216-0x216+

27、0x216-0x216 结果为 147cmp -0x10(%ebp),%eax 这个语句说明147就是我们所要输入的第二个参数。验证结果如下:0 147Halfway there!Phase4汇编代码(gdb) dtsas phase_4Dump of assembler code for function phase_4:0xOS948e2e <+e>:push%ebp0xO8048e2f <+l>:MOV%esp,%ebp0xO8O48e31 <+3>:sub$0x28F%esp0x08048e34 <+6>:lea-OxlO(%ebp)f%

28、eax0X08048e37 <+9>:nov%eax,Oxc(%esp)0X08048e3b <+13>:lea-Oxc(%ebp),%eax6x08048e3e <+16>:nov%eax,0x8(%esp)0XO8048e42 <+20>:novi$Ox8Q4a23e,0x4(%esp)0XO8048e4a <+28>:novGx8(%ebp),%eax0xO8048e4d <+31>:F1OV%eax,(%esp)0xO8048e5O <+34>:call0x8048840 <_isoc99_ssc

29、anfplt>0XO8048e55 <+39>:CPlp$0x2,%eax0XO8048e58 <+42>:jne0x8048e66 <phase_4+56>0xO8048e5a <+44>:F1OV-Oxc(Xebp)f%eax0xO8048e5d <+47>:test%eax,%eax0XO3048e5f <+49>:js0x8048e66 <phase_4+56>0XO8048e61 <+51>:cnp$0xe,%eax0xO8048e64 <+54>:jleGx8648e6

30、b <phase_4+61>0XO8048e66 <+56>:callOx8049Odl <explode_bonb>0xO8048e6b <+61>:novi$0xe,0x8(%esp)0x08048e73 <+69>:noviS0x0 .Ox4t%esD,)0XO8O48e7b <+77>:novType <return> to continuet 0x03048e7e<+80>nov0x09048e81<+S3>:call0xe9049e86<488>:CFipOx03

31、O-48e89<+91jneOx08048e8b<+93>:cnpl0x08O48e8f<+97>:je0x03048e91<*99):leaOxO8048e98<+106>:call0x08048e?dq+111:leaveOxO80-18e9e(+ 112: xchgOx09048eaOretEnd of assembler dump. (Qdb) I-Oxc(%ebp),%eaxor q <eturriA to quitreturn %eax,(%esp)0x8O48b60 <func4>$0xl,%eax0x8048e9

32、1 <phase_4+99>SOxl.-QxlGC*ebp)-0x8048e9d *=phase_4+lllOx0(%est eiz>l) ,%est Ox8O490dl <explode_bonb>StaXjXax根据 0x08048e42 <+20>: movl $0x804a23e,0x4(%esp),我们查看 0x804a23e 的值结 果为:(gdb) x/s ex864a23e 0xaB4a23e:5d %d"(gdb) |再根据语句 0x08048e50 <+34>:call 0x8048840 <_isoc9

33、9_sscanfplt>0x08048e55 <+39>:cmp $0x2,%eax说明我们要输入两个整型数,下面的工作就是判断这两个整型数分别是什么。由代码0x08048e6b <+61>:movl$0xe,0x8(%esp)0x08048e73 <+69>:movl$0x0,0x4(%esp)0x08048e7b <+77>:mov-0xc(%ebp),%eax0x08048e7e <+80>:mov%eax,(%esp)?可以看出我们以第一个参数,014为参数传入递归函数中而且返回值为1,所以我们这时做的事情就是分析fun

34、c4函数,看第一个参数为多少时返回值能为1,而第二个参数有代码0x08048e8b <+93>:cmpl $0x1,-0x10(%ebp)0x08048e8f <+97>:je 0x8048e9d <phase_4+111>可知第二个参数就为 1。下面分析func4Dump of dssembler code for function func4:0xB804Sb60push%ebp(3x08。48b61 < + 1>:riov%esp,%ebpE)x08O48b63,十3:sub$0xl8,Xesp0x08048b66mov%ebx, -Ox8

35、(96ebp)6)X08。48b69 < + 9>:mov%est, *Ox4(3Cebp)0xO8048b6cmov6x8(%ebp),%edx0x08048b6f 弋十15:novOxc<56ebp) ,%eax0X08048b72 <+18>:mov0xlG(%ebp)F%ebx9xB8048b75 <+21=>:mov%ebx %ecx9x08043b775ubElxO8048b79 <+25>:mov%已亡”,%esi0x08O48b7b <+27>:shrS0xlf,%esi9xG8048b7e <+30>

36、;:lea(West.Kecx,1),%ecx0x08048b81 +33注:sorftfiecx0x08048b83add%eax,%ecx9x08048bS5 <+37>:CMp匚乂Ox08O48b87 v+39>jle0x8048t>a0unc4+64>9xO8048b89sub$Gxl,%ecxOxO8048bflc:mov, Dx8(96esp)9x08O4Sb90 <+4S>:movXeaxf0x4(%esp)x08848b94 <+52> :movStedx, (Kesp)0x08O48b97 c55:callDx8O48b6

37、0 <fun匚4-Type <return> to continue. or q <return> to quit-0x0S048b9c <+6G>:add%eax,%eaxOxO8048b9e <+62>:J叩0x804Bbc0 <func4+96>0X08O48baO <+64>:mov$0xO,%eax0x08048ba5 <+69>:cnp%edx,%ecx0x68848ba7 <+71>:jge0x8048bc0 <func4+96>OxG8048ba9 <+73&

38、gt;:mov%ebx 0x8(%esp)Ox08G48bad <+77>:add$0xl,%ecxOx08O48bbO <+80>:mov56ecxt0x4(%esp)0x08。48bb4 <+84>rmov杭dx,(耻与p)GxG8048bb7 <+S7>:all0x8O48b60 <func4>OX08O48bbc <+92>:tea0xl(%eax,%eaxf1),%eax0xO8Q48bc0 <+96>:mov*0x8(%ebp),%ebxOxO8048bc3 <+99>:mov*0x4(

39、%ebp),%esiOxO8048bc6 <+102>:mov%ebp,%esp0x08048bc8 <+104>:pop%ebpOx08048bc9 <+10S>:retEnd of assembler dump*根据判断条件 jle 0x8048ba0<func4+64> 和 jge 0x8048bc0<func4+96> 可知这个函数就是参数 2和参数3经过一系列的操作最终等于参数1。参数1在这个过程中是不变的。我们第一次传入func4的参数为参数1, 0, 14,结果返回值要求为1,也就是%eax的值为1,我用的是反向推理的方

40、法。首先如果使返回值为1,根据0x08048bbc <+92>:lea 0x1(%eax,%eax,1),%eax这条语句我们可以使这条语句为最后返回的值也就是说我们第一次调用func4是在0x08048bb7 <+87>:call 0x8048b60 <func4>那么就是说参数1大于7,在此条件下我们将(9, 8, 14)传入再次调用func4 ,调用func4后我们希望它的返回值为 0这样根据0x1(%eax,%eax,1),%eax况就是14和8经过运算后结果为 11而参数1恰好等于11返回值就是1 了,最简单的一种情 的情况,更复杂一些的情况就是它

41、又 ,再由它的返回值再继续推理,所以调用了 0x08048b97 <+55>:call 0x8048b60 <func4>此题有多种答案,最简单的就是11, 1。Halfway therel 11 1So you got that one» Try this one.Phase5 :汇编代码Dump of assembler code for function phase_5:0x08048db8 <+0>:push%ebp0x08048db9 <+1>:mov%esp,%ebp0x08048dbb <+3>:push%es

42、i0x08048dbc <+4>:push%ebx0x08048dbd <+5>:sub$0x20,%esp0x08048dc0 <+8>:lea-0x10(%ebp),%eax0x08048dc3 <+11>:mov%eax,0xc(%esp)0x08048dc7 <+15>:lea-0xc(%ebp),%eax0x08048dca <+18>:mov%eax,0x8(%esp)0x08048dce <+22>:movl$0x804a23e,0x4(%esp)0x08048dd6 <+30>:mo

43、v0x8(%ebp),%eax0x08048dd9 <+33>:mov%eax,(%esp)0x08048ddc <+36>: call0x8048840 <_isoc99_sscanfplt>0x08048de1 <+41>:cmp$0x1,%eax所输入的值的个数应该大于10x08048de4 <+44>: jg0x8048deb <phase_5+51>0x08048de6 <+46>: call0x80490d1 <explode_bomb>0x08048deb <+51>:mo

44、v-0xc(%ebp),%eax0x08048dee <+54>: and$0xf,%eax /将32*中的值与0xf做逻辑与运算0x08048df1 <+57>:mov%eax,-0xc(%ebp)/将相与后的结果传入地址 -0xc(%ebp)0x08048df4 <+60>:cmp$0xf,%eax 比较eax中的值,结果不能等于150x08048df7 <+63>:je0x8048e22 <phase_5+106>0x08048df9 <+65>:mov$0x0,%ecx0x08048dfe <+70>:

45、mov$0x0,%edx0x08048e03 <+75>:mov$0x804a1c0,%ebx/将数组的首地址中的值传入 %edx0x08048e08 <+80>:add$0x1,%edx/进入循环0x08048e0b <+83>:mov(%ebx,%eax,4),%eax/将数组中第%eax位置的值传给 %eax0x08048e0e <+86>:add%eax,%ecx /将每次%eax的值累加起来0x08048e10 <+88>:cmp$0xf,%eax /比较%eax和15若等于则跳出循环0x08048e13 <+91&g

46、t;:jne0x8048e08 <phase_5+80>0x08048e15 <+93>:mov%eax,-0xc(%ebp)/ 将得到的 %eax 的值传入-0xc(%ebp)0x08048e18 <+96>:cmp$0xf,%edx /比较edx和15,如不等于会 bomb !所以循环以后%edx必定等于150x08048e1b <+99>: jne 0x8048e22 <phase_5+106>0x08048e1d <+101>:cmp %ecx,-0x10(%ebp)/ 我们所输入的第二个参数的值等于循环之后%ec

47、x的结果,也就是数组中 15个值累加的结果0x08048e20 <+104>:je0x8048e27 <phase_5+111>0x08048e22 <+106>:call0x80490d1 <explode_bomb>0x08048e27 <+111>:add$0x20,%esp0x08048e2a <+114>:pop%ebx0x08048e2b <+115>:pop%esi0x08048e2c <+116>:pop%ebp0x08048e2d <+117>:ret与 phase3

48、相同 0x08048dce <+22>:movl $0x804a23e,0x4(%esp)我们查看这个语句中地址的值得到“ %d , %d ”结合语句0x08048ddc <+36>:call 0x8048840 <_isoc99_sscanfplt>0x08048de1 <+41>:cmp $0x1,%eax说明和phase3 一样我们需要输入两个整型数,下面的工作就是确定整型数的值,首先取我 们所要输入的第一个参数的后四位,如果它的后四位全为 1那么就会爆炸,所以后四位不可能全 为1.接着就是一个循环的过程了,这个循环我们可以尝试写成c代码来

49、解决c代码如下:int c=0;int d=0; int b=a0;While(an!=15) d+; n=an; c=c+n;根据0x08048e18 <+96>:cmp$0xf,%edx 我们知道c代码中的d在最后循环结束时的值为15,也就是循环要进行15次,根据0x08048e1d <+101>:cmp%ecx,-0x10(%ebp)最后c的值就是第二个参数。而第一个参数在取后四位之后循环之后的结果是15。看到循环中的0x08048dce <+22>: movl $0x804a23e,0x4(%esp)语句我最开始想到的是又是一个立即数所以我查看了它的

50、值发现如下图所示,<arry.3488+1> ,加上0x08048e0b <+83>:mov (%ebx,%eax,4),%eax我联想到这是一个数组,0x804a1c0 是数组的首地址,我们用 p/x * (0x804a1c0 ) 16来查看这个数组。如下图所示:(gdb) x/s 0xS04alclBx804dlcl <array.3488+l>:",r(gdb) p/x *(int *)(0x8O4alcO)16$2 = 0xa, &x2, Oxer 6x7, Bx8, Oxc, ©xf, Qxb, 0x0, 0x4T 6x

51、1, Sxd, 6x9, 0x6, 0x51根据最后的%eax的值15来推出最开始的值,我们可以根据 n=an来:n=an=15n=an=6n=an=14n=an=2n=an=1n=an=10n=an=0n=an=8n=an=4n=an=9n=an=13n=an=11n=an=7n=an=3n=an=12 *n=an=5实际上循环执行了 15次也就是第一次迭代 n所得到的值是12,那么此时传进的n是5也就是第一个参数的后 4位就是0101也就是5,而第二个参数等于这 15个过程的累加也就 是115,。第一个参数后四位为5的之都可以,最后我选择的参数是5, 115,验证过程如图所示:So you

52、 got that one * Try this one * 5 115 Good work I On to the next再试一个53 115So you got that one.Try this one, 53 115 Good work! On to the next 4.,Phase6汇编代码lump of assembler code for function phase_6:0x08O48c89 <+0>:push%ebp0X08O48c8a <+l>:movesp,%ebp0X08048C8C <+3>:push%ediOx08O48c8d

53、 <+4>:push%esiBx8B648c8e <+5>:push%ebx0x08048c8f <+6>:sub$0x5c,%esp8048c92 <+9>:lea-0x30(%ebp),%eax0X08O48C95 <+12>:mov%eaxJ9x4(%esp)Ox08O48c99mov0x8(%ebp) ,96eaxOx08O48c9c <+19>:mov%eax,(%esp)0XO8O48c9f <+22>:call0x804910b <read_stx_nunbers>OxO8048ca4

54、 <+27>:mov$®x%加写ix08048ca9 <+32>:lea-0x3O(%ebp),%ediOx08O48cac <+35>:mov(Xedt,%est,4),%eax0xO8O48caf <+38>:subjOxleax0X0848cb2 <+41>:cmp$0x5 j%eax 龌easH0x08O48cb5 <+44>:jbe0x8048cbc <phase_6+51>Ox®8948cb7 <+46>:call0x8O49Odl <explode_bomb&

55、gt;0x08048cbc <+51>:add$0x1,%esl0x08048cbf <+54>:cmpSOxGesi0XO8O48CC2 <+57>:jeex8048ce6 <phase_6+93>0x08O48cc4 <+59>:lea(%edi,%est,4),%ebxType <return> tocontinue,or q <return> to quit- - returnOX08648CC7<¥62>:mov%esi,-0x4c(%ebp)ax08O49cca<4-65

56、> :movOx08O48cce<+69>:cmp(疾bx) .触x-0x08048cd0jne0x8O48cd7 <|u<iiozjc_ij*t r .Ox08e48cd2call0x3649Odl <explode_bomb>OX08649cd7<+7S>:addl§9x1,-0x4c(%ebp)OxOSG48cdb<+82>:add$0x4,%ebxOx08O48cde十35y:cmpl$05,-Ox4c(%ebp)Ox08649ce2<+89>:jl电0x8048cca <phase_6+65

57、>ax9804ace4jEp0x8648cac <phase_6+35>OxO8O48ce6<+93>;novSOxOebxOxG8O48ceb<<98>:lea'0x3a(%ebp),%edt0x98048ceejEpBx3848d36 tphase_&+125>0xQ8648cf9<+103>:mov0xe(%edx),%edxOx08648cf3十:add$6x1,%eaxOx08O48cfO<+109>:cmp%ecx,%eaxOx08649cf9Jne0x8O48cf0 <pha

58、63;e_6+103>OxO8O48cfd<+16;movXcdxf-6x46(%ebpt%esiJ4)0x&868cfe<+117?:add$0xl,%ebxOx08648d01<+120>:cnp$0jc6 , %ebxOx0se4gd04<+123>:je©xse48dlc <phase_&+147>Ox08O48dO6MOV舶bx,加siElx08e48d08h1Z7>;mov(%edtP%ebx 4)B%ecx| -Type <return> to continue,or qEun> to quitreturn+27到+91判断6个参数每个都小于等于6并且互/、相同。OxO8O48d0b<+130>:mov$Ox8O4c0c4,%edx0x08048dl0<+13S>:mov$0x1j%eax0x08048dlS<+140>:cmp$0xl,%ecx0x08048dl8<+143>:jg0x8648cf0 <phase_6+103>

温馨提示

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

评论

0/150

提交评论