
《深入理解计算机系统》3.38题解——缓冲区溢出攻击实例
1. 问题描述
在这个问题中,你要着手对你自己的程序进行缓冲区溢出攻击。前面我们说过,我们不能原谅用这种或其他形式的攻击来获得对系统的未被授权的访问,但是通过这个联系,你会学到许多关于机器级编程的知识。缓冲区溢出攻击
从CS:APP的网站上下载文件bufbomb.c,编译它创建一个可执行文件。在bufbomb.c中,你会发现下面的函数。
函数getxs(也在bufbomb.c中)类似于库函数gets,除了它是以十六进制数字对的编码方式读入字符的以外。缓冲区溢出攻击比如说,要给它一个字符串"0123",用户应该输入字符串“30 31 32 33”。这个函数会忽略空格字符。回忆一下,十进制数字x的ASCII表示为0x3x。
这个程序的典型执行是这样的:
看看getbuf函数的代码,看上去似乎很明显,无论何时被调用,它都会返回值1。看上去就好像调用getxs没有产生效果一样。你的任务是,只简单地对提示符输入一个适当的十六进制字符串,就使getbuf对test返回-559038737(0xdeadbeef)。
下面这些建议可能会帮助你解决这个问题:

要记住,你的攻击是非常依赖于机器和编译器的。当运行在不同的机器上或使用不同版本gcc时,可能需要改变你的字符串。
用objdump创建bufbomb的一个反汇编版本。仔细研究,确定getbuf的栈帧是如何组织的,以及溢出的缓冲区会如何改变保存的程序状态。
在gdb下运行你的程序。在getbuf中设置一个断点,并运行到该断点。确定像%ebp的值这样的参数,以及已保存的当缓冲区溢出时会被覆盖的所有状态的值。
手工确定指令序列的字节编码是很枯燥的,而且容易出错。可以用工具来完成这个工作,写一个汇编代码文件,包含想要放入栈中的指令和数据。用gcc汇编这个文件,再用objdump反汇编它,就可以获得要在提示符处输入的字节序列了。当objdump试图反汇编你文件中的数据时,它会产生一些看上去非常奇怪的指令,但是十六进制字节序列应该是正确的。
笔者注:
bufbomb.c文件下载地址
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-35224-1.html
无非就是电视剧播完了
你这不是富起来了么
皇城脚下岂容他人放肆
但目前服役的可能达不到这个数字