1

我正在做一个基本的缓冲区溢出项目。目标是溢出缓冲区以运行 shell。我正在利用的代码如下所示:

int func(char *str)
{
    //4 bytes for str, 16 bytes for the buffer, 4 for the ebp, 4 for the ret
    char buffer[12];

    /* The following statement has a buffer overflow problem */ 
    strcpy(buffer, str);

    return 1;
}

本质上,我正在创建 str 以便它将用一些启动 shell 的 shellcode 的地址覆盖 func() 的返回地址。

如果我使用 gcc -g 选项编译我的代码并在 gdb 中运行可执行文件,一切正常。但是,如果我省略 -g,我会得到一个段错误而不是 shell。

如果我理解正确,这很可能是因为 gdb 将东西添加到堆栈中。这意味着我需要更改用于替换 func 的返回地址的值。我将如何寻找这个新地址?

我尝试添加一个 printf("%p", str); func,然后编译和运行使用和不使用 -g 但这两种方式都会打印相同的东西。我也尝试过其他一些类似的事情。

4

1 回答 1

1

我找到了解决方案。显然,改变堆栈的不是 -g 标志 - 使用 gdb 运行它。如果我在 gdb 中运行和独立运行程序时使用 printf,则会出现差异,我可以相应地调整我的代码

于 2012-11-06T04:17:33.683 回答