【问题标题】:Causing a buffer overflow, segfault导致缓冲区溢出,segfault
【发布时间】:2013-11-18 18:17:41
【问题描述】:

我试图在以下非常简单的程序中导致缓冲区溢出:

#include <stdio.h>
#include <stdint.h>

void badf(int n, char c, char* buffer)
{

    char mycode[] = {
0xeb, 0x0f, 0xb8, 0x0b,
0x00, 0x00, 0x00, 0x8b,
0x1c, 0x24, 0x8d, 0x0c,
0x24, 0x31, 0xd2, 0xcd,
0x80, 0xe8, 0xec, 0xff, 
0xff, 0xff, 0x2f, 0x62,
0x69, 0x6e, 0x2f, 0x6c, 
0x73, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00
}; // 37 bytes

// Overwrite Base Pointer
    //mycode[37] = 0x29;
//mycode[38] = 0xf4;
//mycode[39] = 0xff;
//mycode[40] = 0xbf;

    // Overwrite Instruction Pointer
    // Using debugger, found mycode[] to be loaded in: 0xbffff42d
    mycode[41] = 0x2d;
    mycode[42] = 0xf4;
    mycode[43] = 0xff;
    mycode[44] = 0xbf;

}

void f(int n, char c)
{
    char buffer[37];    
    badf(n,c,buffer);
}

void test()
{
    printf("test");
}

int main()
{
    f(37,0x00);
    return 0;
}

(我之前已经成功地从缓冲区溢出中执行test())现在我试图通过用堆栈中mycode的开头覆盖指令指针来执行mycode[]。

这只工作了一半,程序跳转到正确的地址,在那里我可以在调试器中看到正确的机器代码,但随后由于分段错误而崩溃,而不是执行以下指令(见屏幕截图)。

我试图弄清楚他为什么在执行“注入”代码的内容之前崩溃。我对这类东西比较陌生,我理解分段错误意味着我试图访问操作系统不希望我访问的内存?

(PS:32位Linux机器,用-fno-stack-protector编译所以我可以玩这个东西)

(如果需要更多信息,我很乐意更新帖子)

【问题讨论】:

  • 您的问题解决了吗?我有同样的问题

标签: c linux assembly x86 buffer-overflow


【解决方案1】:

如果是 Linux,您可能可以通过下载和安装 execstack 使其工作,并按照说明here 操作。分段错误可能是您的精灵二进制文件默认设置 nx 位的结果,exectstack 有选择地撤消该位。如果这不起作用,您可能会触发额外的保护,您可能会也可能无法禁用。

【讨论】:

  • 我尝试编译:"gcc -z execstack -fno-stack-protector -g -static -o bof bof.c" 应该做同样的不?
  • @Juicy:这在我的发行版上不起作用。 execstack 需要单独下载和安装,你使用它 execstack -s 。您偶尔会看到建议的语法,但它对我不起作用。
  • 它在存储库中(对于我的发行版);因此,只需执行 sudo apt-get install execstack 即可完成安装和配置。
  • 谢谢!试一试,但它仍然给我段错误。我相信,正如我告诉 dan3 的那样,我实际上已经完成了我的讲师想要的,它不适用于我的 Debian,但希望能在我们 Uni 的 Ubuntu 上运行。
  • 那么在调试器中显示在该地址的代码正是我尝试注入的机器代码(对 execv 的系统调用),所以它看起来像是在正确地址的正确代码
【解决方案2】:

遗憾的是,这种令人兴奋的技巧如今已不再适用。怪病毒的人。

数据段标有NX (no execute) 位——这是触发段错误的原因。 CPU 将 PC 视为非执行区域。

您为什么不尝试覆盖“真实”函数指针的代码(获取现有函数的地址)并看看会发生什么(这可能会失败,因为编译器也不赞成自修改代码/链接器/操作系统,也是由于上面提到的病毒人)

【讨论】:

  • 好的,谢谢。这实际上是为学校做的练习,但我在家里做。你认为我可以断定我已经成功注入代码并重定向了指令指针,但是我的现代 Debian 发行版正在阻止这种情况发生吗?
  • 你只能断定你已经成功地将一些机器代码注入到一个变量中,然后执行失败。如果不是 NX 保护,也许它会起作用,也许不会。更新:在编辑后的答案中查看建议
猜你喜欢
  • 2018-04-19
  • 2021-06-15
  • 2013-02-17
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
相关资源
最近更新 更多