《深入理解计算机系统》3.38题解——缓冲区溢出攻击实例

本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一@小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!

 

《深入理解计算机系统》3.38题解——缓冲区溢出攻击实例

 

1. 问题描述

 

在这个问题中,你要着手对你自己的程序进行缓冲区溢出攻击。前面我们说过,我们不能原谅用这种或其他形式的攻击来获得对系统的未被授权的访问,但是通过这个联系,你会学到许多关于机器级编程的知识。

 

CS:APP的网站上下载文件bufbomb.c,编译它创建一个可执行文件。在bufbomb.c中,你会发现下面的函数。

 

1    int getbuf()

2    {

3        char buf[12];

4        getxs(buf);

5        return 1;

6    }

7

8    void test()

9    {

10      int val;

11      printf("Type Hex string:");

12      val = getbuf();

13      printf("getbuf returned 0x%x/n", val);

14   }

 

函数getxs(也在bufbomb.c中)类似于库函数gets,除了它是以十六进制数字对的编码方式读入字符的以外。比如说,要给它一个字符串"0123",用户应该输入字符串“30 31 32 33”。这个函数会忽略空格字符。回忆一下,十进制数字xASCII表示为0x3x

 

这个程序的典型执行是这样的:

Unix>./bufbomb

Type Hex string: 30 31 32 33

getbuf returned 0x1

 

看看getbuf函数的代码,看上去似乎很明显,无论何时被调用,它都会返回值1。看上去就好像调用getxs没有产生效果一样。你的任务是,只简单地对提示符输入一个适当的十六进制字符串,就使getbuftest返回-5590387370xdeadbeef)。

 

下面这些建议可能会帮助你解决这个问题:

要记住,你的攻击是非常依赖于机器和编译器的。当运行在不同的机器上或使用不同版本gcc时,可能需要改变你的字符串。 

objdump 创建 bufbomb 的一个反汇编版本。仔细研究,确定 getbuf 的栈帧是如何组织的,以及溢出的缓冲区会如何改变保存的程序状态。 gdb 下运行你的程序。在 getbuf 中设置一个断点,并运行到该断点。确定像 %ebp 的值这样的参数,以及已保存的当缓冲区溢出时会被覆盖的所有状态的值。 手工确定指令序列的字节编码是很枯燥的,而且容易出错。可以用工具来完成这个工作,写一个汇编代码文件,包含想要放入栈中的指令和数据。用 gcc 汇编这个文件,再用 objdump 反汇编它,就可以获得要在提示符处输入的字节序列了。当 objdump 试图反汇编你文件中的数据时,它会产生一些看上去非常奇怪的指令,但是十六进制字节序列应该是正确的。

 

笔者注:

  • 题目摘自《深入理解计算机系统》(中文版)第200页。
  • bufbomb.c文件下载地址 http://csapp.cs.cmu.edu/public/ics/code/asm/bufbomb.c

 

你可能感兴趣的:(底层研究)