c - printf 有问题或者什么的

标签 c printf

我正在阅读一些有关安全编程的 Material ,当我输入: ./a.out%.622496x%.622496x%n

./a.out%..622496x%n

./a.out%.633x%.63336x%n

./a.out%.6edd33x%.63336x%n

有些会得到 coredump,有些不会,不明白为什么他们打印所有 0。

这是代码示例.c gcc 示例.c

#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
    char buffer[512]="";
    strncpy(buffer,argv[1],500);
    printf(buffer);

    return 0; 
}

最佳答案

在显示这样的字符串之前,您必须清理输入。

由于 %xxx 是字符串,printf 将它们解释为潜在的参数,然后尝试获取它们,从而产生核心转储。但这更进一步,因为这可能意味着通过这种机制进行安全攻击。在某种程度上,这相当于 SQL 注入(inject)的 C 语言。

作为@TypeIA,正确的方法是将buffer视为格式化字符串的参数(printf("%s", buffer)),不是格式化字符串本身。这也是为什么如果您创建带有参数 ( char * format, ... ); (不是 const)的函数,一些编译器会发出警告的原因。

关于c - printf 有问题或者什么的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54275492/

相关文章:

c - Linux 和 Windows 上的报警功能 -> 找不到 Windows 的等效功能 -> C

c - 无符号和有符号数据比较及其在内存中的表示

c - 编译后生成的二进制文件会发生什么

C - pthread_create - Clang GCC 区别

php - 使用 sprintf 显示 WooCommerce 付款方式费用的不同文本标签

c - 多字节语言环境中 glibc 的 printf 截断错误的解决方法?

c - 如何格式化动态输出以在 printf 中创建表

java - 有没有可用的软件或库可以用 C、C++、Java 或 Ruby 绘制 3 维螺钉?

c - 使用 printf 打印字符数组

scanf 命令后控制台崩溃