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

linux strcpy/strncpy/sprintf内存溢出问题

本文主要介绍strcpy/strncpy/sprintf都是不安全的,可能存在内存溢出的问题。下来进行实例分析。

strcpy代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>void test_func(char *str)
{bool flag = false;char buffer[5];memset(buffer, 0, 5);strcpy(buffer, str);if(strcmp("1234", buffer) == 0){printf("buffer is 1234\n");flag = true;}if(flag){printf("flag is true\n");}else{printf("flag is false\n");}
}
int main()
{test_func("45678912");return 0;
}

运行结果:

flag is false
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)

这是因为数组较小,产生了越界。以上是linux gcc编译的。可能其他编译器会遇到打印是flag is true的场景,为什么会变成true呢;

strcpy代码内存溢出原因分析:

strcpy这个函数,字符串溢出了,代码中有两个局部变量,flag(bool类型),buffer(字符数组),局部变量是存放在栈空间的,并且栈上的空间是从高地址向低地址生长的,所以定义的过程类似于压栈,先压进去的flag存放在高地址,buffer存放在了低地址。当调用strcpy的时候,由于buffer的内存只占用了5个字节,拷贝进去的字符串远大于5字节的字符串,然而strcpy函数又不会截断,那字符串多出来的字节存放在哪里?写内存的时候是从低地址往高地址写,所以它会继续寻址,往后面写,写到flag这个局部变量里。所以此时flag可能已经被篡改了,此时的值不在是false了。

strncpy代码:

int dest[3];

strncpy(dest,"hi",5);

strncpy代码内存溢出原因分析:

dest只有3个字符,刚好容纳"hi"加上一个\0, //但是后面传入了5的参数,遇到\0并不会停止,而是往dest[3],dest[4]继续写入\0造成溢出。本周原因是strncpy没有对边界进行检查。

sprintf代码:


        char text[1];
        sprintf(text,"%d.%d.%d", byte1, byte2, byte3);
   );

sprintf代码内存溢出原因分析:

        前面的字符数组空间开得太小了,但是sprintf在执行时不会考虑前面的字符串数组空间是否足够,它会自动地占用后续空间,这样就会影响后面的数据,导致内存溢出。

http://www.lryc.cn/news/105802.html

相关文章:

  • Jmeter如何添加插件
  • flask---CBV使用和源码分析
  • Qt 实现压缩文件、文件夹和解压缩操作zip
  • 简单工厂模式VS策略模式
  • 【MySQL】触发器 (十二)
  • 听说 Spring Bean 的创建还有一条捷径?
  • 大数据课程E6——Flume的Processor
  • 实现邮箱管理之gmail邮箱、office365(Azure)邮箱之披荆斩棘问题一览
  • (AcWing)多重背包问题 I,II
  • 如何把几个视频合并在一起?视频合并方法分享
  • 【MyBatis】初学MyBatis
  • 深度学习训练营之DCGAN网络学习
  • 自定义MVC增删改查
  • RabbitMQ 教程 | 第2章 RabbitMQ 入门
  • 双网卡如何配置DNS?我是一个仅主机模式配置静态(static)IP、一个NET或桥接(dhcp获取)
  • Android10: 动态隐藏导航栏和状态栏总结
  • roop 视频换脸
  • Java类集框架(一)
  • Jsp+Ssh+Mysql实现的简单的企业物资信息管理系统项目源码附带视频指导运行教程
  • 【Spring】深究SpringBoot自动装配原理
  • 阿里云负载均衡SLB网络型NLB负载均衡架构性能详解
  • JavaScript学习 -- SM4算法应用实例
  • 【JVM】什么是双亲委派机制
  • 网络安全 Day24-select高级用法和多表连接
  • JUC并发编程之volatile详解
  • swing布局详解
  • el-table某一列嵌套使用el-popover,使用click触发,导致页面下拉框组件无法触发弹框关闭(解决办法)
  • 正泰电力携手图扑:VR 变电站事故追忆反演
  • 报错 -bash: wget: command not found
  • HashMap扩容和Redis中Dict 扩容