LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 990|回复: 3

制造缓冲区溢出的问题。

[复制链接]
发表于 2010-2-1 08:27:14 | 显示全部楼层 |阅读模式
一个程序在内存中通常分为程序段、数据段和堆栈三部分。程序段里放着程序的机器码和只读数据。数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。在内存中,它们的位置是:
(图一)
当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器(IP)中的内容作为返回地址(RET);第三个放入堆栈的是基址寄存器(FP);然后把当前的栈指针(SP)拷贝到FP,做为新的基地址;最后为本地变量留出一定空间,把SP减去适当的数值。以下面程序为例:

example2.c
void func1(char * input) {
char buffer[16];
strcpy(buffer, input);
}  
void main() {
  char longstring[256];
  int i;
  for( i = 0; i < 255; i++)
    longstring = 'B';
  func1(longstring);
}

      当调用函数func1()时,堆栈如下:
(图二)
  不用说,程序执行的结果是"Segmentation fault (core dumped)"或类似的出错信息。因为从buffer开始的256个字节都将被* input的内容'B'覆盖,包括sfp, ret,甚至*input。'B'的16进值为0x41,所以函数的返回地址变成了0x41414141,这超出了程序的地址空间,所以出现段错误。



我对这段话
“当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器(IP)中的内容作为返回地址(RET);第三个放入堆栈的是基址寄存器(FP);然后把当前的栈指针(SP)拷贝到FP,做为新的基地址;最后为本地变量留出一定空间,把SP减去适当的数值。”
和这段话
“因为从buffer开始的256个字节都将被* input的内容'B'覆盖,包括sfp, ret,甚至*input。'B'的16进值为0x41,所以函数的返回地址变成了0x41414141”

看不懂。求教,谢谢。。
下面第一副图是图一,第二副是图二。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2010-2-1 08:29:05 | 显示全部楼层
通俗点的解释行不?

貌似太多术语了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-2-1 20:35:58 | 显示全部楼层
看了几个小时,搞定啦。

指令寄存器:用来保存当前正在执行的一条指令。当执行一条指令时,先把它从内存取到数据寄存器(DR)中,然后
再传送至IR。指令划分为操作码和地址码字段,由二进制数字组成。为了执行任何给定的指令,必须对操作码进行测
试,以便识别所要求的操作。指令译码器就是做这项工作的。指令寄存器中操作码字段的输出就是指令译码器的输入。
操作码一经译码后,即可向操作控制器发出具体操作的特定信号。

基址寄存器:在访问内存时用于存放基地址。

基地址:在内存的地址。基址就是一个内存地址。以后程序数据的一般调用的地址就是 :  基地址+偏移量

堆栈:严格来讲并不存在堆栈这样一种结构,只是在日常工作中我们将前述的这种数据结构称为堆栈罢了,但其实确切的
说应该叫做栈 (Stack) 。而堆 (Heap) 其实是另一种允许随意访问的数据存储空间。

栈指针:专用于指出堆栈顶部数据的地址。

栈区(stack):由编译器自动分配和释放 ,存放函数的参数值、局部变量的值等,甚至函数的调用过程都是用栈来完
成。其操作方式类似于数据结构中的栈。

堆区(heap) :一般由程序员手动申请以及释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中
的堆是两回事,分配方式类似于链表。

函数的返回地址 :一般是紧邻函数调用语句的下一条语句的地址, 因为函数调用结束后程序要继续执行, 所以先把这个
地址压入堆栈, 等函数调用结束以后, 把这个地址从堆栈里面返回出来, 接着执行
回复 支持 反对

使用道具 举报

发表于 2010-2-20 14:28:29 | 显示全部楼层
你还缺乏理解一点东西.变量在堆栈的分布.
如 int a,b;这种形式的,a的地址是比b要高,自高往低分配.
但如果
struct
{
  int a;
  int b;
}

class XX
{
int a;
int b;
}
都是a地址低于b地址.
如int ar[10],却是ar地址小于ar[i+1],只要0 <= i <= 8;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表