【发布时间】:2015-11-07 20:55:37
【问题描述】:
如果我有这个代码:
int main() {
char buff[20];
int x = 0;
gets(buff);
if (x==1337) {
print("Congrats");
}
printf("%d\n", x);
return 0;
}
知道这是用 C 语言编写的(不是很重要),如何将 char[] 正好溢出 1337?
而且,我不太了解我得到的输出。例如,如果我运行这段代码并输入:
12345678901234567890a
输出是:
0
事实上,在数据泄漏到 X 的值之前,我必须使我的 char[] 超出我的数组大小额外的 8 个字符。我不知道为什么会这样,并且会如果有人理解这一点,真的很想得到一些帮助。但是,它并不止于此。
如果我的输入是:
1234567890123456789012345678aa
我的输出是:
24929
这让我很纠结。因为我预计它会溢出a+a 的字符值,甚至可能是a*a,可惜两者都不是。 (a的char值为97)。
总结一下,因为我现在可能会感到困惑。我想知道如何将缓冲区(在 C 中)溢出到 int 中,从而使 int 成为一个非常具体的值(在本例中为 1337)。此外,如果您能解释这些数字是如何得出的,我将不胜感激!顺便提一下,代码是在 Linux shell 上执行的。
【问题讨论】:
-
您不是在打印
x的值,而是在打印指针"Wrong: " + x。将整数添加到指针会给您另一个指针。其实做"Wrong: " + x和做&("Wrong: "[x])是一样的 -
将
x的类型更改为unsigned int,并将print("Wrong: " + x)(这不可能是您的实际代码,但没关系)更改为printf("Wrong: %08x\n", x)。输出现在将与输入有更明显的联系。 -
我不得不承认,我从来没有真正使用过 C。我已经用代码中使用的确切 printf 语句更新了问题,这是否满足指针事故?
-
@zwol 请再次阅读代码,因为我向您保证,如果缓冲区溢出,我已经更改了 X 的值(或者至少我已经更改了正在打印的值)。
-
这里的一个问题是您溢出缓冲区的数据是 characters,并且以十进制形式在
int中查看它们并不能以简单的方式告诉您x中有哪些字符。将其打印为十六进制,并将整数的单个字节与an ASCII table 进行比较。这应该准确地告诉您输入的哪一部分覆盖了x以及字节顺序。然后,您只需将输入中的这些字节替换为以十进制显示为1337的一些字符(并且不要忘记字节顺序!)
标签: c buffer-overflow