【发布时间】:2019-06-03 16:34:43
【问题描述】:
我想在 c 程序上尝试缓冲区溢出。我用 gcc 像这样gcc -fno-stack-protector -m32 buggy_program.c 编译它。如果我在 gdb 中运行这个程序并且我溢出缓冲区,它应该说 0x41414141,因为我发送了 A。但它说的是0x565561f5。对不起,我的英语不好。有人可以帮帮我吗?
这是源代码:
#include <stdio.h>
int main(int argc, char **argv)
{
char buffer[64];
printf("Type in something: ");
gets(buffer);
}
Starting program: /root/Downloads/a.out
Type in something: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Program received signal SIGSEGV, Segmentation fault.
0x565561f5 in main ()
我想看看这个:
Starting program: /root/Downloads/a.out
Type in something: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in main ()
【问题讨论】:
-
为什么觉得奇怪?代码在哪里?
-
你在这里展示的只是反汇编。这不会告诉你函数将返回到哪里。
-
尝试使用
set disable-randomization off在gdb中启用ASLR。 -
关于:
gets(buffer);函数:gets()已经贬值多年,并从最新版本的 C 中完全删除。你的编译器应该告诉你这一点。建议使用fgets()(与gets()有不同的参数) -
所有这些 'A' 的输入导致缓冲区溢出:
char buffer[64];溢出缓冲区会导致未定义的行为。并且该缓冲区在堆栈上声明,因此堆栈被破坏。所以任何事情都有可能发生。