【问题标题】:What could be a corresponding input to this output?该输出的相应输入可能是什么?
【发布时间】:2015-08-17 11:46:33
【问题描述】:

考虑以下代码:

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'$ffq` ong 字符串

输入可能是什么?

所以我认为它应该类似于%d%x。所以它执行:sprintf(j, "%x");,但这种格式没有对应的变量。

  1. 在这种情况下,函数的作用是什么?好像是地址
  2. 输入可能是什么?是%x 还是别的什么?

【问题讨论】:

  • void main() --> int main(void)
  • @SouravGhosh 你的评论不一定正确,see this
  • 如果您的scanf() 扫描任何sprintf()-conversion-specifiers,则行为未定义,因为sprintf() 将没有相应的参数。
  • @Lundin 从技术上讲,是的,但是对于绝大多数情况,它将适用(正常,托管环境)。对于独立环境,完全没有限制。 :)

标签: c memory printf exploit format-specifiers


【解决方案1】:

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

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

[..] 如果格式的参数不足,则行为是 不明确的。 [...]

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

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

【讨论】:

  • 考虑:sprintf(j, "%d"); - 它会打印什么?
  • @RonErikson 由于缺少参数,它是 UB,输出未定义。
【解决方案2】:

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

【讨论】:

  • 你说的很对,但我认为 OP 是在询问格式字符串注入这种情况。
猜你喜欢
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
相关资源
最近更新 更多