问题本质
sprintf的函数原型是:
int sprintf(char *str, const char *format, ...);
关键问题:sprintf不会检查目标缓冲区str的大小,它会无限地写入,直到格式字符串被完全处理。如果格式化后的字符串长度超过了目标缓冲区的大小,就会发生缓冲区溢出。
一个简单的致命示例
#include <stdio.h>
#include <string.h>
void vulnerable_function() {
char buffer[10]; // 只有10字节空间
// 危险:格式化后的字符串长度可能超过buffer大小
sprintf(buffer, "Hello, %s!", "World"); // 安全:长度刚好
// 但如果用户输入较长...
char name[50] = "AliceBobCharlieDavidEveFrank";
sprintf(buffer, "Hello, %s!", name); // 缓冲区溢出!
printf("Buffer: %s\n", buffer);
}
缓冲区溢出的严重后果
1. 程序崩溃
int main() {
char small[5];
sprintf(small, "This is a very long string"); // 立即溢出
// 可能立即导致段错误(Segmentation Fault)
return 0;
}
2. 数据损坏
void data_corruption() {
int important_value = 42;
char buffer[8];
printf("Before: important_value = %d (address: %p)\n",
important_value, &important_value);
printf("Buffer address: %p\n", buffer);
// 溢出会覆盖栈上的相邻数据
sprintf(buffer, "Overflowing data here");
printf("After: important_value = %d\n", important_value);
// important_value 可能被修改!
}
3. 安全漏洞 - 栈溢出攻击
这是最危险的情况,攻击者可以通过精心构造的输入控制程序执行流。
// 极

最低0.47元/天 解锁文章
2860

被折叠的 条评论
为什么被折叠?



