中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
缓冲区溢出(二)
作者:未知 时间:2005-09-13 23:36 出处:Blog.ChinaUnix.net 责编:chinaitpower
              摘要:缓冲区溢出(二)

 今天有点郁闷,学校开学前例行的电路检查,从早上8点到下午3点停电。

开机,进入LINUX,打开我的BLOG,发现居然有人看过并评论之,心中窃喜,我可是第一次写这玩意儿呀:)  于是赶紧把昨天的“实验报告“写出来,可是我惊奇的发现,在MOZILLA下无法“写”字:( 没办法,在得到那个C程序的汇编码后只好切换了系统。

还是闲话少说,怨气少发,把昨天的结果弄出来(请点击阅读全文):

先是最简单一段代码

#include

void main()
{
  char buf[10];
  char *p;
  p = alloca(sizeof(buf));
  buf[9] = 'A';
  p[9] = 'a';
  return;
}

汇编码就不贴了,把它的栈分配情况贴出来:

这里为了简化,假设了外部环境调用时的esp的低四位是全0的。

当buf大小为1时,分配了8个内存单元,但实际buf地址是位于ebp-1,这时buf越界必定造成错误。

当buf大小为2时,分配情况同上,buf地址位于ebp-2处。

sizeof(buf) == 3,分配24个内存单元,buf地址位于ebp-24处,所以buf越界不一定是程序死掉。

从4到7,情况和3一样。

sizeof(buf) == 8,分配8个内存单元,刚好排满,。

从9到16,情况和3相同,

从17开始,分配40个内存单元,buf地址都是等于栈未对齐时esp.

.........

这里面的对应关系看起来似乎是8的倍数关系和取了某个数的模,但我还不知道是哪个数学表达式。

这和WINDOWS下用TCC做的16位汇编代码有很大区别,不用看它的汇编代码也能完全正确的画出栈的分配情况,和GCC相比要简单的多。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有