当前位置: 首页 > news >正文

动态网站技术采用什么架构/中国时事新闻网

动态网站技术采用什么架构,中国时事新闻网,动漫网站建设前期策划,如何让百度搜到自己的网站转载自:https://wdxtub.com/2016/04/16/thin-csapp-2/缓冲区溢出这一节是机器代码的最后一部分,主要说说由缓冲区溢出引起的攻防大战。我们先来看看程序在内存中是如何组织的(x86-64 Linux):最上面是运行时栈,有 8MB 的大小限制,一…

转载自:https://wdxtub.com/2016/04/16/thin-csapp-2/

缓冲区溢出

这一节是机器代码的最后一部分,主要说说由缓冲区溢出引起的攻防大战。我们先来看看程序在内存中是如何组织的(x86-64 Linux):

005d98a2b06b9b065d16cb749914880e.png

最上面是运行时栈,有 8MB 的大小限制,一般用来保存局部变量。然后是堆,动态的内存分配会在这里处理,例如malloc(),calloc(),new()等。

然后是数据,指的是静态分配的数据,比如说全局变量,静态变量,常量字符串。最后是共享库等可执行的机器指令,这一部分是只读的。

可以见到,栈在最上面,也就是说,栈再往上就是另一个程序的内存范围了,这种时候我们就可以通过这种方式修改内存的其他部分了。

举个例子:

typedef struct{int a[2];doubled;

} struct_t;double fun(inti)

{volatilestruct_t s;

s.d= 3.14;

s.a[i]= 1073741824; //可能会越界

returns.d;

}

不同的 i 可能的执行结果是:

fun(0)-> 3.14

fun(1)-> 3.14

fun(2)-> 3.1399998664856

fun(3)-> 2.00000061035156

fun(4)-> 3.14

fun(6)-> Segmentation fault

之所以会产生这种错误,是因为访问内存的时候跨过了数组本身的界限从而修改了 d 的值。(结构体中a比d先定义,所以d在内存中被分配在a[2]后面的相邻位置)

数组元素可以使用指针来访问,所以对数组的引用没有边界约束。

你没看错,这是个大问题!如果不检查输入字符串的长度,就很容易出现这种问题,尤其是针对在栈上有界限的字符数组。

在 Unix 中,gets()函数的实现是这样的:

//从 stdin 中获取输入

char *gets(char *dest)

{int c =getchar();char *p =dest;while (c != EOF && c != '\n')

{*p++ =c;

c=getchar();

}*p = '\0';returndest;

}

可以看到并没有去检测最多能读入多少字符(于是很容易出问题),类似的情况还在strcpy,strcat,scanf,fscanf,sscanf中出现。比如说

voidecho() {char buf[4]; //太小

gets(buf);

puts(buf);

}voidcall_echo() {

echo();

}

我们来测试一下这个函数,可能的结果是:

unix> ./echodemo

Input:012345678901234567890123Output:012345678901234567890123unix> ./echodemo

Input:0123456789012345678901234Segmentation Fault

为什么明明在echo()中声明buf为 4 个 char,居然一开始输入这么多都没问题?我们到汇编代码里去看看:

00000000004006cf:

4006cf: 48 83 ec 18 sub$0x18, %rsp

4006d3: 48 89 e7 mov%rsp, %rdi

4006d6: e8 a5 ff ff ff callq 400680

4006db: 48 89 e7 mov%rsp, %rdi

4006de: e8 3d fe ff ff callq 400520

4006e3: 48 83 c4 18 add$0x18, %rsp

4006e7: c3 retq

# call_echo 部分

4006e8: 48 83 ec 08 sub$0x8, %rsp

4006ec: b8 00 00 00 00 mov$0x0, %eax

4006f1: e8 d9 ff ff ff callq 4006cf

4006f6: 48 83 c4 08 add$0x8, %rsp

4006fa: c3 retq

我们看4006cf这一行,可以发现实际上给 %rsp 分配了 0x18 的空间,所以可以容纳不止 4 个 char。

在调用gets函数之前(第4006d6行),内存中栈帧示意图为:

38c3d4aef4483abe5ed92f1079519187.png

结合上面代码可以看到,call_echo栈帧中保存着调用之前执行指令的地址4006f6,用于返回之后继续执行。

我们输入字符串01234567890123456789012之后,栈帧中缓冲区被填充,如下:

6d97f417eac00e4d6269f4bdbd53c59d.png

虽然缓冲区溢出了,但是并没有损害当前的状态,程序还是可以继续运行(也就是没有出现段错误),

但是如果再多一点的话,也就是输入0123456789012345678901234,内存中的情况是这样的:

488804ef8a654f0145e2f0d679d3a22b.png

就把返回地址给覆盖掉了,当echo执行完成要回到call_echo函数时,就跳转到0x400034这个内容未知的地址中了。

也就是说,通过缓冲区溢出,我们可以在程序返回时跳转到任何我们想要跳转到的地方!攻击者可以利用这种方式来执行恶意代码!

http://www.lbrq.cn/news/2264941.html

相关文章:

  • 成都企业网站维护/关键词排名优化易下拉技术
  • 做网站一年赚多少钱/网络舆情分析报告范文
  • 漯河网上商城网站建设/跨境电商培训
  • 天河外贸网站建设/公司网站建站要多少钱
  • 济南做企业网站的公司/网络优化行业的发展前景
  • 临沂网站建设昂牛网络/万网域名管理平台
  • 做视频网站违法吗/网址最新连接查询
  • 仙桃做网站/如何让网站快速收录
  • 建设用地规划许可证在哪个官方网站可以查询/路由优化大师
  • 做网站有限公司/爱站网权重查询
  • 网站 seo优化/百度网址浏览大全
  • 深圳网站建设哪家口碑好/全国人大常委会委员长
  • 学it一年的学费大概是多少/温州云优化seo
  • 免费行情网站app页面/百度网站推广关键词怎么查
  • 个人做的小网站需要备案/百度云app
  • wordpress批导入csv/新区快速seo排名
  • 网站推广互联网推广/网站排名优化培训哪家好
  • 国外网站推广平台有哪些公司/百度客服电话24小时客服电话
  • 最大的做网站公司/网络营销公司名字
  • 电子商务网站毕业论文/网址大全下载
  • wordpress functions.php在哪里/百度关键词优化技巧
  • 东莞著名网站建设企业/开发一个网站需要哪些技术
  • 杨凌做网站/百度一下你就知道下载安装
  • 俄罗斯网站建设/seo学徒招聘
  • 做网站好的公司/百度搜索引擎的优缺点
  • 柳州哪家公司做网站好/互联网营销软件
  • 网站建站好处/永久免费的培训学校管理软件
  • 网站建设怎么打开/最近三天的新闻大事
  • 网站开发软件网站开发/代写文章兼职
  • 网站开发工期安排/网盘资源共享群吧
  • 2025年Java最新社招面试八股文+技术场景题(金九银十)
  • AiPy+豆包:数据分析可视化,一键生成GUI工具
  • 使用LNMP一键安装包安装PHP、Nginx、Redis、Swoole、OPcache
  • 板凳-------Mysql cookbook学习 (十一--------11)
  • Java项目:基于SSM框架实现的高校毕业选题管理系统【ssm+B/S架构+源码+数据库+毕业论文】
  • 技能升级--二分例题