First Fit
First Fit
当你在程序中使用glibc释放内存时,会使用不同的“bins”来管理内存块。以下是两种常见情况的简化解释:未排序的bins和fastbins。
未排序的Bins
当你释放一个不是快速块的内存块时,它会进入未排序的bin。这个bin就像一个列表,新释放的块会被添加到前面(“头部”)。当你请求一个新的内存块时,分配器会从后面(“尾部”)查看未排序的bin,以找到一个足够大的块。如果未排序的bin中的块比你需要的大,它会被分割,返回前部分,并保留剩余部分在bin中。
示例:
你分配了300字节(
a
),然后250字节(b
),释放a
并再次请求250字节(c
)。当你释放
a
时,它进入了未排序的bin。如果你再次请求250字节,分配器会在尾部找到
a
并将其分割,返回符合你请求的部分,保留剩余部分在bin中。c
将指向先前的a
并填充a
的内容。
Fastbins
Fastbins are used for small memory chunks. Unlike unsorted bins, fastbins add new chunks to the head, creating a last-in-first-out (LIFO) behavior. If you request a small chunk of memory, the allocator will pull from the fastbin's head.
Example:
You allocate four chunks of 20 bytes each (
a
,b
,c
,d
).When you free them in any order, the freed chunks are added to the fastbin's head.
If you then request a 20-byte chunk, the allocator will return the most recently freed chunk from the head of the fastbin.
其他参考资料和示例
ARM64。使用后释放:生成一个用户对象,释放它,生成一个获取到被释放块的对象,并允许对其进行写入,覆盖前一个用户->密码的位置。重用用户以绕过密码检查。
该程序允许创建笔记。一个笔记将在malloc(8)中具有笔记信息(带有可调用的函数指针),并在另一个malloc(<size>)中具有笔记内容的指针。
攻击将是创建两个笔记(note0和note1),其malloc内容比笔记信息大小更大,然后释放它们以使它们进入快速bin(或tcache)。
然后,创建另一个笔记(note2),内容大小为8。内容将位于note1中,因为该块将被重用,我们可以修改函数指针以指向win函数,然后Use-After-Free note1以调用新的函数指针。
可以分配一些内存,写入所需的值,释放它,重新分配它,由于先前的数据仍然存在,它将根据块中的新期望结构进行处理,从而可以设置值或获取标志。
在这种情况下,需要在特定块中写入4,这是分配的第一个块(即使在强制释放所有块后仍然如此)。在每个新分配的块中,其在数组索引中的编号被存储。然后,分配4个块(+最初分配的块),最后一个将在其中包含4,释放它们并强制重新分配第一个块,它将使用最后释放的块,其中包含4。
Last updated