在阅读此篇文章时,请先确定已有一些计算机功底,其中包括计算机组成原理、寄存器功能、汇编语感。
正文开始:
实验环境:windows8.1,vs2010
相信不少人听说过缓冲区溢出攻击,这是当时黑客网络攻击很关键的一种攻击方式,直到现在很多黑客找到bug后进行的攻击行为还是基于它为原理,今天我给大家简单实验一下。
首先讲一下缓冲区溢出攻击如何实现,就要提到计算机底层调用函数的方式。当你运行你自己写好的程序时,系统会自动开一个线程并为你分配一段内存以供程序运行,其中一部分内存会用来作为线程的栈,而函数的调用离不开栈的运用。
先讲一些寄存器esp(栈指针寄存器)ebp(基址寄存器)eip(指令地址寄存器)eax(指令寄存器,可能还有其它功能)。
寄存器中都存放了一个32位的二进制数(如果是64位操作系统则是64位二进制数,不过用c或者汇编写的程序大多是三十二位的),这32位二进制数当然是一个地址,如果这个数是0x00000018(十六进制数)那么则该寄存器指向内存中第十八个字节(当然0x00000018这样的内存是不可能被普通程序员使用的,大多是0x007FEF87这样的内存)。
esp中存放的数据(三十二位二进制数)自然就是栈中的栈顶指针,比如栈的内存块是0x00000000~0x000000FF,而其中0x000000CC~0x000000FF(这些地址都是随便一写)有数据,则esp的地址就是0x000000CC-4=0x000000C8这个数,下一次压栈时,就会把0x000000C8~0x000000CB填满数据,栈顶指针再自减4,指向0x000000C4(栈的走向是从高地址走向低地址)。
ebp中存放的数据是用来基址寻址的基址(好别扭),也是一个地址,它的特点是一般会在局部变量和函数参数所存放地址的中间,意思就是ebp+0