Heap Day

  hkwany       2017-08-06 22:19:33 842  2

堆空间不一定连续

本次面向32bitHeap

不同的系统有不同堆管理机制

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的检查机制,可以这样来实现,通过freemalloc结合,freechunk2(100大小)freechunk3(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 chunksize字段(因为要写入一个很大的值)

                    2.存在一次malloc,攻击者能控制mallocsize

                    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指令

                                        

请先登录
+1 已点过赞
2
分享到:
登录后才能发贴或参与互动哦! 点击登录

全部评论 (0)