【问题标题】:stdin: hex values change depending on stdin标准输入:十六进制值根据标准输入而变化
【发布时间】:2014-07-15 18:05:16
【问题描述】:

我正在创建一个散列程序,它采用文件或标准输入并将散列打印到另一个文件或通过标准输出到终端。我的问题是,由于参数的十六进制值发生了变化,我得到了基于相同标准输入的不同哈希值。

发生这种情况的代码部分在这里:

    for (i = 3; i < argc; i++) {
        if (strcmp(argv[i], "-i") == 0 && argv[i+1] != NULL) {
            in = argv[i+1];
            in = strtok(in, " ");
    printf("arg \"%s\" hex: %02x\n", argv[i+1], argv[i+1]);
            inCheck = 1;
            i++;
        }
        else if (strcmp(argv[i], "-o") == 0 && argv[i+1] != NULL) {
            out = argv[i+1];
            i++;
        }
        else 
            printf("Unknown argument %s. Ignoring.\n", argv[i]);
    }

基本上,我在这里检查命令行中“-i”之后输入的十六进制值。当我进入时:

./executable hash -sha -i hello -o world我得到了输出arg "hello" hex: ce4a2823 当我进入时:

./executable hash -sha -i hello 我得到了输出arg "hello" hex: 247f582c 当我进入时:

./executable hash -sha -o world -i hello我得到了输出arg "hello" hex: 57e2f82c

所以我想知道为什么字符串的十六进制值不断变化?

【问题讨论】:

  • 由于我们看不到计算散列的代码——或任何支持代码——所以无法判断。你应该准备一个minimal compilable example 来重现问题并发布那个
  • 您打印的十六进制数是内存中字符串的地址。在大多数现代系统上,每次运行程序时该值都会发生变化,即使您为程序提供完全相同的参数也是如此。旁注:argv 数组中的字符串从不包含空格(因为空格是命令行参数之间的分隔符),所以strtok 调用保证什么都不做。
  • 我向您展示了最小的代码示例。哈希部分稍后出现,正是在这部分中我遇到了问题。这就是我发布我所做的事情的原因。就 strtok 而言,我自己几乎已经想通了,但补充说,在检查为什么事情可能会有所不同时,我在发布之前没有去删除它,但是谢谢,很高兴知道.内存地址是有道理的,这是我怀疑但不完全确定的。所以谢谢你。
  • @user3386109 argv 字符串当然可以包含空格。你还能如何(例如)处理带有空格的文件名?
  • @hyde 是的,您是对的,您可以使用引号在参数中强制使用空格。但在这种情况下,您不会使用 strtok 截断第一个空格处的参数。

标签: c hex command-line-arguments stdin gnome-terminal


【解决方案1】:

您不是在打印一些“字符串的十六进制值”,而是在打印字符串的 地址。如果要打印字符串中第一个字符的十六进制值,可以这样做:

printf("arg \"%s\" hex: %02x\n", argv[i+1], argv[i+1][0]);

十六进制值可能不同,因为您的操作系统每次运行程序时都会随机分配堆栈的位置,以使缓冲区溢出/欠载漏洞利用更加困难。并且argv[] 字符串可能存储在堆栈中(无需检查,我认为它们必须是可修改的,并且它们的长度当然不是静态的,因此在程序启动时将它们放入堆栈是一种自然的解决方案)。


既然你说的是“字符串的十六进制值”,请注意:C字符串基本上只是一块内存的地址(例如char数组),包含1个或多个char:字符串和以'\0' 字节结尾的字符串(即使字符串为空也必须存在)。与大多数其他语言的字符串类型相比,这是一个非常原始的东西。

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 2013-09-18
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多