house_of_orange(配合FSOP)
原理介绍
House of Orange能达到的效果:
能在没有free的情况下将top chunk释放到unsortedbin中,便于leak libc地址和堆地址
实现条件:
存在堆溢出能控制top chunk的size,并且可以申请的内存大小要大于top chunk的size
这一部分可以在没有free的情况下将top chunk加入到unsortedbin中,方便leak libc地址和堆地址。
具体原理:
当我们申请的size大小超过top chunk时,malloc重新申请一块区域作为top chunk,并且把之前的top chunk加入到unsortedbin中,所以就可以通过堆溢出修改top chunk的size,然后申请一个超过此size的chunk,就会触发。修改的size也有要求
不能太小,要大于0x10(MINSIZE)
topchunk的结束地址(当前地址 + size)要与页基址对齐,一般就是0x1000(结尾三个0)
prev_inuse = 1
FSOP
结构体
12345struct _IO_FILE_plus{ _IO_FIL ...
house_of_lore
原理
通过伪造smallbin中chunk的bk指针,指向fake_chunk。因为当malloc时,会根据bk指针去寻找。所以就是相当于伪造一个chunk加入到smallbin链表中,并且这个伪造的chunk在原本chunk后面,即原本chunk的bk指针指向fake_chunk。同时fake_chunk的fd要指向原本的chunk。这样才能绕过链表检测。然后malloc两次smallbin大小的chunk,就能申请到fake_chunk
条件
能修改smallbin的bk指针,指向fake_chunk
能修改fake_chunk的fd,指向smallbin中的chunk
申请两次smallbin,即可申请出fake_chunk
要想free_chunk从unsortedbin进入到smallbin中,只要申请一个大于unsortedbin中chunk大小的即可
题目
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455int __ ...
house_of_roman
题目虽然叫house_of_roman,但是好像没有利用到。先介绍一下house_of_roman的利用手法
主要用于程序无打印功能,在不泄露libc地址的前提下,通过低位地址写+爆破的方法来bypass ALSR。
通过低位地址写修改fastbin的fd,修改到malloc_hook-0x23
通过unsortedbin attack,将main_arean地址写入malloc_hook
使用fastbin attack,通过低位地址写修改malloc_hook中的地址为one gadget
一般此方法很少使用,需要爆破12bit,所以成功率只有1/4096。
漏洞点
存在UAF
攻击思路
由于这道题是静态编译的,所以攻击思路有所差别。并且给出了后门函数,此时就应该想到,如果修改才能触发后门函数。因为没有show函数,无法泄露libc,所以在不修改malloc_hook和free_hook的情况下,修改fini_array是一个好选项。
如何才能修改fini_array呢?控制malloc附近chunk吗?但是无法伪造合适的size。所以可以利用bss段控制ptr的指针。想要控 ...
house_of_spirit
原理
house_of_spirit的原理就是伪造一个chunk,然后释放掉这个fake_chunk再申请出来,就可以使用这个chunk。需要绕过的检测是fake_chunk的size和next_chunk的size。
fake_chunk 的 size 大小需要满足对应的 fastbin 的需求(<= 128 on x64),同时也得对齐
fake_chunk 的 ISMMAP 位不能为 1,因为 free 时,如果是 mmap 的 chunk,会单独处理
fake_chunk 的 next chunk 的大小不能小于 2 * SIZE_SZ,同时也不能大于av->system_mem
题目详情
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061int __cdecl __noreturn main(int argc, const char **argv, const char **envp)& ...
house_of_storm
回顾基础
house_of_storm这一利用方法是Unsortedbin_Attack和Largebin_Attack两种打法相结合。
Unsortedbin_Attack
123bck = victim->bkunsorted_chunks(av)->bk = bckbck->fd = unsorted_chunks(av)
当修改unsortdbin的bk为Target_addr时,然后通过malloc将此unsortedbin分配出去时,就会发生上面三个步骤。
此时victim->bk就是Target_addr,然后第二步会将Target_Addr赋值到main_arena+88的bk处。
第三步将Target_addr的fd修改为main_arena+88。所以Target_addr+10处会被修改为一个超大值。
Largebin_Attack
1234567891011121314else{ victim->fd_nextsize = fwd; victim->bk_nextsize = fwd->bk_nex ...
off-by-null分配bss段
漏洞点
存在off-by-one
攻击思路
利用off-by-null堆块向前合并,然后再利用double_free分配到bss段。修改bss段的Chunk的地址为free_got。修改free_got地址为puts,泄露libc地址,然后再修改为system。
EXP
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697from pwn import *from ctypes import *from libcfind import *from LibcSearcher import*import base64import syscontext(os='linux', arch='amd64', log_level='d ...
off-by-one分配bss段
漏洞点
off-by-one漏洞
攻击思路
由于程序没有show功能,所以无法直接通过unsortedbin泄露libc出来。
size和chunk是连在一起的,可以在此处伪造一个chunk,然后申请到这个chunk,就可以修改chunk为got表地址,可以修改free_got为puts,然后泄露libc地址,再修改为system即可。
EXP
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102from pwn import *from ctypes import *from libcfind import *from LibcSearcher import*import base64import syscontext(os='l ...
Unsortedbin_Attack
magic大于28800即可。所以可以利用unsortedbin_attack来进行利用,unsortedbin_attack的作用就是可以修改任意地址内容为超大值。
Unsortedbin_Attack原理
当某堆块victim从unsorted bin list中取出时,会进行bck = victim->bk; unsorted_chunks(av)->bk = bck; bck->fd = unsorted_chunks(av);的操作。
当修改Unsortedbin的bk为magic_addr-0x10。
victim此时相当于0x129c030这个堆块。
bck = victim->bk相当于bck = 0x60209c
unsorted_chunks(av)->bk = bck相当于unsorted_chunks(av)->bk = 0x60209c
bck->fd = unsorted_chunks(av)相当于0x60209c+0x10=main_arena+88
EXP
123456789101112131415161 ...
fastbin-uaf
1234567891011121314151617def add(size,content): rl("Your choice :") sl('1') rl("Note size :") sl(str(size)) rl("Content :") sl(content)def delete(index): rl("Your choice :") sl('2') rl("Index :") sl(str(index))def show(index): rl("Your choice :") sl('3') rl("Index :") sl(str(index))
三个功能,漏洞点在delete函数,存在UAF
思路
先add三次堆块
123add(0x10,'a')add(0x8, ...
off-by-null堆块向前合并
程序分析
12345678910111213141516171819202122232425def add(size,content): rl("> ") sl('1') rl('size') sl(str(size)) rl("content:") sl(content)def delete(index): rl("> ") sl('2') rl("index:") sl(str(index))def show(index): rl("> ") sl('3') rl("index:") sl(str(index))def edit(addr,num): rl("> ") sl('4') rl("addr:&quo ...