sprintf函数引起的缓存区溢出

问题本质

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. 安全漏洞 - 栈溢出攻击

这是最危险的情况,攻击者可以通过精心构造的输入控制程序执行流。

// 极
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值