本文主要介绍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);
);文章来源:https://www.toymoban.com/news/detail-624929.html
sprintf代码内存溢出原因分析:
前面的字符数组空间开得太小了,但是sprintf在执行时不会考虑前面的字符串数组空间是否足够,它会自动地占用后续空间,这样就会影响后面的数据,导致内存溢出。文章来源地址https://www.toymoban.com/news/detail-624929.html
到了这里,关于linux strcpy/strncpy/sprintf内存溢出问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!