【发布时间】:2013-10-22 02:32:29
【问题描述】:
我在发现一个问题时遇到了一些麻烦。鉴于以下情况:
int match(char *s1, char *s2) {
while( *s1 != '\0' && *s2 != '\0' && *s1 == *s2 ){
s1++; s2++;
}
return( *s1 - *s2 );
}
int main() {
char str1[8], str2[8];
scanf("%s", str1);
scanf("%s", str2);
if (match(str1, str2) == 0)
printf("They are the same.\n");
else
printf("They are not the same.\n");
}
哪两个不同值的输入字符串可用于使程序打印消息“它们是相同的”? (以上代码不可更改)
我知道当数组被添加到堆栈中时,它们会被“推入”其中,并且信息会以相同的方向写入。因此,如果我在 str2 中输入“AAAAAAAAA”(A x 9),它会溢出并且 str1 会打印“A”。
我的第一次尝试是为 str2 输入 A x 16,希望程序会用 8 个 A 覆盖 str1 中的值,并且程序只会读取 str2 中的 8 个值。 str1 确实有 A x 8 的值,但 str2 保留了 A x 16 的值。
有没有办法用它来解决这个问题?还是我想错了?
编辑:这个问题是在特定机器上运行的,它具有过时的、因此易受攻击的 Linux 版本。我通过 gdb 运行程序,它显示两个字符串在内存中彼此相邻,并且 str2 溢出到 str1。那么我的问题是,我可以使用它来使 str2 和 str1 在比较它们时看起来与程序相同吗?
【问题讨论】:
-
为什么第二个变量的输入要覆盖第一个变量的内容?
-
好吧,我认为这是解决此问题的唯一方法。程序怎么会被“愚弄”?
标签: c buffer-overflow