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

下载本文档

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

文档简介

HUNANUNIVERSITY课程实验报告课程名称:计算机组成与结构团实验名称:拆炸弹专业班级:姓名:学号:完成时间:(一)实验目的:程序运营中有6个关卡(6个phase),每个phase需要用户在终端上输入特定的字符或者数字才干通关,否则会引爆炸弹!那么如何才干知道输入什么内容呢?这需要你使用gdb工具反汇编出汇编代码,结合c语言文献找到每个关卡的入口函数。然后分

0x08048e5a<+44>:mov0x08048e5a<+44>:mov0x08048e5a<+44>:mov-0xc(%ebp),%eax0x08048e5d<+47>:test%eax,%eax第一段数据大于等于0,否则引爆。0x08048e5f<+49>:l3js0x8048e66<phase_4+56>$Oxe,%eax第一段数据小于等于14时跳过引爆。0x08048e66<+56>:call0x80490dl<expIode_bomb>0x08048e6b<+61>:mov1$0xe,0x8(%esp)Ox08048e73<+69>:mo$0x0,0x4(%esp)Ox08048c7b<4-77>:mov-Oxc(%cbp),%eax0x08048e7e<+8O>:0mov%0x08048e5a<+44>:mov-0xc(%ebp),%eax0x08048e5d<+47>:test%eax,%eax第一段数据大于等于0,否则引爆。0x08048e5f<+49>:l3js0x8048e66<phase_4+56>$Oxe,%eax第一段数据小于等于14时跳过引爆。0x08048e66<+56>:call0x80490dl<expIode_bomb>0x08048e6b<+61>:mov1$0xe,0x8(%esp)Ox08048e73<+69>:mo$0x0,0x4(%esp)Ox08048c7b<4-77>:mov-Oxc(%cbp),%eax0x08048e7e<+8O>:0mov%eax,(%esp)0x08048e81<+83>:cal10x8048b60<func4>这几行为运营一个递归函数func4来拟定第一Ox08048e86<+88>:cmp$0xl,%eax段数据的值。Ox08048e89<+91>:0jne0x8048e91<phase_4+99>0x08048e8b<+93>:cmpl$0x1,-0x10(%ebp)第二个数据等于1则跳过爆炸。Ox08048e8f<+97>:0je0x8048e9d<phase_4+lll>0x08048e91<+99>:0leaOxO(%esi,%eiz,l),%esi0x08048e98<+106>:cal1x80490d1<explode_bomb>Ox08048e9d<4-111>:1%%ax,%ax%ax,%ax0x08048e9e<+112>:xchg0x08048eaO<+114>:ret以上对代码的分析可以看出,第二个数据拟定为1。第一个数据范围为大于等于0,小于%ax,%ax4,并且由一个递归函数func4又一次缩小了范围。但由于这个递归函数太过繁杂,而第一个数据范围又不大,直接将第一个数据从0尝试到13,得到了三个数字8、9、11符合规定。因此密码有三组:81,91,111。

<Phase_5>反汇编代码如下:0x08048db8<+0>:push%ebp0x08048db9<+1>:0mov%esp,%ebp0x08048dbb<+3>:push%esi0x08048dbc<+4>:0push0x08048dbd<+5>:0sub$0x20,%esp0x08048dcO<+8>:lea—OxlO(%ebp),%eaxOx08048dc3mov%eax,Oxc(%esp)此处为第二个数。Ox08048dc7<+15>:Iea-Oxc(%ebp),%eax0x08048dca<+l8>:<Phase_5>反汇编代码如下:0x08048db8<+0>:push%ebp0x08048db9<+1>:0mov%esp,%ebp0x08048dbb<+3>:push%esi0x08048dbc<+4>:0push0x08048dbd<+5>:0sub$0x20,%esp0x08048dcO<+8>:lea—OxlO(%ebp),%eaxOx08048dc3mov%eax,Oxc(%esp)此处为第二个数。Ox08048dc7<+15>:Iea-Oxc(%ebp),%eax0x08048dca<+l8>:mov%eax,0x8(%esp)此处为第一个数。0x08048dee<+22>:movl$0x804a23e,Ox4(%esp)$0x804a23e内为%d%d,即输入两个整数。0x08048dd6<+30>:mov0x8(%ebp),%eax0x08048dd9<+33>:movax,(%esp)0x08048ddc<+36>:0cal0x8048840<_isoc99_sscanf@plt>0x08048de1<+41>:cmp$0xl,%eax以上两行保证输入数据多于1组,否则引爆。0x08048de4<+44>:jg0x8048deb<phase_5+51>Ox08048de6<+46>:call0x80490d1<explode_bomb>0x08048deb<+51>:mov-Oxc(%ebp),%eax0x08048dee<+54>:0and$Oxf,%eax按位与,即保存第一个数的后四位。0x08048dee<+54>:0and%eaxz-0xc(%ebp)0x08048df1<+57>:0mov0x08048df4<+60>:0cmp$0xfz%eax第一个数二进制后四位不能为(1111%eaxz-0xc(%ebp)0x08048df7<+63>:jeOx8048e22<phase_5+106>0x08048df9<+65>:0mov$0x0,%ecx0X08048dfe<+70>:(3mov$0x0,%edx0x08048e030X08048dfe<+70>:(3mov$0x0,%edx0x08048e03<+75>:0mov$0x804alc0,%ebxS0x804a1cO指向的是一个数组,0x08048e08<+80>:add$0x1,%edx0x08048e0b<+83>:mov0x08048e08<+80>:add$0x1,%edx0x08048e0b<+83>:mov0x08048e0b<+83>:mov(%ebx,%0x08048e0b<+83>:mov(%ebx,%eax,4),%eax0x08048e0e<+86>:0add0x08048e0e<+86>:0add%eax,%ecx0x08048e0e<+86>:0add%eax,%ecx0x08048e10<+88>:cmp0x08048e10<+88>:cmp$0xf,%0x08048e10<+88>:cmp$0xf,%eax0x08048e13<+91>:0j0x08048e13<+91>:0jne0x8048e08<phase_5+80>0x08048e13<+91>:0jne0x8048e08<phase_5+80>以上五行为一个for循环语句,0x08048e0x08048e15<+93>:mov0x08048e15<+93>:mov0x08048e15<+93>:mov%eax,-0xc(%ebp)0x08048e18<+96>:(3cmp0x08048e18<+96>:(3cmp$0xf,0x08048e18<+96>:(3cmp$0xf,%edx上述的for循环要循环15次。0x08048elb<+99>:jne0x8048e22<phase_5+106>0x08048eldV+0x08048elb<+99>:jne0x8048e22<phase_5+106>0x08048eldV+101>:cmp0x08048eldV+1010x08048eldV+101>:cmp%ecx,-0xl0(%ebp)拟定第二个数的值,下面分析。0x08048e20<+104>:je0x8048e27<phase_5+111>Ox08048e22<+106>:c0x08048e20<+104>:je0x8048e27<phase_5+111>Ox08048e22<+106>:cOx08048e22<+106>:caII0x80490dl<expIode_bomb>0x08048e27<+lll>:add$0x20,%esp0x08048e2a<+114>:pop%ebx0x08048e2b<+115>:pop%esiOx08048e2c<+ll6>Ox08048e22<+106>:caII0x80490dl<expIode_bomb>0x08048e27<+lll>:add$0x20,%esp0x08048e2a<+114>:pop%ebx0x08048e2b<+115>:pop%esiOx08048e2c<+ll6>:Pop%ebp0x08048e2d<+117>:r从代码的分析中可知:需要输入两个数,并且第一个数的后四位不能为1111,若为1111则引爆炸弹。在程序中我们会碰到一个给定值0x804alc0。我们可以查看其值为:(gdb)p*0x8O4alc0016$8={10,2,14,7,8,12,15,11,0,4,1,13,3,9,6,5}查看16个值,由于发现后面的循环中需要循环遍历使用16个数。其中最难懂的代码就是Ox08048e0b<+83>:mov(%ebx,%eax,4),%eax这一行代码,ebx相应的是0x804alc0相应的首地址。这句话的意思解释为C语言的意思就是n=a[n]o寄存器ecx保存的是计算得sum的总值。这段代码翻译成c语言类似于:sum=0;for(i=1;n=15;i++)(n=a[n];sum+=n;)其中第一次n取的值应为用户输入的第一个数二进制下的后四位。之后每次都等于a[n],sum为除去第一次之外所有n取值的和。采用逆推的方法来求出n第一次取的值。序号0123456789111111012345数组1217811104113965042513for循环当n为15时终止,因此最后一个n为:15,相应序号为上一个n,即6。同理,可以得到,n从第一个到最后一个为:5123711139480101214615。sum=15*16/2-5=115。即用户输入的第二个数为115。用户输入第一个数二进制下的后四位为0101(即第一个n=5),由于第一位只要满足输入的数的后四位不为1111,第二个数为115即可,如:10115,5115o<Phase_6>反汇编代码如下:0X08048C89<+0>:push%ebp0x08048c8a<+l>:mov%esp,%ebp0x08048c8c<+3>:push%edi0x08048c8d<+4>:0pus%esiOx08048c8e<+5>:0push%ebx0x08048c8f<+6>:@sub$0x5c,%esp0x08048c92<+9>:lea-0x30(%ebp),%eax0x08048c95<+12>:0mov%eax,0x4(%esp)0x08048c99<+l6>:0mov0x8(%ebp),%eax0x08048c9c<+19>:mov%eax,(%esp)Ox08048c9f<+22>:cal0x804910b<readsixnumbers>0x08048ca4<+27>:mov$0x0,%esiOx08048ca9<+32>:(3lea-0x30(%ebp),%edi0x08048cac<+35>:0mov(%edi,%esi,4),%eax第esi+1个数给eax。开始外层for循环o0x08048caf<+38>:0sub$0x1,%eaxeax-o0x08048cb2<+41>:cm$0x5,%eaxeax小于等于5跳过炸弹,即第esi+1个数小于等于6a0x08048cb5<+44>:jbe0x8048cbc<phase_6+51>0x08048cb7<+46>:国ca10x80490dl<explode_bomb>0x08048cbc<+51>:0add$0xl,%esiesi++。0x08048cbf<+54>:cmp$0x6,%esiesi不等于6时不跳转。等于0x08048cbf<+54>:cmp转至0x8048ce6o0x08048cc2<+57>:0je0x8048ce6<phase_6+93>0x08048cc4<+59>:1ea0x08048cc4<+59>:1ea0x08048cc7<+62>:mov%esi0x4c(%ebp)(%edi,%esi,4),%ebx第esi+1个数给ebx。0x0x08048cca<+65>:0mov开始内层for循环。-0x4(%edi,%esi,4),%eax第esi个数给eax。0x08048cce<+69>:0cmp0x08048cce<+69>:0cmp(%ebx),%eax若eax和ebx不相等则跳过炸弹。0x08048cd0<+71>:jne0x8048cd7<phase_6+78>0x08048cd2<+73>:caII0x80490dl<exp1ode_bomb>0x08048cd7<+78>:addI$0x1,-0x4c(%ebp)每次加1。0x08048cdb<+82>:0add$0x4,%ebxebx+=4o0x08048cde<4-85>:0cmpl$0x5,-0x4c(%ebp)小于等于5时跳转,即能循环0x08048cde<4-85>:0cmpl0x08O48ce2<+89>:j1e0x8048cca<phase_6+65>0x08048c0x08O48ce2<+89>:j1e0x8048cca<phase_6+65>0x08048c0x08048c0x8048cac<phase_6+35>0x08048ce60x08048c0x8048cac<phase_6+35>0x08048ce60x08048ce6<+93>:0mov$0x0,%ebx0x08048ceb<+98>:01e-0x30(%ebp),%edi0x08048ce6<+93>:0mov$0x0,%ebx0x08048ceb<+98>:01e-0x30(%ebp),%ediOx08048cee<4-101>:jmp0x8048d06<phase_6+125>跳转到第Ox8048d06行。0x08048cf0<+103>:0x8(%edx),%edx0x08048cf0<+103>:通过用户0x08048cf3<+106>:add$0x1,%eax输入的六个数字来调整链表中6个元素的位置。0x08048cf6<+109>:cmp%eex,%eax0x08048cf8<+l10x08048cf6<+109>:cmp%eex,%eax0x08048cf8<+l11>:jne0x8048cf0<phase_6+103>movmov%edx/mov%edx/—Ox48(%ebp,%esi,4)Ox08048cfe<+117>:Ox08048cfe<+117>:add$0x1,%ebx0x08048d01<+120>:cmpOx08048cfe<+117>:add$0x1,%ebx0x08048d01<+120>:cmp$0x6,%ebx0x08048d04<+l23>:je0x08048d04<+l23>:je0x8048dlc<phase_6+147>0x08048d06<+l25>0x08048d04<+l23>:je0x8048dlc<phase_6+147>0x08048d06<+l25>:mov0x08048d06<+l25>:0x08048d06<+l25>:mov%ebx,%esi(%edi,%ebx,4),%ecx0x08048d08<+127>:mov(%edi,%ebx,4),%ecxOx08048dOb<+130>:movOx08048dOb<+130>:mov$0x804c0c4,%edx0x804c0c4Ox08048dOb<+130>:mov0x08048dl0<+135>:mov$0xlz%eax0x08048d15<+140>:cmp$0xl,%ecx0x08048d18<+143>:g0x8048cfO<phase_6+103>0x08048dla<+145>:mp0x8048cfa<phase_6+l13>Ox08048dlc<+147>:mov-Ox48(%ebp),%ebx重新排列链表的值。0x08048dlf<+150>:mov—0x44(%ebp),%eax0x08048d22<+153>:mov%eax,0x8(%ebx)0x08048d25<+156>:movOx08048d28<+159>0x08048d25<+156>:movOx08048d28<+159>:m0x08048d2b<+162>:mov0x08048d2e<+165>:mov0x08048d31<+168>:mov0x08048d34<+171>:movOx08048d37<+174>:mov0x08048d3a<+177>:mov%eax,0x8(%(0x08048d3d<+180>:movl$0x0,0x8(%eax)0x08048d44<+187>:mov$0x0,%esi-0x40(%ebp),%edxov%edx,0x8(%eax)-0x3c(%ebp),%eax%eax,0x8(%edx)-0x38(%ebp),%edx%edx,0x8(%eax)-0x34(%ebp),%eaxx)对链表的值进行检测。0x08048d49<+192>:mov0x08048d4c<+195>0x08048d49<+192>:mov0x08048d4c<+195>:mov0x08048d4e<+197>:cmp0x08048d50<+199>:jge0x08048d52<+201>:cal10x8(%ebx),%eax(%ebx),%edx(%eax),%edx0x8048d57<phase_6+206>0x80490dl<expIode_bomb0x8(%ebx),%ebx0x08048d57<+206>:mov0x8(%ebx),%ebx$0xl,%esi0X08048d5a<+209>:add0x08048d5d<+212>:cmp$0x5,%esi0xO8048d6O<+215>:jne0x8048d49<phase_6+192>$0xl,%esi0x08048d62<+217>:add$0x5cz%espOx08048d65<+220>:pop%ebx0x08048d66<+221>:pop%esi0x08048d67<+222>:pop%edi0x08048d68<+223>:pop%ebp0x08048d69<+224>:ret该代码实现的功能是将链表中的值得顺序按照你给定的顺序然后重新排列,使得链表中的数据按从小到大的顺序排列。输入x0x804cOc4查看链表头部的值为:0x1a7(gdb)x/xw0x804cOc4Ox804c0c4<nodel>:0x000001a7Ox804c0c4+0x8即可得到0x804c0c4指向的下一个链表的指针,*(0x804c0c4+0x8)可取其相应的值:0x6c(gdb)x/xw*(Ox804c0c4+0x8)Ox804cOb8<node2>:0x0000006c同理要得到相应的下一个链表中存放的值,则输入*(*(0x804coe4+0x8)+0x8),相应的值为Ox55(gdb)x/xw*(*(0x804c0c4+0x8)+0x8)0x804c0ac<node3>:0x00000155同理得到剩下的3个值为:0xl87Ox3bd0x255用户给定值:561432则链表中的数据则将0x3bd移动到1号位置,而将Ox255移动到2号位置。从而将链表中的值从大到小的顺序排列应当为:3bd2551a71871556c。则输入为561432o拆炸弹的结果为:szm@ubuntu:~/LAB3$./bombWelcometomyfiendishlittlebomb.Youhave6phaseswithwhichtoblowyourselfup.Haveaniceday!WehavetostandwithourNorthKoreanallies.Phase1defused.Howaboutthenextone?011235That'snumber2.Keepgoing!0147Halfwaythere!81Soyougotthatone.Trythisone.5115Goodwork!Ontothenext...561432Congratulations!You'vedefusedthebomb!szm@ubuntu:~/LAB3$实验总结:通过这次实验,对汇编语言有了一个更好的理解,与其说是理解,倒不如说是自己克服了看到汇编代码的那种恐惊感。由于以前没有接触过汇编语言,就像当初刚刚开始的时候接触c语言同样,碰到很长很难的代码就容易引发抵制的情绪,这次实验自己很好的克制了这种情绪。由于第一次实验的经验,使得对于汇编语言中的基本指令有了基本的掌握,才使得这次实验可以顺利的进行下去。这次实验虽然说是一个拆炸弹的游戏,但事实上是一个提高自己汇编语言能力的一次很好的机会,平时很难有机会完整的看完一整页一整页的汇编代码,通过这次实验,自己的确学到了很多。当然这次实验中也碰到了很多的困难,在看到第三题的时候由于那个类似switch的核心代码的跳转指令没有看懂而导致久久的停留在那个实验而浪费了很多的时间,最终在同学的帮助下,成功的解决了这个问题。析汇编代码,找到在每个phase程序段中,引导程序跳转到“explode_bomb”程序段的地方,并分析其成功跳转的条件,以此为突破口寻找应当在命令行输入何种字符通关。(-)实验环境:虚拟机ubuntu系统下32位操作系统,终端,gdb工具。(三)实验目的和操作:拆炸弹准备操作:查看给出的bomb工中的代码,得知控制检测密码正误的6个函数分别为:phase_1,phase_2,phase_3,phase_4,phase_5,phase_6o使用gbd工具对可执行文献bomb进行反汇编:打开bomb可执行文献所在的文献夹输入反汇编命令objdump-dbomb后,出现了大量汇编代码,在终端窗口可以看到很多行的汇编代码。也可以使用汇编指令。bjdump-dbomb>1.txt将汇编代码输出到服务器上一个自动生成的叫1.txt的文献中。❸C®szm(O)ubuntu:~/LAB38049faf:83f8ffcmp$6xffffffff,%eax8。49fb2:75f4jne8049fa8<_do_global_ctors_aux+Ox18>8049fb4:83c404add$0x4,%esp8。49fb7:5bPOP%ebx8049fb8:5dPOP%ebp8。49fb9:C3ret8049fba:96nop8049fbb:90nopDisassemblyofsectior\.fini•»*08049fbc<_ftni>:8049fbc:53push%ebx8049fbd:83ec08sub$0x8,%esp8049fc6:e800000000call8049fc5<_fini+0x9>8049fc5:5bpop%ebx8049fc6:81c32f206000add$Gx202f,%ebx8049fcc:e85fe9ffffcall8048930<_do_gl.obal_dtors_aux>8049fdl:83C408add$0x8,%esp8049fd4:5bpop%ebx8049fd5:C3retszm@ubuntu:~/LAB3$objdump-dbomb>l.txtIszm@ubuntu:~/LAB3$a|开始拆炸弹:<phas°」〉:的反汇编代码如下:0x08048f61<+O>:0push%ebp0x08048f62<+l>:mov%esp,%ebp0xO8048f64<+3>:sub$0x18,%esp0x08048f67<+6>:0mov1Ox804a15c,0x4(%esp)//sp寄存器地址指向$0x804a15c0x08048f6f<+14>:0mov0x8(%ebp),%eax将$0x804al5c的数据移给eax寄存器0x08048f72<+17>:0mov%eax,(%esp)(3//函数条用的准备过程0x08048f75<+2O>:0callx8048fab<strings_not_equal>0x08048f7a<+25>:test%eax,%eax//与这一行比较用户输入和$0x804a15c中的值Ox08048f7c<+27>:je0x8048f83<phase_l+34>Ox08048f7e<+29>:Scalix80490d1<explode_bomb>Ox08048f83<+34>:01eave0x08048f84<+35>:0ret通过度析代码可知:phase_1的密码是固定储存在$0x804al5c中的。令$0x804al5c中的数据与用户输入的数据比较,若相同则跳过exp1ode_bomb,避开炸弹。用命令x/s0x804al5c查看其中的数据如下:(gdb)x/s0x864al5cOx804al5c:MWehavetostandwithourNorthKoreanallies,(gdb)输入WehavetostandwithourNorthKoreanaliies.结果为:(gdb)rStartingprogram:/home/szm/LAB3/bombWelcometomyfiendishlittlebomb.Youhave6phaseswithwhichtoblowyourselfup.Haveaniceday!WehavetostandwithourNorthKoreanallies.Phase1defused.Howaboutthenextone?

结果对的。<phase_2>反汇编代码如下:Ox08048d6a<+O>:0push%ebp%%esp,%ebp%esp,%ebp0x08048d6b<+l>:0mov0x08048d6d<+3>:0push%esiOx08048d6e<+4>:(3push%ebx%esp,%ebp0x08048d72<+8>:lea-0x20(%ebp),%eax0x08048d75<+ll>:mov%eax,0x4(%esp)0x08048d79<+15>:mov0x8(%ebp),%eax0x08048d7c<+18>:mov%eax,(%esp)0x08048d7f<+21>:0call0x80491Ob<read_six_numbers>读取六个数字0x08048d84<+26>:cmpl$OxO,-Ox20(%ebp)0和第一个数字比较,不相等则爆炸。0x08048d88<+30>:jne0x8048d90<phase_2+38>0x08048d8a<+32>:0cmpI$0xl,-0xlc(%ebp)1和第二个数字比较,相等则跳过爆炸。0x08048d8e<+36>:je0x08048d90<+38>:call0x08048d8e<+36>:je0x08048d90<+38>:call0x80490dl<explode_bomb>0x08048d95<+43>:lea-0xl8(%ebp),%ebxebx指向第三个数字。esi指向第六个数字再向后移Ox08048d98<+46>:lea-0x8(%ebp),%esiesi指向第六个数字再向后移Ox08048d9b<+49>:movOx08048d9b<+49>:mov0x08048d9e<+52>:add-0x8(%ebx),%eaxeax再加上ebx向前第二位的数字。

比较ebx前两位的和与ebx0x08048da1<+55>:@cmp%eax,(%比较ebx前两位的和与ebx0x8048daa<phase_2+64>相等则跳过爆炸(exp10x80490d1<explode_bomb>0x8048daa<phase_2+64>相等则跳过爆炸(exp10x80490d1<explode_bomb>0x08048da5<+59>:Hcal10x08048daa<+64>:0add$0x4,%ebxebx地址向后移动一位(四个字节)。0x08048dad<+67>:cmp%esi,%ebx假如尚未超过第六位数字,则跳转0x8048d9行。0x08048daf<+690x08048daf<+69>:jne0x08048dbl<+71>:add0x08048db4<+74>:pop0x08048db5<+75>:pop0x08048db6<+76>:pop0x08048db7<+77>:ret0x8048d9b<phase_2+49>$0x30,%esp%esi%ebpphase_2的密码需要输入六位数字,并且第一个是0,第二个是1燃后执行到Ox8048d9b这一行代码发现往下运营会出现一个循环,两条重要指令是imull-0x4(%esi,%edx,4),%eax和cmp%eax,(%esi,%edx,4),其中%eax和%6(^(在每次循环中加1直到寄存器中值超过6,程序执行完毕。在循环中执行的是一个数等于前两个数之和,寄存器ebx每次循环将向前第一位的数字赋给寄存器eax。从而实现了计算前6位的斐波那契数列的值为:011235o执行结果如下:Phase1defused.Howaboutthenextone?011235That'snumber2.Keepgoing!<phase_3>反汇编代码如下:0x08048eal<+0>:pus%ebp0x08048ea2<+l>:mov%esp,%ebp0x08048ea4<+3>:0sub$0x28,%espOx08048ea7<+6>:Iea-Ox10(%ebp),%eax0x08048eaa<+9>:0mov0x08048eae<+13>:1ea—0xc(%ebp),%eax0x08048eb1<+16>:mov%eax,0x8(%esp)此处为第一个数字。0x08048eb5<+20>:movl$0x804a23e,0x4(%esp)用x/sOx804a23e命令查#$Ox804a23e为0x08048ebd<+28>:mov0x8(%ebp)eax%d%d,即要输入两个整0x08048eaa<+9>:0mov0x08048eae<+13>:1ea—0xc(%ebp),%eax0x08048eb1<+16>:mov%eax,0x8(%esp)此处为第一个数字。0x08048eb5<+20>:movl$0x804a23e,0x4(%esp)用x/sOx804a23e命令查#$Ox804a23e为0x08048ebd<+28>:mov0x8(%ebp)eax%d%d,即要输入两个整数,上面已经指出。0x08048ec0<+31>:0mov%eax,(%esp)0x08048ec3<+34>:回cal0x8048840<_isoc99_sscanf@plt>0x08048ec8<+39>:cmp$0x1,%eax以上两行即规定输入至少两组数据,否则引爆。0x08048ecb<+42>:jg0x8048ed2<phase_3+49>0x08048ecd<+44>:cal10x80490dl<explode_bomb>0x08048ed2<+49>:cmplS0x7,-Oxc(%ebp)第一个数大于7引爆,即%eax,0xc(%esp)此处为第二个数字。0x08048ed6<+53>:0x08048ed8<+55>:mov-0xc(%ebp),%eax第一个数小于等于0x08048ed6<+53>:0x08048ed8<+55>:mov-0xc(%ebp),%eaxOx8048f43<phase_3+162>0x08048edb<+58>:jmp*0x804ala0(,%eax,4)跳转至0x804ala0+eax*4(第一个数)内数据所0x08048edb<+58>:jmpOx08048ee2<+65>:0mov$0xO,%eax指的行数。0x08048ee7<+70>:0jmp0x8048f3c<phase_3+l55>$OxO,%eax0x08048ee9<+72>:mov%ax,%ax$OxO,%eax%ax,%ax%ax,%ax0x08048eee<+77>:0xchg%ax,%ax0x08048ef0<+79>:jmpOx8048f37<phase_3+150>0x08048ef2<+81>:0mov$0x0,%eax0x08048ef7<+86>:0jmp0x8048f32<phase_3+145>0x08048ef9<+88>:0mov$0x0,%eaxOx08048efe<+93>:%ax,%ax0x08048f00<+95>:jmp0x8048f2d<phase_3+140>$0x0,%$0x0,%eaxOx08048f07<+102>:jmp0x8048f28<phase_3+135>Ox08048f07<+102>:jmp0x08048f09<+104>:$0x0,%eax0xO8048fOe<+109>:xchg%ax,%ax0x08048f10<+lll>:jmp0x8048f23<phase_3+130>0x08048f12<+113>:mov$0x314,%eax当第一个数为0时跳转到此处,第二个数x=788。0x08048fl7<+118>:jmp0x8048fle<phase_3+125>跳转到0x8048fleo0x08048f19<4-120>:mov$0x0»%eax0x08048fle<+125>:sub$0x35a,%eaxx=x-8580x08048f23<+l30>:add$0x2ef>%eaxx=x+7510x08048f28<+135>:su$0x216,%eaxx=x-5340x08048f2d<+140>:add$0x216,%eaxx=x+5340x08048f32<+l45>:sub$0x216,%eaxx=x-5340x08048f37<+150>:add$0x216,%eaxx=x+5340x08048f3c<+155>:sub$0x216,%eaxx=x-5340x08048f41<+160>:jmp0x8048f4d<phase_3+172>跳转到0x8048f4d行。0x08048f43<+l62>:call0x80490dl<explode_bomb>0x08048f48<+167>:mov$0x0,%eax0x08048f4d<+172>:cmpl$0x5,-Oxc(%ebp)第一个数大于5引爆,即第一个数小于等于5。0X08048f51<+176>:jg0x8048f

温馨提示

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

评论

0/150

提交评论