04 2015 档案
摘要:内存的不同用途
根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行。但是不管什么样的操作系统、什么样的计算机架构,进程使用的内存都可以按照功能大致分为以下4个部分:
(1)代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行。
(2)数据区:用于存储全局变量等。
(3)堆区:进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区。动态分配和回收是堆区的特点。
(4)栈区:用于动态地存储函数之间的关系,以保证被调用函数在返回时恢复到母函数中继续执行。
在Windows平台下,高级语言写出的程序经过编译链接,最终会变成PE文件。当PE文件被装载运行后,就成了所谓的进程。
阅读全文
摘要:我们接着上面的栈溢出原理来进行讲解栈溢出的利用,首先我们不会接着上一篇的文章的例子来进行讲解,我会再写一个C语言的例子来进行讲解。再进行讲一遍栈溢出的原理。更加熟悉栈溢出的原理能够让我们更好地利用栈溢出。
下面的例子代码如下:(代码很简单我不做解释)
阅读全文
摘要:什么是栈?
栈是一种机制,计算机用它来将参数传递给函数,也可以用于放入局部函数变量,函数返回地址,它的目的是赋予程序一个方便的途径来访问特定函数的局部数据,并从函数调用者那边传递信息。栈的作用如同一个缓冲区,保存着函数所需的所有信息。在函数的开始时候产生栈,并在函数的结束时候释放它。栈一般是静态的,也意味着一旦在函数的开始创建一个栈,那么栈就是不可以改变的。栈所有保存的数据是可以改变的,但是栈的本身一般是不可以改变的。
缓冲溢出分为两种,一种是栈溢出,一种是堆溢出。
如何找到栈?
EIP:扩展指令指针。在调用函数时,这个指针被存储在栈中,用于后面的使用。在函数返回时,这个被存储的地址被用于决定下一个将被执行的指令的地址。
ESP:扩展栈指针。这个寄存器指向栈的当前位置,并允许通过使用push和pop操纵或者直接的指针操作来对栈中的内容进行添加和移除。
EBP:扩展基指针。这个寄存器在函数的执行过程中通常是保持不变的。它作为一个静态指针使用,用于只想基本栈的信息,例如,使用了偏移量的函数的数据和变量。这个指针通常指向函数使用栈底部。
阅读全文

浙公网安备 33010602011771号