堆空间不一定连续
本次面向32bit的Heap
不同的系统有不同堆管理机制
arena被放在heap分配出来打开空间里,但是main_arena会被放在bss段里
所有线程共享arena
fastbin是单链表,其余为双向链表
单向链表——FILO,每个链表size相同,以8bytes为单位递增,被free的对块仍被标记为inuse(防止堆块合并,所以后一个堆块的p位永远为1)
Unsorted bin(堆的垃圾桶)
只有一个,双向循环链表-FIFO,任何大小的chunk都可以存放于Unsorted bin里,用途是快速重用被free的堆
small bin 双向循环链表——FIFO
Large bin 双向循环链表(CTF题很少遇到,不会分配这么大的堆空间)——可以在任意位置被拆卸,每个链表,chunk降序排列,大小越来越小
链表结构
overwrite fd or bk
trigger unlink
unlink in ancient times
Unlink攻击方法
申请堆0x18实际是0x20,主要是堆会做8字节对齐
peda插件parseheap,查看堆的内容
Double Free攻击方法,当一个堆块已经free之后又free,该堆会指向自身
因为有很多检查DF的检查机制,可以这样来实现,通过free和malloc结合,free掉chunk2(100大小),free掉chunk3(100大小),再malloc一个200的空间,然后就获得可以控制指向原来chunk3的指针,在原来chunk3位置构造假堆,指向chunk1,就能实现double free漏洞unlink第一个堆
UAF攻击方法,指针未清0,数据结构未变
函数指针4字节,int4字节,两个大小都为8字节的数据结构,在C++中,可以用在虚表中,里面全是函数指针,劫持控制流,但是C++函数指针的第一个参数永远是指向自身的this指针,赋参数会破坏结构(女巫之锤malloc maleficarum)
House of Force
在使用Top chunk进行分配的时候,关键的三段代码,nb=needed bytes
利用条件:1.能够覆写top chunk的size字段(因为要写入一个很大的值)
2.存在一次malloc,攻击者能控制malloc的size
3.存在另一次malloc,攻击者能够向此chunk写入数据
4.能够泄露堆地址
为什么会转化为负数,负数给有符号整型就为负数,但赋值给无符号整型时,会强制转换成ffff我们需要的内存值
House of Spirit
攻击本质:free anywhere
堆喷
0x0c0c0c0c 既可以被当作一个地址,也可以被当成汇编指令,\x0c\x0c –> OR AL,0C(NOP-like)
通过类似一大串NOP+shellcode开始,直到shellcode执行之前一直是不影响程序的一堆NOP操作 异或AL,0C不会对程序怎么样,类似NOP指令
全部评论 (0)