CSAPP缓冲区溢出攻击实验(上)
下载实验工具,最新的讲义在这。网上能找到的实验材料有些旧了,有的地方跟最新的handout对不上。不过没有关系,大体上只是程序名(sendstring)或者参数名(bufbomb -t)的差异,不影响我们的实验。
1.实验工具
1.1 makecookie
后面实验中,五次“攻击”中有四次都是使你的cookie出现在它原本不存在的位置,所以我们首先要为自己产生一个cookie。实验工具中的makecookie就是生成cookie用的,参数是你的名字:
[root@vm bufbomb]$ file makecookie
makecookie: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), \for GNU/Linux 2.6.9, not stripped
[root@vm bufbomb]$ chmod +x makecookie
[root@vm bufbomb]$ ./makecookie cdai
0x5e5ee04e
1.2 bufbomb
bufbomb就是我们要“攻击”的程序,我下载的实验工具的这个版本在执行时必须有-t这个参数,表示本人的名字:
[root@vm bufbomb]$ ./bufbomb
You must include a team name with -t
Usage: ./bufbomb -t team [-n] [-s] [-h]
-t team: Specify team name
-n : Nitro mode
-s : Submit solution via email
-h : Print help information
[root@vm bufbomb]$ ./bufbomb -t cdai
Team: cdai
Cookie: 0x5e5ee04e
Type string:I love 15-213
Dud: getbuf returned 0x1
Better luck next time
[root@vm bufbomb]$ ./bufbomb -t cdai
Team: cdai
Cookie: 0x5e5ee04e
Type string:It is easier to love this class when you are a TA
Ouch!: You caused a segmentation fault!
Better luck next time
1.3 sendstring
sendstring小工具(新版叫做hex2raw)能读入我们的制作的string(十六进制),将其发送到bufbomb的标准输入流,避免每次都要在终端上手动输入。cat管道或者直接重定向两种方式都行:
[root@vm bufbomb]$ cat exploit.raw | ./sendstring | ./bufbomb -t cdai
[root@vm bufbomb]$ ./sendstring < cat exploit.raw | ./bufbomb -t cdai
2.热身准备
2.1 “漏洞”代码
下面这一段看似“无辜”的小函数就是产生安全漏洞的源头了,而最根源的root cause就是Gets()函数没有考虑buf缓冲区的大小,直接将用户输入的所有字符都保存进去。如果用户输入过多的字符,就会导致栈上某些数据被覆盖,从而造成了缓冲区溢出的危险:
int getbuf()
{
char buf[12];
Gets(buf);
return 1;
}
2.2 缓冲区栈分析
在开始真正“攻击”之前,我们先要分析一下bufbomb调用getbuf()时的栈是什么样子的。只有全面的了解了栈结构,后面实验时我们才能随心所欲地“攻击”它。首先,通过objdump反汇编getbuf()函数:
[root@vm bufbomb]$ objdump -S -d -z bufbomb | grep -A15 "<getbuf>:"
08048ad0 <getbuf>:
8048ad0: 55 push %ebp
8048ad1: 89 e5 mov %esp,%ebp
8048ad3: