在C中解释为null的非null十六进制char输入

时间:2017-03-21 22:34:34

标签: c parsing char hex scanf

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

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

这在checkPassword中通过以下方式解析:

scanf("%29s", password);
然后我用两个打印密码:

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

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

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

编辑:提供更多代码。

EDIT2:\ xc也意味着程序会忽略它之后的任何字符。这不是导致问题的唯一char,但我认为它们似乎都是“&lt; \ xc”。不幸的是,由于我无法直接控制字符本身,所以仅仅禁止低于此值的值并不可行。

1 个答案:

答案 0 :(得分:0)

scanf在空格符号处停止:

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

  

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

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)