pwn
heap-2.23
程序逻辑
1 | void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) |
存在 uaf,通过申请unsortedbin 去泄露libc基地址后,fastbin attack,通过错位字节绕过size检查的宏,写malloc hook为one gadget 触发 one gadget拿shell
exp
1 | from pwn import * |
heap-2.27
逻辑与漏洞和2.23相同,2.27中加入了tcache 可以使用tcache poison去实现任意地址写的原语写free hook去getshell
exp:
1 | from pwn import * |
heap-2.31
glibc 2.31 程序逻辑和漏洞 与 glibc 2.23相同,加入tcache后,fastbin attack 关于chunk_size的检查的宏就移除了,同时也可以通过tcache poison实现任意地址写,写free hook为system,之后free一个内容为binsh的堆触发free hook执行 system binsh
exp
1 | from pwn import * |
heap-2.35
iofile house of apple2或者是 environ泄露栈地址栈上写rop
heap-2.39
2.39 程序的逻辑和前面几个题目的逻辑不太一样,能申请的堆块最小为0x40f ,最大为 0x1000
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
https://www.freebuf.com/articles/system/232676.html
很明显是large bin attack,large bins是一组双向链表,每个bin是一个独立的双链表,其中fd_nextsize指向比当前bin size小的最大bin,bk_nextsize指向比当前bin size大的最小bin,large bin 用分段存储的方式存储每个bin,其中在同一个范围内相邻的bin都是等差的,每个范围就是一个等差数列
index | size范围 |
---|---|
64 | [0x400,0x440) 相差0x40 |
65 | [0x440,0x480)相差0x40 |
…… | ……相差0x40 |
96 | [0xc00,0xc40)相差0x40 |
97 | [0xc40,0xe00)相差0x1c0 |
98 | [0xe00,0x1000)相差0x200 |
chunk相关的结构体
1 | /* |
large bin attack 主要是在victim插入large bin的时候进行利用,victim在ptmalloc2中是指刚刚free掉还没有插入链表这种状态的堆块
1 | victim_index = largebin_index (size); |
关键位置是在这里,可以有uaf的情况下,可以实现往任意地址写一个堆地址
1 | else//如果不同,则说明应该插在这个链前面 |
具体的利用方法是申请 一大一小index相同属于large bin范围的堆块,先释放掉大堆块,然后再释放小堆块,将小堆块的bk_nextsize和fd_nextsize 修改成 target - 0x20的地址,之后再申请一个大于这两个堆块的内存,就可以实现往targe写一个堆地址的攻击。
有了任意地址写一个堆地址的原语还不够,还需要配合iofile相关的攻击和fsop的思想伪造iofile的虚表实现call任意地址,fsop的思想是从main返回或者主动call exit的时候会遍历_IO_list_all中的每一个iofile结构体,如果满足条件就会调用结构体中的vtable _overflow函数,利用large bin attack往io list all中写一个堆地址,然后在堆上伪造ioflie结构体和虚假的vtable,overflow中写上one gadget去提权,但是在高版本glibc中,有对vtable地址范围检测的代码
house of apple2 中 IO_wfile_overflow这条调用链是 将vtable覆盖成 io_wfile_jumps,同时保证io_write_ptr大于 io_write_base 就会调用 _wide_data->vtable- > overflow函数
其中 flag还可以控制rdi,但是flag是四个字节的,所以要控制的地方有这几个,io_write_ptr > io_write_base,vtable == io_wfile_jumps,wide_data = 伪造的wide_data 上面有vtable,vtable中有one gadget或者是system的值
io_list_all结构体 stderr
1 | pwndbg> p *_IO_list_all |
exp
1 | from pwn import * |