gpt4 book ai didi

c - strncpy & 使用非空终止字符串读取堆栈帧

转载 作者:太空宇宙 更新时间:2023-11-04 08:22:29 24 4
gpt4 key购买 nike

我正在探索关于 strncpy 的 C,因为大多数人说它比 strcpy 更安全(附加参数,长度,以避免缓冲区溢出)。我还想找出非空终止字符串对程序的影响。这是我拥有的代码片段。

char password[5]="1234\0"; //Global variable

int main(int argc, char* argv[])
{
int length = 5;
char temp[5];

strncpy(temp, argv[1], length); //Possible problems?

/* Safer alternative */
//strncpy(temp, argv[1], length-1);
//temp[4] = '\0';

if(strncmp(password, temp, length) == 0) {
printf("Success! \n");
}
else {
printf("Error! Password is incorrect: %s\n", temp);
}

return 0;
}

如您所见,strncpy 复制 5 个字符,如果 len(argv[1]) >= 5,这将导致变量 temp 的非空终止。我正在寻找是否可以使用此属性来读取其他内存区域,例如全局变量 password。

我已经阅读了关于 strncpy 的问题,如果字符串不是以 null 终止的,则会导致相邻缓冲区受到影响,从而导致在引用下一个缓冲区时读取它。探索相邻内存:http://www.securiteam.com/securityreviews/5PP030KEUM.html

最佳答案

线

printf("Error! Password is incorrect: %s\n", temp);

temp 不是 null 终止时会出现问题。这将导致未定义的行为,因为格式 %s 需要一个空终止字符串。

使用

strncpy(temp, argv[1], length-1);
temp[4] = '\0';

会导致错误的结果。如果用户提供任何以“1234”开头的密码,测试将成功。

关于c - strncpy & 使用非空终止字符串读取堆栈帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32834982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com