【问题标题】:C buffer overflow getting Segmentation FaultC缓冲区溢出得到分段错误
【发布时间】:2019-10-20 13:07:13
【问题描述】:

我正在尝试为我的安全类做一个缓冲区溢出,我们不允许调用任何函数,我们需要跳转到秘密函数并返回 0 而不会出现分段错误。我编写了下面的代码并成功跳转到秘密,但我遇到了分段错误。如何成功终止程序?或者是否可以只写入单个地址而不是 for 循环,当我尝试它并没有改变任何东西时。

#include <stdio.h>

void secret()
{
    printf("now inside secret()!\n");
}

void entrance()
{
    int doNotTouch[10];
    // can only modify this section BEGIN
    // cant call secret(), maybe use secret (pointer to function)
    for (int i = 0; i < 14; i++) {
        *(doNotTouch + i) = (int) &secret;
    }
    // can only modify this section END
    printf("now inside entrance()!\n");
}

int main (int argc, char *argv[])
{
    entrance();
    return 0;
}

【问题讨论】:

    标签: c pointers segmentation-fault buffer-overflow


    【解决方案1】:

    在一些半汇编程序中,假设是某种 x86。 (BP 是 EBP 或 RBP 的伪代码,假设您实际上并未针对 16 位模式进行编译。很可能是 32 位模式,因此 int 与返回地址的宽度相同。)

    ; entrance:
    ; - stack has return address to main
    push  bp                         ; decrement SP by a pointer width
    mov   bp,sp
    sub   sp, 10*sizeof(int)         ; reserve space for an array
    ;....
    ; doNotTouch[0] is probably at [bp - 10*sizeof(int)]
    

    当你循环到 14 时,你首先在 i==10 处覆盖保存的 bp,然后将返回地址覆盖到 main(这是正确的),然后再覆盖一些,最终导致 seg 错误。所以你只需要做*(doNotTouch + 11) = (int) &amp;secret; - 假设 int 是函数指针的大小。 (或者,如果编译器为堆栈对齐或它自己的使用留出了间隙。在调试构建中,其他本地人将有堆栈插槽。覆盖它们可能会导致无限循环超出范围。)

    然后跟随你的 printf 然后函数返回,但它不会返回到 main 而是“跳转”到secret

    secret 返回时,实际上是从 main 返回,但它无法执行 return 0;

    所以秘密应该是:

    int secret()
    {
        printf("now inside secret()!\n");
        return 0;
    }
    

    免责声明:“....我认为。”

    【讨论】:

    • 我试过 *(doNotTouch + 11) = (int) &secret;但什么也没发生,程序正常执行,我不允许将 return 0 添加到 secret。为什么你认为正确的数字是 11? doNotTouch 由整数组成,所以我认为它将是 4 字节 * 10 = 40 字节和帧 ptr(我猜是 4 字节)所以(doNotTouch + 44)是我的猜测,它是整数还是字符无关紧要吗?跨度>
    • int doNotTouch[10]; 是 0..9;指数 10 是 bp;索引 11 是返回地址。但是您可以检查汇编器并可以在调试器中运行它以查看会发生什么。在您的原始代码中还有一个 int i。并且一些编译器分配超过 10 个。
    猜你喜欢
    • 2017-05-12
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多