-------
介绍
-------
你们好,又和大家见面了,这次我要让你知道什么是真正的缓冲器溢出和如何利用缓冲器溢出的脆弱性来编译一些程序,
缓冲器溢出指南
。这文章含有C语言程序的源代码,因此,如果你不会C语言的话,你将会感觉到很吃力,并且,你也要对汇编有一定的了解,知道如何使用gdb。我将试着以最简单语言表达出来,但是对于这篇文章,并不是写给那些一无所知的人来看的.也不是读一遍就可以明白的.所以你要花一些时间去阅读,而且我花了更多的时间把它写出来.:)
这里面一些要注意的是,像所有的人一样喜欢一边做一边学,所以在几星期前我对自己说:"嗨,什么是heck(所雇于人而工作无趣的文人),为什么不开始读一些关于缓冲器溢出的文章,我知道很多事情我们都在做着,但只是很肤浅地做着。"所以我就开始学习,然而现在我就试着把我所学的东西送给每一个对于缓冲器溢出感兴趣的人。这文章不能让你学到所有的东西,只不过是一个初步的认识。就像题目所写的一样---引言。(在结束时,我将送你们一些让你们兴奋的东西。)
---------
Exploit?
---------
几乎所有人都知道什么叫Exploit。但是你仍然会明白每当一个人第一次到安全地方时,大概他不会
有任何的顾虑,这就是我写这篇文章的原因之一。
对于一些不明确的程序开发,我们通常会用C语言,在这开发得到的一些程序可能其它地方也有。这
些程序能让你随心所欲地运行,并为你做一些以前你在正常系统里不能做的事情。
现在最多的开发,就是我们所说的缓冲器溢出的开发。你说什么?不要急!毕竟,这还是文章的题目。
另外的方面就是你应该知道每一个人都要会怎么用它(你会怎样想象网站受到最大程度的毁坏?)有人曾
到一些程序开发的网站,如Security focus,Packetstorm或Fyodor,下载并运行程序,结果得到的是
非法操作。但是,为什么不是每个人都写开发程序?问题在于一些人不懂得怎么样去发现原代码的某些弱
点,甚至他们根本没有能力去写。所以现在你肯定有这样的一个想法,到底什么才叫一个开拓,让我们来
到缓冲器溢出的开头部分。
--------------------
缓冲器溢出到底是什么?
--------------------
正如我前面所说的最多的Exploit,都是有关于缓冲器溢出的开发。
你大概会在想:"哎…这家伙又在胡说一通,还是没有说到底什么是缓冲器溢出。"
那么我就开始说有关它的事情了。
缓冲器溢出的问题,是基于程序在内存中的数据存放的地址。你会问道:这又是为什
么呢?因为缓冲器溢出而重写的内存地址,那些地方就会有我们想要的东西,你就可以
做一些程序去得到你想要的东西了。
那你就会想:"哈,我已经知道缓冲器溢出是怎样工作的了。"但你仍然不懂得怎样
去发现它们。让我们根据一个程序试着去发现和调整缓冲器溢出。
----------以下是部分代码------------
main(int argc, char **argv) {
char *somevar;
char *important;
somevar = (char *)malloc(sizeof(char)*4);
important = (char *)malloc(sizeof(char)*14);
strcpy(important, "command"); /*这是一个重要的变量*/
stcrpy(somevar, argv[1]);
…….一些代码……
}
…另外一些函数…
------------代码结束------------
让我们讲讲一些系统指令喜欢用的重要变量,比如“chmod o-r file”,由于文件是属于
根用户的,程序也是由根用户运行的,这就是说你能够运行一些命令,也可以执行任何的系统命令,
电脑资料
《缓冲器溢出指南》(http://meiwen.anslib.com)。那你就会想,我怎样才能够在重要的变量里得到一些我想要的东西。办法就是从内存的溢出中找
到它。但是要看内存变量的地址,那你就要重写代码了。看看下面的代码。
----------部分代码----------------
main (int argc, char **argv) {
char *somevar;
char *important;
somevar=(char *)malloc(sizeof(char)*4);
important=(char *)malloc(sizeof(char)*14);
printf("%p\n%p", somevar, important);
exit(0);
rest of code here
}
---------------部分代码结束--------------------
让我们在原代码中加两行,但又要让它没有任何的变动。让我们看一下那两行到底是干什么的。
printf("%p\n%p", somevar, important);
这一行是给somevar和important变量显示内存地址。
exit(0);
这一行只是当你不要任何东西时让程序暂时停顿,而你的目的是想知道变量到底贮存
在哪个地方。在程序运行完后,结果如下。一般情况下内存地址是不一样的:
0x8049700 <----- 这就是somevar的地址
0x8049710 <----- 这就是important的地址
正如我们所看到的,important变量是在somevar变量的后面,这就可以让我们使用缓冲器
溢出的技巧,从argv[1]得到somevar变量。现在,我们就可以知道下一步要干什么了,但是我
们还是要检查每一个内存地址,以至能够得到准确的贮存数据。要做到这一些,我们还要再一次
重写代码。
-------------部分代码----------------------
main(int argc, char **argv) {
char *somevar;
char *important;
char *temp; /* 这需要另一个变量*/
somevar=(char *)malloc(sizeof(char)*4);
important=(char *)malloc(sizeof(char)*14);
strcpy(important, "command"); /*这个是important变量*/
stcrpy(str, argv[1]);
printf("%p\n%p\n", somevar, important);
printf("Starting To Print memory address:\n");
temp = somevar; /* 这将会把temp放在内存的首个地址*/
while(temp < important + 14) {
/*当到达最后的important变量的内存地址时,这个循环就会给退出*/
printf("%p: %c (0x%x)\n", temp, *temp, *(unsigned int*)temp);
temp++;
}
exit(0);
程序就在这里停顿了
}
------ 部分代码结束-----
[1] [2] 下一页