打法总述
[TOC] 打法总述 笔者对于这些攻击手法感觉不是很难,难的地方在于堆风水
有无off-by-null
- 一般没有uaf都是会有off-by-null可以利用进行chunk overlapping 一起到unsorted bin中
- 没有off-by-null并且没有edit一般都是打tcache了,house of botcake,这时候打tcache poison主要是通过add时候的read进行
- 打tcache有时候会和fastbin联动,不能把思维局限在tcache,fastbin也有很大的用途
- uaf和off-by-one/null都没有考虑idx负数溢出
- 还要考虑double free
是否进行orw
如果申请的chunk大小限制在0x30这种大小左右,很难布置IO链,这时候一般都是打栈溢出 如果申请的次数没有什么限制,就不需要打tcache_perthread,否则通过打tcache_perthread实现多次申请任意地址,任意地址申请受限制时总是容易忘记打这个结构 泄露栈地址也有两种方法,第一种时是把environ申请出来然后show,第二种是申请IO_2_1_stdout,然后通过stdout泄露出栈地址 参考博客
- 如果不进行libc2.31打hook即可,libc2.35打apple2这条链
- 还可以打栈溢出,如果只能largebin attack这种很难任意地址申请和泄露的,那么一般就打IO了。但如果明显可以任意地址申请和泄露,直接泄露栈地址无疑可以更快地进行orw,同时做题的时候发现libc2.31竟然不会对tcache是否是0x10对齐做检查!!!
- 如果进行,libc2.31利用 getkeyserv_handle+576
mov rdx, [rdi+8]
mov [rsp+0C8h+var_C8], rax
call qword ptr [rdx+20h]
- 发现libc2.31也有 svcudp_reply+26这个gadget,那其实也可以打house of apple2这条链了
.text:0000000000157BFA mov rbp, [rdi+48h]
.text:0000000000157BFE mov rax, [rbp+18h]
.text:0000000000157C02 lea r13, [rbp+10h]
.text:0000000000157C06 mov dword ptr [rbp+10h], 0
.text:0000000000157C0D mov rdi, r13
.text:0000000000157C10 call qword ptr [rax+28h]
- libc2.34及以下还可以打house of kiwi,house of emma太麻烦了一般都没啥人打
- libc2.35如果打FROP用apple2特有的链,如果打malloc_assert用house of cat
libc2.27-libc2.31
- tcache-key存的是heapbase+0x10
- 此时主要是打tcache,而且tcache poison相对简单
- 利用off-by-one
- 利用unsorted bin实现等价于edit的功能
- house of botcake
- tcache_perthread_struct
- stdout
- environ变量
libc2.34以下
此时还没有移除hook,仍然可以打各种hooks
- decrypt safe unlink,tcache poison有了异或加密,泄露heapbase绕过即可
- large_bin attack修改mp_.tcache_bins让largebin chunk进入tcache
- tls中管理tcache的变量(search -p heapbase+0x10)来实现任意分配 注意想要调用FSOP中_IO_OVERFLOW函数,要满足fp->_mode <= 0 && fp->_IO_write_ptr > fp->_IO_write_base,以及_lock为一个可写地址
- house of pig 结合largebin attack和tcache stashing unlink attack,利用_IO_str_overflow的malloc,memcpy,free三连
- house of pig plus 利用_IO_str_overflow中这条指令mov rdx,QWORD PTR [rdi+0x28],可以设置rdx。同时利用三连让malloc_hook为setcontent+61,进行srop
libc2.34及以上
在2.36以下还没有移除assert,2.36及以上就没有assert了
- house of kiwi 必须要有assert,同时_IO_file_jumps要可写才行
- house of emma 要能FSOP或者assert,主要是用vtable调用函数是通过偏移还没有检查这个漏洞,调用_IO_cookie_write并且覆盖cookie_io_functions_t __io_functions为目标函数 如果是FSOP会调用__overflow,如果是assert会调用__sync,注意设置好偏移执行目标函数。但是house of emma还需要绕过一个函数,因此还要用largebin attack劫持pointer guard,远程可能还需要爆破。所以这个攻击手法基本不打
- house of apple1,利用_wide_data再结合_IO_wstrn_overflow可以任意地址写任意值,再结合各种技巧来打
- house of apple2 简单又实用,有三条链都可以打,区别不是很大,自己固定打_IO_wfile_overflow
- house of cat
杂记
- exit()的使用
- house of husk
- 有时候不要只想着构造堆风水,非要实现任意地址申请,有的堆题本质就是栈溢出,甚至是ret2libc打法,不要将思维局限了