【问题标题】:Compile C to allow for Buffer Overflow编译 C 以允许缓冲区溢出
【发布时间】:2013-02-09 15:56:19
【问题描述】:

我正在学习缓冲区溢出,并正在尝试制作一个。我有这个代码:

#include <stdio.h>

char *secret = "password";

void go_shell() {
    char *shell =  "/bin/sh";
    char *cmd[] = { "/bin/sh", 0 };
    setreuid(0);
    execve(shell,cmd,0);
}

int authorize() {
    char password[64];
    printf("Enter Password: ");
    gets(password);
    if (!strcmp(password,secret)) {
        return 1;
    }
    else {
        return 0;
    }
}

int main() {
    if (authorize()) {
        printf("login successful\n");
        go_shell();
    } else {
        printf("Incorrect password\n");
    }
    return 0;
}

我用 gcc 编译它,然后在 gdb 中运行它

我输入了大约 100 个“A”作为密码,程序崩溃了。

问题是没有寄存器被覆盖到0x4141414141414141

我用谷歌搜索了这个并将-fno-stack-protector 标志添加到gcc,这允许RBP 被覆盖到0x4141414141414141 但没有别的。

我想知道是否有办法编译代码以便覆盖 RIP。

【问题讨论】:

  • 您使用的是 Linux 吗?我认为你还需要在那里设置一些标志。
  • 使用 Mac OSX。知道标志是什么吗?
  • 我不了解 Mac OSX - 可能会与 Ubuntu 大不相同(抱歉,我实际上是在 Ubuntu 上做的,而不是 Linux)。
  • @nhahtdh Ubuntu 是一个 Linux 发行版。
  • 缓冲区溢出通常根本不会覆盖寄存器变量。如果你覆盖堆栈,返回地址可能会被覆盖,如果你有帧指针(没有-fomit-frame-pointer),可能还会覆盖帧指针。所以这些可能会被拉回寄存器,但那是因为堆栈首先被覆盖,而不是因为寄存器被直接覆盖。

标签: c compilation buffer-overflow


【解决方案1】:

如果您使用-fno-stack-protector 编译,您的代码已经完成了您想要的工作。您在 GDB 中看不到具有 0x4141414141414141 值的 RIP 的原因是在更新 RIP 之前引发了一般保护错误。 (如果发生页面错误,GPF 处理程序通常会从交换页面加载页面并从失败的指令开始继续执行。)

【讨论】:

  • 感谢您的帮助,但我想知道是否有办法关闭 GPF,以便将 RIP 设置为 0x4141414141414141,因为我正在使用的教程中会发生这种情况。
  • @cabellicar123 除非在该地址创建可执行页面,否则无法避免 GPF。继续你的教程。下一步可能是提供一个特制的密码,使代码跳转到一个有效的地址。
  • 非常感谢您的帮助!
【解决方案2】:

在 x32 上出现 EIP 0×41414141 崩溃的原因是,当程序将先前保存的 EIP 值从堆栈中弹出并返回 EIP 时,CPU 会尝试执行内存地址 0×41414141 处的指令,这会导致段错误。 (当然它必须在执行之前获取页面)

现在,在 x64 执行期间,当程序将先前保存的 RIP 值弹出回 RIP 寄存器时,内核会尝试执行内存地址 0×4141414141414141 处的指令。首先,由于规范形式的寻址,任何虚拟地址的第 48 位到第 63 位都必须是第 47 位的副本(以类似于符号扩展的方式),否则处理器将引发异常。如果这不是问题 - 内核在调用页面错误处理程序之前会进行额外检查,因为最大用户空间地址是 0x00007FFFFFFFFFF。

回顾一下,在 x32 架构中,地址在没有任何“验证”的情况下传递给页面错误处理程序,该处理程序尝试加载触发内核发送程序段错误的页面,但 x64 并没有做到这一点。

测试它,用 0×0000414141414141 覆盖 RIP,你会看到预期的值被放置在 RIP 中,因为内核的预检查通过,然后像 x32 情况一样调用页面错误处理程序(当然,这会导致程序崩溃)。

【讨论】:

    猜你喜欢
    • 2017-06-26
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多