pwn
你满了,那我就漫出来了![补]
1 | int __cdecl __noreturn main(int argc, const char **argv, const char **envp) |
1 | unsigned __int64 delete() |
1 | unsigned __int64 add() |
题目没有uaf,但是在add的时候有一个off by null,可以通过off by null 触发一次堆合并 构造 一个heap overlap的现象,产生uaf
构造一个这样的情况,在add heap3的时候,heap4的低位一个字节就会被覆盖成 0x00,如果在创建 heap4的时候size 大于等于 0xf8,这时候chunk的大小为 0xf0 + 0x10(size + 8) + 1(prev_inuse),在add heap3的时候 prev_inuse就会被覆盖,再free掉 heap4的时候就会触发 前向合并,将 heap 1 2 3 4合并在一起
1 | heap 1(free) (content "AAAA") |
这时候再malloc 5 6 7 8 那就会产生一个堆重叠现象
1 | 1 - 5 |
这时候2 - 6 3 - 7 就会产生uaf,可以进行double free
所以利用思路是,先通过off by null构造一个heap overlap,产生uaf 泄露libc的地址,再通过uaf 来double free,把free_hook的地址写成system,去free掉一个内容为binsh的堆,触发system(binsh)
1 | from pwn import * |
Elden Ring Ⅲ[补]
https://www.freebuf.com/articles/system/232676.html
利用large bin attack往mp_结构体中 存储 tcache大小的位置写一个堆地址,这样题目给的size范围 free掉后能进到tcache bin里面,然后就变成 tcache poison了,2.32 malloc_hook free hook还没有移除,用tcache poison写free hook为system的地址,然后free掉 /bin/sh的堆,触发 system(binsh) getshell
1 | from pwn import * |