问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何理解堆和堆溢出漏洞的利用

发布网友 发布时间:2022-04-24 02:49

我来回答

1个回答

热心网友 时间:2023-08-19 12:22

这篇文章详细的描述了堆,并且会教你如何编写基于堆溢出漏洞的利用。
运行下面的程序:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
char *buf1 = malloc(128);
char *buf2 = malloc(256);
read(fileno(stdin), buf1, 200);
free(buf2);
free(buf1);
}
在第 10 行中,存在一个明显的可利用的溢出漏洞。那么首先我们就来了解下系统是怎样管理堆的 。
0×01 基本堆和堆块的布局
每个程序分配的内存(这里指的是 malloc 函数)在内部被一个叫做 ” 堆块 ” 的所替代。一个堆块是由元数据和程序返回的内存组成的(实际上内存是 malloc 的返回值)。所有的这些堆块都是保存在堆上,这块内存区域在申请新的内存时会不断的扩大。同样,当一定数量的内存释放时,堆可以收缩。在 glibc 源码中定义的堆块如下:
struct malloc_chunk {
INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */
INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */
struct malloc_chunk* fd; /* double links -- used only if free. */
struct malloc_chunk* bk;
/* Only used for large blocks: pointer to next larger size. */
struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
struct malloc_chunk* bk_nextsize;
};
假设内存中没有堆块释放,新分配的内存区域紧随之前申请的堆块后。因此如果一个程序依次调用malloc(256),malloc(512),以及malloc(1024),内存布局如下:
Meta-data of chunk created by malloc(256)
The 256 bytes of memory return by malloc
—————————————–
Meta-data of chunk created by malloc(512)
The 512 bytes of memory return by malloc
—————————————–
Meta-data of chunk created by malloc(1024)
The 1024 bytes of memory return by malloc
—————————————–
Meta-data of the top chunk
在堆块之间的”—”是虚拟的边界,实际当中他们是彼此相邻的。你可能会问,为何我要在布局当中包含一个”顶块”元数据。顶级块表示堆中可利用的内存,而且是唯一的可以大小可以生长的堆块。当申请新的内存时,顶块分成两个部分:第一个部分变成所申请的堆块,第二个部分变为新的顶块(因此顶块大小可以收缩)。如果顶块不能够满足申请的内存区域大小,程序就会要求操作系统扩大顶块大侠(让堆继续生长)。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
有释放证明书可以开无犯罪证明吗 刑满释放人员入党需要公安机关出具怎样证明与无罪证明一样的作用 交通事故私了是要注意哪些问题 【私了注意事项】车祸哪些情况不能私了 交通事故私了要注意什么 私了交通事故要注意的问题 wifi6跟wifi5的区别有什么? 只有吉祥寺是想住的街道吗 演员表 《吉祥寺真的是你想住的街道吗》:每个人都会找到适合自己的街道 日剧《只有吉祥寺是想住的街道吗》为何选择“生きていたん 如何评价日剧《只有吉祥寺是想住的街道吗?》? SUSE Linux 11下glibc依赖问题 glibc库函数提问 段错误 1633C1,libc_freeres_fn ()由谁调用的 既然malloc和calloc都是分配内存,为什么还要区分这两种方式来分配呢? 为什么redis小等于39字节的字符串是embstr编码,大于39是raw编码_百度... STM32开发中,如果想动态分配内存,要想实现标准C中的malloc(),free()函数功能咋办 标准C语言中有malloc、calloc、free函数建立动态链表,Linux有那些函数建立动态链表 如何实现一个新的linux系统调用 教资科目二考试技巧是什么? malloc函数的与new的区别 教资科目二考试时长 malloc之后再进行free,free的内存空间一定被OS回收了吗? 教资科目二要如何备考? C/C++程序员应该如何应对OOM 教资科目二题型有哪些? rt1052中malloc申请是哪里的内存 教资科目二怎么准备 glibc和libc到底有什么区别? 教资科目保留时间问题? malloc怎么用呢 2020教资考试科目都有啥呢? 用malloc与free出错,望指导,谢谢 电脑用命名diskpart查询出来的硬盘id是不是硬盘的序列号? 小葱的营养价值和功效 葱有哪些功效? 小葱营养价值 关于相片大小和清晰度 葱的功效与作用及营养价值如何? 小葱有哪些营养价值 小葱头的功效与作用 葱的作用? 葱的药用价值? 野葱的功效与作用有哪些吗 生葱的作用 葱有哪些作用 葱的食用功效 葱对人体有好处吗? 茖葱的功效与作用有哪些 葱的作用??? 低音提琴好学吗 低音提琴大约有多重???想学可害怕太重了不方便而且背不动 关于希区柯克.......