打法总述

[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打法,不要将思维局限了