什么可以作为此输出的相应输入?

时间:2015-08-17 11:46:34

标签: c memory printf exploit format-specifiers

请考虑以下代码:

void main()
{
    int i = 0;
    char j[22] = "This is a long string", k[3];
    scanf("%2s", k);
    sprintf(j, k);
    for (; i < 21; printf("%c", j[i++]));
}

输出为:

  

U%ae&#39; $ ffq` ong string

可能是什么输入?

所以我认为应该是%d%x。所以它执行:sprintf(j, "%x");但是这个格式没有相应的变量。

  1. 在这种情况下,该功能有什么作用?这似乎是一个地址
  2. 可能是什么输入?是%x还是其他什么?

2 个答案:

答案 0 :(得分:1)

sprintf(j, k);应为sprintf(j, "%s", k); - 请检查sprintf原型。

答案 1 :(得分:1)

无法告诉确定,但很明显k的输入基本上是某种形式的格式说明符。它可以是中的任何

之后,由于该格式说明符缺少参数,sprintf()正在调用未定义的行为,如C11中所述,章节§7.21.6.1

  

[..]如果格式的参数不足,则行为是   未定义。 [...]

要避免此类错误,请不要将用户输入作为格式字符串传递给printf()系列。使用更安全的,比如

  printf("fixed format string with format specifiers %s %d and all", arg1, arg2);