堆溢出利用

时间:2012-05-28 13:27:21

标签: memory overflow heap exploit

我知道溢出利用需要三个步骤:

1.将任意代码(shellcode)注入目标进程内存空间。

2.控制eip。

3.设置eip以执行任意代码。

我读过关于堆利用的ben hawkens文章,并且理解了关于如何最终覆盖指向我的代码的函数指针的一些策略。

换句话说,我理解第2步。

我不明白第1步和第3步。

  1. 如何将代码注入进程内存空间?

  2. 在步骤3中,我用a覆盖一个函数指针 指向我的shellcode的指针,如何计算\知道什么地址 注入的代码注入了吗? (这个问题已经解决了 在stackoverflow中使用“jmp esp)。

3 个答案:

答案 0 :(得分:3)

在堆溢出中,假设系统没有激活ASLR,您将知道在溢出中使用的内存块(也称为缓冲区)的地址。

一个选项是将shellcode放在缓冲区所在的位置,因为您可以控制缓冲区的内容(作为应用程序用户)。将shellcode字节放入缓冲区后,只需跳转到该缓冲区地址即可。

执行该跳转的一种方法是,例如,覆盖.dtors条目。一旦易受攻击的程序完成,将执行放置在缓冲区中的shellcode。复杂的部分是.dtors覆盖。为此,您将不得不使用已发布的堆利用技术。

先决条件是ASLR被停用(在执行易受攻击的程序之前知道缓冲区的地址),并且放置缓冲区的内存区域必须是可执行的。

更重要的是,第2步和第3步是相同的。如果你控制eip,那么你将它指向shellcode(任意代码)是合乎逻辑的。

P.S。:绕过ASLR更加复杂。

答案 1 :(得分:2)

步骤1需要受攻击代码中的漏洞。 常见的漏洞包括:

  • 缓冲区溢出(如果程序将任意长字符串读入固定缓冲区,则会发生常见的i C代码)
  • 评估未经过清理的数据(在SQL和脚本语言中很常见,但也可以在其他语言中出现)

第3步需要详细了解目标架构。

答案 2 :(得分:1)

  1. 如何将代码注入流程空间?

    这是一个非常明确的陈述/问题。它需要一个可利用的'所述处理空间中的代码区域。例如,如果可能的话,Windows当前正在将strcpy()重写为strncpy()。我说 如果可能的话

    因为并非所有使用strcpy的代码区域都可以成功转换为strncpy。为什么?因为下面显示的这个关键所在的@ @;

    strcpy($buffer, $copied);
    

    strncpy($buffer, $copied, sizeof($copied));
    

    这使得strncpy在现实世界的场景中难以实现。必须安装一个神奇的号码'大多数strncpy操作(sizeof()运算符创建此幻数)

    作为编码员'我们被教导使用硬编码值,例如严格遵守char buffer[1024];是非常糟糕的编码实践。

    但相比之下 - 使用buffer[]="";buffer[1024]="";是攻击的核心。但是,如果我们将此代码更改为后者,我们会在系统中引入另一个漏洞...

    char * buffer;
    char * copied;
    
    strcpy(buffer, copied);//overflow this right here...
    

    或者这个:

    int size = 1024;
    
    char buffer[size];
    char copied[size];
    
    strncpy(buffer,copied, size);
    

    这将停止溢出,但由于大小可预测并构造成1024块代码/数据,因此在RAM中引入了可利用的区域。

    因此,在程序的地址空间中寻找strcpy的原始海报,如果存在strcpy,将使程序可利用。

    程序员优先于strncpy支持strcpy的原因有很多。幻数,可变输入/输出数据大小......编程风格......等等......

  2. 如何在我的代码(我的位置)找到自己

    检查各种黑客书籍的例子〜

    但是,试试;

    label:
    pop eax
    pop eax
    call pointer
    
    jmp label
    pointer:
    mov esp, eax
    jmp $
    

    这是一个不起作用的例子,因为我不想对编写下一个Morris蠕虫负责!但是,任何体面的程序员都会得到这段代码的主旨,并立即知道我在这里谈论的是什么。

    我希望你的溢出技术将来有用,我的儿子!