^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
喜欢这些内容嘛,请告诉你身边的朋友,易下载中心-QQ资源-itnetcn.com一起享受这份乐趣,本站内容来源互联网
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
序言: Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
通过堆栈溢出来获得root权限是目前使用的相当普遍的一项黑客技术。事实上这是一个 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
黑客在系统本地已经拥有了一个基本账号后的首选攻击方式。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
他也被广泛应用于远程攻击。通过对daemon进程的堆栈溢出来实现远程获得rootshell Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
的技术,已经被很多实例实现。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
在windows系统中,同样存在着堆栈溢出的问题。而且,随着internet的普及,win系列 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
平台上的internet服务程序越来越多,低水平的win程序就成为你系统上的致命伤。因为 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
它们同样会被远程堆栈溢出,而且,由于win系统使用者和管理者普遍缺乏安全防范的意 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
识,一台win系统上的堆栈溢出,如果被恶意利用,将导致整个机器被敌人所控制。进而, Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
可能导致整个局域网落入敌人之手。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
本系列讲座将系统的介绍堆栈溢出的机制,原理,应用,以及防范的措施。希望通过我 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
的讲座,大家可以了解和掌握这项技术。而且,会自己去寻找堆栈溢出漏洞,以提高系 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
统安全。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
堆栈溢出系列讲座 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
入门篇 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
本讲的预备知识: Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
首先你应该了解intel汇编语言,熟悉寄存器的组成和功能。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
你必须有堆栈和存储分配方面的基础知识,有关这方面的计算机书籍很多,我 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
将只是简单阐述原理,着重在应用。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
其次,你应该了解linux,本讲中我们的例子将在linux上开发。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
1:首先复习一下基础知识。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
从物理上讲,堆栈是就是一段连续分配的内存空间。在一个程序中,会声明各种变量。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
静态全局变量是位于数据段并且在程序开始运行的时候被加载。而程序的动态的局部变量 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
则分配在堆栈里面。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
从操作上来讲,堆栈是一个先入后出的队列。他的生长方向与内存的生长方向正好相反。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
我们规定内存的生长方向为向上,则栈的生长方向为向下。压栈的操作push=ESP-4, Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
出栈的操作是pop=ESP+4.换句话说,堆栈中老的值,其内存地址,反而比新的值要大。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
请牢牢记住这一点,因为这是堆栈溢出的基本理论依据。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
在一次函数调用中,堆栈中将被依次压入:参数,返回地址,EBP。如果函数有局部变量, Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
接下来,就在堆栈中开辟相应的空间以构造变量。函数执行结束,这些局部变量的内容将 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
被丢失。但是不被清除。在函数返回的时候,弹出EBP,恢复堆栈到函数调用的地址,弹出 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
返回地址到EIP以继续执行程序。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
在C语言程序中,参数的压栈顺序是反向的。比如func(a,b,c)。在参数入栈的时候,是: Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
先压c,再压b,最后压a.在取参数的时候,由于栈的先入后出,先取栈顶的a,再取b,最后 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
取c。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
(PS:如果你看不懂上面这段概述,请你去看以看关于堆栈的书籍,一般的汇编语言书籍 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
都会详细的讨论堆栈,必须弄懂它,你才能进行下面的学习) Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
2:好了,继续,让我们来看一看什么是堆栈溢出。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
2.1:运行时的堆栈分配 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
堆栈溢出就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
数据越界。结果覆盖了老的堆栈数据。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
比如有下面一段程序: Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
程序一: Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
int main ( ) Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
{ Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
char name[8]; Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
printf("Please type your name: "); Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
gets(name); Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
printf("Hello, %s!", name); Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
return 0; Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
} Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
编译并且执行,我们输入ipxodi,就会输出Hello,ipxodi!。程序运行中,堆栈是怎么操作 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
的呢? Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
在main函数开始运行的时候,堆栈里面将被依次放入返回地址,EBP。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
我们用gcc -S 来获得汇编语言输出,可以看到main函数的开头部分对应如下语句: Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
pushl %ebp Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
movl %esp,%ebp Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
subl $8,%esp Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
首先他把EBP保存下来,,然后EBP等于现在的ESP,这样EBP就可以用来访问本函数的 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
局部变量。之后ESP减8,就是堆栈向上增长8个字节,用来存放name[]数组。现在堆栈 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
的布局如下: Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
内存底部 内存顶部 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
name EBP ret Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
<------ [][][] Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
^;name Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
栈顶部 堆栈底部 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
执行完gets(name)之后,堆栈如下: Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
内存底部 内存顶部 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
name EBP ret Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
<------ [ipxodi\0 ][][] Yez海岸线网络安全资讯站
堆栈溢出系列讲座(1)(转) Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
会员推荐 2006-1-23 转载注明:www.chinageren.com Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
^;name Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
栈顶部 堆栈底部 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
最后,main返回,弹出ret里的地址,赋值给EIP,CPU继续执行EIP所指向的指令。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
2.2:堆栈溢出 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
好,看起来一切顺利。我们再执行一次,输入ipxodiAAAAAAAAAAAAAAA,执行完gets Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
(name)之后,堆栈如下: Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
内存底部 内存顶部 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
name EBP ret Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
<------ [ipxodiAA][AAAA][AAAA]....... Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
^;name Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
栈顶部 堆栈底部 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
由于我们输入的name字符串太长,name数组容纳不下,只好向内存顶部继续写‘A’。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
由于堆栈的生长方向与内存的生长方向相反,这些‘A’覆盖了堆栈的老的元素。如图 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
我们可以发现,EBP,ret都已经被‘A’覆盖了。在main返回的时候,就会把‘ AAAA’ Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
的ASCII码:0x41414141作为返回地址,CPU会试图执行0x41414141处的指令,结果出现 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
错误。这就是一次堆栈溢出。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
3:如何利用堆栈溢出 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
我们已经制造了一次堆栈溢出。其原理可以概括为:由于字符串处理函数 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
(gets,strcpy等等)没有对数组越界加以监视和限制,我们利用字符数组写越界, Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
覆盖堆栈中的老元素的值,就可以修改返回地址。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
在上面的例子中,这导致CPU去访问一个不存在的指令,结果出错。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
事实上,当堆栈溢出的时候,我们已经完全的控制了这个程序下一步的动作。如果 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
我们用一个实际存在指令地址来覆盖这个返回地址,CPU就会转而执行我们的指令。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
在UINX系统中,我们的指令可以执行一个shell,这个shell将获得和被我们堆栈溢出 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
的程序相同的权限。如果这个程序是setuid的,那么我们就可以获得root shell。 Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
Yez海岸线网络安全资讯站
下一讲将叙述如何书写一个shell code。 Yez海岸线网络安全资讯站