美文网首页
Buffer Bomb 文档中文翻译

Buffer Bomb 文档中文翻译

作者: 苺一語 | 来源:发表于2019-05-16 08:43 被阅读0次

15-213,20xx年秋季
实验任务 L3:The Buffer Bomb
分配日期:XXX,截止日期:XXX
最迟提交时间:XXX

Harry Bovik (bovik@cs.cmu.edu)是此次试验的领头人。

介绍

本次试验将会帮助你深入理解 IA-32 的调用习惯与堆栈组织。它包含了一系列的对于可执行文件 bufbomb 的缓冲区溢出攻击

注意:在此次试验中,我们介绍一种广泛使用的,利用操作系统和网络服务器安全漏洞的方法,而你将获取关于它的第一手的经验。我们的目的是帮助你学习程序的运行时操作,以及这种安全漏洞的本质,这样你在编写系统代码的时候就可以避免这种漏洞。然而我们绝不容许运用这种手段,或其他任何手段在未经授权的情况下攻击系统以获取系统资源的访问权限。而且有相应的法律条文来对这种行为进行规制。

组织工作

和平常一样,个人项目。
我们使用 gcc 的 -m32 标志来生成本次实验,所以编译器产生的代码都遵循 IA-32 规则,即便是在 x86-64 的主机上。所以你应该明白,编译器可以使用任何其想使用的调用规则,只要是兼容的。

下发文件说明

在浏览器中转向此网址来获得你的 buffer bomb:
obtain your buffer bomb

译注:CMU内部使用,外网无法访问。

服务器将向浏览器返回一个 tar 文件:buflab-handout.tar 。要开始你的工作,先将其复制到一个(被保护的)文件夹中。然后键入命令 “tar xvf buflab-handout.tar” 。这将会创建一个名为 buflab-handout 的文件夹,其中包含以下三个可执行文件:

  • bufbomb:你将要攻击的 buffer bomb 程序。
  • makecookie:生成一个基于你用户ID的“饼干”。
  • hex2raw:用于转换不同字符串格式的小工具。

在下面的说明中,我们将假设你已经将这三个程序拷贝到了一个受保护的本地文件夹中,而且你将在那里执行它们。

用户ID与饼干

本实验的不同阶段将请求一个因人而异,略有不同的解决方案。正确答案将与你的用户ID相关。
饼干 是一个 8 位十六进制数码构成的字符串,根据你的用户ID生成,它(极有可能)是独一无二的。你可以通过 makecookie 程序,输入你的用户ID作为参数,来生成你的饼干。举个例子:

unix> ./makecookie bovik
0x1005b2b7

在你的五个缓冲区攻击实验中,有四个的目标都是使你的饼干出现在某个正常不会出现的位置。

BUFBOMB 程序

BUFBOMB 程序通过 getbuf 函数来从标准输入 stdin 读入一个字符串,函数定义如下:

1 /* Buffer size for getbuf */
2 #define NORMAL_BUFFER_SIZE 32
3
4 int getbuf()
5 {
6 char buf[NORMAL_BUFFER_SIZE];
7 Gets(buf);
8 return 1;
9 }

函数 Gets 与标准库中的函数 gets 十分相似——它从标准输入读入一个字符串(以 ‘\n’ 或 文件尾终止)并将其(连同一个空的终止符)存储在代码指定的特定位置,你可以看到,那个位置就是一个 buf 数组,容量是 32 个字符。

Gets (以及 gets)从输入流中抓取一个字符串,并将它存储至目的地址(在这里是 buf)。然而,Gets()并没有办法检测 buf 中是否有足够的空间来容纳整个输入。它所做的仅仅是复制整个输入字符串,所以有可能会超越目的地址申请的存储空间界限。
如果用户向 getbuf 输入的字符串长度不超过 31 个字符,显然 getbuf 将会返回 1,正如下面的执行示例:

unix> ./bufbomb -u bovik
Type string: I love 15-213.
Dud: getbuf returned 0x1

如果你输入更长的字符串,通常会发生错误:

unix> ./bufbomb -u bovik
Type string: It is easier to love this class when you are a TA.
Ouch!: You caused a segmentation fault!

译注:错误信息是:
“你引起了一个段错误!”

正如错误信息所示,缓冲区溢出通常会造成程序状态损坏(corrupted),导致内存访问出错。你的任务是对输入的字符串耍点小聪明,使得 BUFBOMB 表现出有趣的行为。这些被称为“攻击字符串“。

BUFBOMB 接受以下命令行参数:

\color{#34a853}{-u\quad userid:}为指定的用户ID操作 bomb,基于以下几点原因,你应当总是提供这一参数:

  • 有这个参数才能成功向评分服务器提交你的攻击。
  • 与 MAKECOOKIE 一样,BUFBOMB 基于你的用户ID来生成 cookie。
  • 我们在 BUFBOMB 中搭建了这样的特性,使得你所需要的关键栈地址是基于用户ID 的cookie 生成的。

\color{#34a853}{-h\quad :} 打印可用的命令行参数表。
\color{#34a853}{-n\quad :} 以 “Nitro” 模式操作,详见下文中的 Level 4。
\color{#34a853}{-s\quad :} 向评分服务器提交你作为解答的“攻击字符串”。

在这里,你应当回想一下 x86 的栈结构,找出哪些栈入口才是你的目标。你可能也想弄明白究竟为啥最后一个例子产生了段错误,这就不那么显而易见了。
你的“攻击字符串”所携带的字节信息往往并不是对应 ASCII 的字符值的。程序 HEX2RAW 可以帮助你生成“生字符串”。它接受一个 十六进制格式 的字符串。此格式下,每个字节值将以两个十六进制数字表示。例如,字符串“012345”可以以十六进制格式输入为“30 \;31 \;32 \;33 \;34 \;35”(记得吗?十进制数字 x 对应的 ASCII 码是 0x3x。)

你传入 HEX2RAW 的十六进制字符应当以空格分隔(空白或换行)。当你编辑“攻击字符串”时,我建议将不同的部分以换行隔开。HEX2RAW 也支持 C风格 的注释块,所以你可以为你的“攻击字符串”划分区域,比如:

bf 66 7b 32 78 /* mov $0x78327b66,%edi */

注意要在注释的开始和结束周围(/*,*/)留出空格,这样你的注释才会被忽略掉。

当你在 exploit.txt 文件中生成十六进制的“攻击字符串”后,你可以通过以下几种方式将其应用到 BUFBOMB:

  1. 你可以通过建立一系列管道来经由 HEX2RAW 传递字符串。
    unix> cat exploit.txt | ./hex2raw | ./bufbomb -u bovik

  2. 你可以将“生字符串”存入文件,并利用 I/O 重定向来将其应用到 BUFBOMB。
    unix> ./hex2raw < exploit.txt > exploit-raw.txt
    unix> ./bufbomb -u bovik < exploit-raw.txt

此方法也可在 GBD 内使用:
unix> gdb bufbomb
(gdb) run -u bovik < exploit-raw.txt

重要的点:

  • 你的“攻击字符串”不能在中间含有 0x0A 的值,因为这是 换行( \ n)的 ASCII 码。当 Gets 函数遇到这个字节时,它会觉得你想结束这个字符串的输入。
  • HEX2RAW 接受以空格分隔的两位十六进制数。所以如果你想以 0 填充一个字节,你应当用 00。创建字 0xDEADBEEF 时,你应当向 HEX2RAW 传入 EF BE AD DE。

当你正确地解决了关卡时,比如关卡0:

../hex2raw < smoke-bovik.txt | ../bufbomb -u bovik
Userid: bovik
Cookie: 0x1005b2b7
Type string:Smoke!: You called smoke()
VALID
NICE JOB!

然后你可以用 s 参数向评分服务器提交你的解答:

./hex2raw < smoke-bovik.txt | ./bufbomb -u bovik -s
Userid: bovik
Cookie: 0x1005b2b7
Type string:Smoke!: You called smoke()
VALID
Sent exploit string to server to be validated.
NICE JOB!

服务器会测试你的“攻击字符串”,确保它真的有用,并更新分数板,表明你已经解决了这一关卡。(为了匿名,用户ID以 cookie 展示)。你可以在以下网址查看分数板:
http://$Buflab::SERVER_NAME:18213/scoreboard

不同于 Bomb Lab,本次试验中你不会因为错误答案而得到罚分。你可以在 BUFBOMB 中用你喜欢的字符串随便攻击。当然,你也不应该用暴力法解这个实验,这会花费更长的时间。

重要提示:你可以在任意 Linux 机器上完成你的实验,但是提交时只能用以下机器:

此处的内容由导师插入。

\color{green}{Level\ 0: Candle\ (10\ pts)}

函数 getbuf 将在 BUFBOMB 中被函数 test 调用,test 的代码如下:

1 void test()
2 {
3 int val;
4 /* Put canary on stack to detect possible corruption */
5 volatile int local = uniqueval();
6
7 val = getbuf();
8
9 /* Check for corrupted stack */
10 if (local != uniqueval()) {
11 printf("Sabotaged!: the stack has been corrupted\n");
12 }
13 else if (val == cookie) {
14 printf("Boom!: getbuf returned 0x%x\n", val);
15 validate(3);
16 } else {
5
17 printf("Dud: getbuf returned 0x%x\n", val);
18 }
19 }

待续。

相关文章

网友评论

      本文标题:Buffer Bomb 文档中文翻译

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