printf出了点问题

时间:2019-01-20 10:24:39

标签: c printf

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

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

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

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

有些人会得到coredump,有些人不会,不知道为什么打印全0。

这是代码示例。c gcc example.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; 
}

1 个答案:

答案 0 :(得分:5)

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

当您使用%xxx作为字符串时,printf将其解释为潜在参数,然后将尝试获取它们,从而进行核心转储。但这会进一步发展,因为这可能意味着通过此机制的安全攻击。在某种程度上,这与SQL注入的C等效。

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