我们有一段代码来说明缓冲区溢出绕过密码哈希的危险。我破解密码的输入包括一串通过命令行输入的十六进制字符,如下所示:
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”。不幸的是,由于我无法直接控制字符本身,所以仅仅禁止低于此值的值并不可行。
答案 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)