欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

深入理解Glibc堆的实现(上)

来源:本站整理 作者:佚名 时间:2019-04-22 TAG: 我要投稿

在阅读本文之前,建议大家先读一下这篇文章,其中讨论了一个过时的但很重要的内存损坏漏洞,我将之称为“堆栈缓冲区溢出”。除此之外,我还假设如果我作为攻击者如何利用这些漏洞来控制远程程序并使其运行恶意shellcode。

在测试中,我发现如果要使用一种称为“stack canaries”的漏洞缓解措施,则攻击者则难以利用这些堆栈缓冲区溢出漏洞,除非,他们使用额外的漏洞才能利用它们。
Stack Canaries是已知的放置在缓冲器和控制数据之间的一个随机值,当缓冲器溢出时,最先被破坏的就是这个值。
当开发人员使用各种基于堆栈的漏洞缓解机制时,攻击者通常会使用与堆相关的漏洞(如Use-after-free漏洞、double free漏洞和堆溢出漏洞)来构建漏洞。这些基于堆的漏洞比基于堆栈的漏洞更难理解,因为针对基于堆的漏洞的攻击技术可能非常依赖于堆分配器的内部实现的实际工作方式。
 Use-after-free漏洞(简称UaF漏洞)是当前最流行的高危内存破坏漏洞。目前针对UaF漏洞的检测工作并不完善,原因是UaF漏洞产生的特征是分配内存、释放内存、使用已释放的内存并按顺序出现,而这3种事件可能出现在程序的任何位置,需要跟踪较长的执行序列并搜索潜在的危险事件序列才能检测到该漏洞,这很大程度上提高了检测的难度。
Double Free其实就是同一个指针free两次。虽然一般把它叫做double free。其实只要是free一个指向堆内存的指针都有可能产生可以利用的漏洞。double free的原理其实和堆溢出的原理差不多,都是通过unlink这个双向链表删除的宏来利用的。只是double free需要由自己来伪造整个chunk并且欺骗操作系统
因此,在讨论利用基于堆的漏洞之前,我将先讨论堆的工作方式。首先,我会介绍一些概念,并讨论如何创建新的堆块。其次,我将深入探讨如何释放和回收这些块。
堆的工作方式会根据实现的平台不同,而存在不同的堆实现。例如,Google Chrome的PartitionAlloc与FreeBSD中使用的jemalloc堆分配器非常不同。Linux中默认的glibc堆实现与堆在Windows中的工作方式也有很大不同。因此,我将主要关注glibc堆分配器,即在Linux设备上默认运行的C/ c++程序中,堆分配是如何工作的。这个堆派生自ptmalloc堆实现,而它实际上又是从更老的dlmalloc(Doug Lea malloc)内存分配器派生而来的。
堆是什么,它的用途是什么?
堆被C和c++程序员用来在程序执行期间手动分配新的进程内存区域,程序员要求堆管理器通过调用堆函数(如malloc)来分配这些内存区域。然后,程序员可以使用、修改或引用这些分配的内存区域,直到程序员不再需要它,并通过调用free将分配返回给堆管理器为止。
下面是一个C程序如何在堆上分配、使用和释放结构的示例:
typedef struct
{
    int field1;
    char* field2;
} SomeStruct;
int main()
{
    SomeStruct* myObject = (SomeStruct*)malloc(sizeof(SomeStruct));
    if(myObject != NULL)
    {
        myObject->field1 = 1234;
        myObject->field2 = “Hello World!”;
        do_stuff(myObject);
free(myObject);
    }
    return 0;

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载