【问题标题】:Non-null hex char input interpreted as null in C非空十六进制字符输入在 C 中解释为空
【发布时间】:2017-08-13 20:20:39
【问题描述】:

我们有一段代码来说明缓冲区溢出绕过密码哈希的危险。我破解密码的输入包括通过命令行输入的一串十六进制字符,如下所示:

echo -ne "\xab\x94\x44..." | ./checkPassword

这在 checkPassword 中被解析:

scanf("%29s", password);

然后我用两者打印密码:

printf("\n%s", password):

for (i=0; i<29; i++) {
    printf("%c ", password[i]);
}

checkPassword 使用 scanf 捕获输入字符串。我非常确定我用来生成破解字符串“\x...”的方法是正确的。但是,我注意到有时我仍然没有绕过密码。在打印出 checkPassword 读取的输入字符串后,我注意到诸如 \xc 之类的字符被解释为 \x00,如果它们没有被解释,我会绕过密码。我还没有找到任何解决或解释这个问题的方法。有没有人有任何想法?感谢您的任何建议

编辑:提供更多代码。

EDIT2: \xc 也意味着程序忽略它后面的任何字符。这不是导致问题的唯一字符,但我认为它们似乎都是“

【问题讨论】:

标签: c parsing char hex scanf


【解决方案1】:

scanf 在空白符号处停止:

http://www.cplusplus.com/reference/cstdio/scanf/

s String of characters 任意数量的非空白字符,在找到的第一个空白字符处停止。一个终止的空字符会自动添加到存储序列的末尾。

http://www.cplusplus.com/reference/cctype/isspace/

对于“C”语言环境,空白字符可以是:

' '     (0x20)  space (SPC)
'\t'    (0x09)  horizontal tab (TAB)
'\n'    (0x0a)  newline (LF)
'\v'    (0x0b)  vertical tab (VT)
'\f'    (0x0c)  feed (FF)
'\r'    (0x0d)  carriage return (CR)

【讨论】:

  • 哦,天哪,我不知道有一个页面说明什么是空白,什么不是空白!我认为这绝对可以解决我的问题,谢谢。我现在会标记为正确,并会尽快验证。
  • C 问题请不要链接到 C++ 文档。
猜你喜欢
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2019-08-03
  • 2011-10-14
  • 1970-01-01
  • 2013-08-27
相关资源
最近更新 更多