- 1、本文档共73页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
4内存安全讲解
2.2.3 解决方案 整数溢出是非常危险的,部分原因是因为它在发生后不可能被发现,也就是说,一个整数溢出发生了,应用程序并不知道它的计算是错误的。因此应用程序在假定它是正确的情况下,会继续运行下去。在安全的系统中,这种结果具有巨大的危害,有时甚至能够造成系统崩溃。 解决整数溢出的方案,主要是编程之前必须进行详细的预测,多考虑一些问题, 在编程时将各种问题考虑到并且进行相应的处理。如: 充分考虑各种数据的取值范围,使用合适的数据类型; 尽量不要在不同范围的数据类型之间进行赋值;等等。 2.3 数组和字符串问题 2.3.1 数组下标问题 数组下标问题,本质上也是属于缓冲区溢出问题。在本章的第一节,讲述的字符串缓冲区溢出,实际上字符串就是一个字符数组。除了字符数组,其它数组也会遇到类似的问题吗?答案是肯定的。本部分将以整数数组为例,来讲述数组下标引起的缓冲区溢出问题。 例子: P02_13.c #include stdio.h #include stdlib.h int Array[10]; void InsertInt(int index,int value) { Array[index]=value; printf(将值%d存入Array[%d]\n,index,value); } int main(int argc,char *argv[]) { int index=atoi(argv[1]); int value=atoi(argv[2]); InsertInt(index,value); return 0; } 当运行: 显示: 相当于在Array基址后偏移600个整数元素空间之后填入元素5,由于Array只定义大小为10,因此,数字5就被填到一个未知空间并将原来的值覆盖,如果适当地设计填入的地址和填入的数据,就可以进行攻击。 2.3.2 字符串格式化问题 字符串格式化不当,也可能造成漏洞,其攻击方法和缓冲区溢出类似。这类问题在printf系列的函数中较多出现,具有这种漏洞的函数有printf函数、sprintf函数等等。不过一般说来,这种漏洞可以很容易避免。 此种漏洞是怎样出现的呢?下面举一个例子。如:打印输出一个字符串,写如下的代码: 不会出现问题;如果写: 则会出现安全隐患,在不知不觉中打开了一个安全漏洞。 printf(%s, str); printf(str); 为什么该代码有问题?实际上,此时printf函数传入了一个想要逐字打印的字符串,但是该字符串被printf函数解释为一个格式化字符串。函数在其中寻找特殊的格式字符比如“%d”。如果碰到格式字符,一个变量的参数值就从堆栈中取出,并取代“%d”所在的位置。 很明显,攻击者可以通过打印出堆栈中的这些值来查看程序的内存,或是向运行中程序的内存里写入任意值! 看如下代码: #include stdio.h int main(int argc, char *argv[]) { printf(argv[1]); return 0; } 如果输入: 显示: 这没问题,但是如果输入: 屏幕上显示: 这是怎么回事呢?如前所述,函数碰到“%x”时,一个变量的参数值就从堆栈中取出,当然,我们现在也不知道取出的值有什么用。 这是怎么回事呢?如前所述,函数碰到%x时,一个变量的参数值就从堆栈中取出,当然,我们现在也不知道取出的值有什么用。 看代码P02_15.c #include stdio.h int main(int argc,char *argv[]) { int k=0; char buffer[28]=ABCDEFGHIJKLMNOPQRSTUVWXYZ; printf(%.20s%n\n,buffer,k); printf(k=%d,k); return 0; } 运行,打印: 此时,k的值原来是0,现在变成了20,这是因为printf(“%.20s%n\n”,buffer,k);在执行的过程中,输出了20个字符的宽度,这个数值20就被写到了k中。这样,只要前面输出数据的长度为一个精心设计的值,等于我们需要程序跳转到的那个地址,而%n恰到好处的将这一地址写入适当位置,那么我们就可以按照我们的意愿改变程序流程了。 小结 本章讲解了内存安全中的几个问题,主要针对缓冲区溢出问题、整数溢出问题、数组越界问题、字符串格式化等问题进行了讲解。实际上,内存安全问题远远不止这些,用户可
您可能关注的文档
- 4、火烧云(完美版)讲解.ppt
- 创新药物研发的路径解读.ppt
- 创新设计作业解读.ppt
- 创新职业指导:新实践解读.ppt
- 创新驱动发展战略(广西答案个人解答)解读.doc
- 4、综合楼模板施工组织设计讲解.doc
- 创新驱动发展战略公务员读本(94分附标准答案)解读.doc
- 创新驱动发展战略公务员读本96分解读.doc
- 创新驱动发展的形势判断与战略重点上篇(上)试卷解读.doc
- 创新驱动发展的形势判断与战略重点上篇(下)试卷解读.doc
- 2025机器人智能解決方案賦能表面精加工白皮书.docx
- 2025ABB AquaMaster4电磁流量计插入式传感器.docx
- 2025 ABB FlexPendant产品使用手册指南.docx
- 2025 ABB IRB 920产品手册指南.pdf
- 2025基于Web of Science和CNKI的可视化分析.docx
- 河北省唐山2025届一模政治试题及答案.docx
- 我的“开顶陶俑”--七年级生涯规划主题心理班会.docx
- 2025秋九上道德与法治第一课第二节《走向共同富裕》教学设计、教案、核心素养目标、教学反思.docx
- 香港工联会2025港岛历史文化深度游发展策略研究报告繁体版49页.pdf
- Navan2023年商务旅行和消费的新现实-当前差旅热点话题英文版14页.pdf
最近下载
- 申请英国签证在职证明中英文版.docx VIP
- L5 BladeEditor模块功能介绍.pdf VIP
- 工业建筑设计规范.docx VIP
- 《深入探讨教育公平问题》课件.ppt VIP
- 水闸工程管理设计规范(SL170-96).pdf VIP
- 上海市徐汇区2022-2023学年八年级下学期期末数学试题.docx VIP
- ISO 17637-2016 Non-destructive testing of welds – Visual testing of fusion-welded joints-en-中文版目视无损检测.pdf VIP
- 海底捞《新员工岗前培训手册》.pdf VIP
- 上海市徐汇区2024-2025学年下学期八年级期末考试数学试题(含部分答案).pdf VIP
- 化工园区安环一体化管理平台建设方案.ppt VIP
文档评论(0)