前段时间发现一个有趣的代码:

 char str[1];strcpy(str, "wwwwwwwwwwwwwwwwwwwww"); printf("%s", str);getchar();

运行结果:

大家可以看到,我使用strcpy向一个长度为1的数组赋一个长度为21的字符,并且被赋值了,还被打印了出来!

那么下面来解释一下为什么会产生这样的原因!

在CPU看来内存是连续的,是一组线性的地址空间!

而C++编译器是不会检查越界问题的,这里我使用的是VSC++编译器(VS是根据后缀名调用不同的编译器)

strcpy属于标准C库代码,这个函数也不会去检查越界问题,这个函数会直接将内存中的值更改!

我们可以断点调试看一下内存:

首先先将数组的首地址打印出来:

printf("%p", str);

最后下断点

运行结果:

在选择VS自带的内存视窗

注意此选项只有在断点调试阶段才有效

将地址输入进去:

可以看到这个地址空间里有很多字节,有的字节是有数据的,这些数据可能是没有被初始化的随机数也可能是已经分配好了数据的字节,也有基于内存对齐而分配的地址空间,可以看到上面有很多数据为00的字节,这些都是基于内存对齐而分配的,刚刚的str数组并没有被初始化,但是它只占一个字节,所以可以确定第一个字节即使它的内存空间

注意此时断点在strcpy处,也就是说此时这个函数还没有被执行

我们按F10调试运行

走了一步此时在看地址空间:

可以看到strcpy把不属于str的地址空间给改掉了,上面说过内存中地址是连续的,strcpy把连在str后面的地址空间里的内存给改掉了!

由此可以知道strcpy函数的编写思路是将一个地址开始的空间修改,修改大小为数值大小,且不会去检查数值大小是否超出变量空间大小!

要知道,操作系统允许程序随意修改访问自己进程空间下的内存,那么有可能会造成,其他变量内存数据混乱的现象,如果你数值在给大一点儿超出进程下的空间大小,访问到其他进程里去了,那么操作系统会就给杀掉,因为在虚拟内存的保护模式下!

那么在来解释一下,为什么printf打印时会将其打印出来,printf也不会检查边界,它只看内存中\0,也就是说,它的编写思路是:从内存中的某个地址开始读取数据,直到遇到\0结尾!

我们数组默认也是有\0的就像上面的str[1],这个数组是无法赋值的,因为它只能存储一个\0!

我们来赋值试试

看,我们明明赋予了一个d的字节,却告诉我们,我们赋予了两个字节的数据,也就是说编译器默认的给我们增加了一个\0在后面!

所以我们定义字符数组变量时,即使给予了256个大小字节空间实际只能访问255个,因为最后一个用于结尾!

所以这也是为什么printf能打印出来的原因,我们来修改一下赋值,在中间一行加入\0试试:

运行结果:

可以看到printf在地址空间里不停的打印数据,直到遇到了\0

当我们在编程时很多IDE都会检查一些字符后面是否带有\0,一旦没有编译器可能会给你自动加上,也可能会报错,不然的话printf会把整个内存里的东西根据占位符的格式都给打印出来!

char *指针在分配时末尾的一个字节,也会隐式的被修改为\0

从上分析可以得出,strcpy和printf是不安全的所以微软公司推出了strcpy_s和printf_s函数,当然也有很多其他的函数,凡是微软测试出来认为不安全的函数都会被重写,其次微软默认是不允许我们使用这些不安全的函数的,需要增加一些宏开关才行!

这里我们将strcpy改成strcpy_s

在运行一下:

直接报中断,越界错误!

strcpy漏洞分析相关推荐

  1. 2022CTF培训(十一)IOT 相关 CVE 漏洞分析

    附件下载链接 D-Link DIR-823G 固件全系统仿真 2022CTF培训(十)IOT 相关 CVE 漏洞分析 是采用 qemu-user 对个别程序进行仿真,而对于完整的仿真需要使用 qemu ...

  2. kali+php+缓冲区溢出,CVE-2018-18708:Tenda路由器缓冲区溢出漏洞分析

    CVE-2018-18708:Tenda路由器缓冲区溢出漏洞分析 摘要:本文通过对一个ARM路由器缓冲区溢出漏洞的分析,实践逆向数据流跟踪的思路与方法. 假设读者:了解ARM指令集基础知识.了解栈溢出 ...

  3. linux 幽灵漏洞,CVE-2015-0235:Linux Glibc幽灵漏洞分析 V1.0

    CVE-2015-0235:Linux Glibc幽灵漏洞分析 V1.0 2015-01-28 12:06:44 阅读:0次 漏洞描述: glibc的__nss_hostname_digits_dot ...

  4. CVE-2017-11882漏洞分析报告

    漏洞简介: 软件名称及版本:Microsoft Office2016以下 漏洞模块:EQNEDT32.EXE 漏洞编号:CVE-2017-11882 危害等级:高危 漏洞类型:缓冲区溢出 威胁类型:远 ...

  5. 易想团购 注入 user.php,易想团购系统通杀SQL注入漏洞分析及利用漏洞预警 -电脑资料...

    刚打开红黑看到J8基友写的一个{易想团购系统 最新版 通杀}的文章,看他贴的代码里面有个get_client_ip()函数,哈哈,我猜没过滤,果断下了一套程序, 找到get_client_ip()函数 ...

  6. 公开仓库中Docker镜像的漏洞分析结果发布

    Federacy的一名研究人员发布了一项报告,该报告分析了公开仓库中Docker镜像的漏洞.24%的镜像发现了明显的漏洞,其中基于Ubuntu的镜像漏洞最多,而基于Debian的镜像漏洞最少. \\ ...

  7. 安全研究 | Jenkins 任意文件读取漏洞分析

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云鼎实验室 发表于云+社区专栏 一.漏洞背景 漏洞编号:CVE-2018-1999002 漏洞等级:高危 Jenkins 7 月 18 ...

  8. 漏洞分析技术专家聚会——博文视点OpenParty第二期

    漏洞分析技术专家聚会--博文视点OpenParty第二期 与传说中的牛人面对面,与畅销书作者共话家常,与技术专家共商新概念--     这不是天方夜谭!     2009年7月11日,好伦哥翠微店,博 ...

  9. Ruby on Rails路径穿越与任意文件读取漏洞分析(CVE-2019-5418)

    Ruby on Rails是一个 Web 应用程序框架,是一个相对较新的 Web 应用程序框架,构建在 Ruby 语言之上.它被宣传为现有企业框架的一个替代,而它的目标,就是让 Web 开发方面的生活 ...

最新文章

  1. 每日站立会议4-20(张硕)
  2. vivado SOC——hello word(上)建立SOC系统
  3. 读书笔记 effective c++ Item 18 使接口容易被正确使用,不容易被误用
  4. Boost:等待和通知操作的模糊测试
  5. 电话之父贝尔的传奇一生
  6. SAP Cloud for Customer Sales Order Requested Date的业务含义和实现
  7. Java基础知识回顾--线程
  8. 行向量,列向量,行主序矩阵,列主序矩阵
  9. Java加密与解密的艺术~数字证书~模型分析
  10. 微软:今年要让Office 2007寿终正寝
  11. Gradle DSL method not found: ‘compile()’
  12. Sicily 1934 移动小球
  13. 【JPA 级联保存/级联删除】@OneToMany (双向) 一对多【转】
  14. C++初学之 3. ASCII数值的应用(大小写变换)
  15. Design System 中的 Design Token
  16. bootstrap 图标和文字对齐
  17. Magento发布前检查清单
  18. 深入了解前端路由 hash 与 history 差异
  19. Cesium原理篇:5最长的一帧之影像
  20. 电脑文件丢失你都是怎么找回来的?

热门文章

  1. python解非线性方程_python解非线性方程的问题
  2. python中列表的排序方法_在python中对小列表进行排序的最快方法
  3. nc65 单据非向导开发 源代码_【免费毕设】ASP.NETIT产品网上物流管理信息系统的设计与实现(源代码+论文)...
  4. spring学习--AOP术语
  5. xml property标签注入一个类变量_Spring-06-依赖注入(DI)
  6. 小学生通用计算机在线使用,Win7电脑可以使用一起小学软件的方法
  7. 合成未来宝宝照片_父母照片重叠是宝宝长相?关晓彤鹿晗颜值逆天,邓超孙俪……...
  8. java optional 用法_理解、学习与使用Java中的Optional
  9. c语言链表成绩管理系统排序,【C项目】 文件,结构体,链表,排序, 学生信息管理系统...
  10. python写机器人插件_从Python写入机器人框架控制台