2024 WMCTF-PWN(BlindVM babysigin evm magicpp)
字数 1888 2025-08-20 18:18:11

WMCTF 2024 PWN题解:BlindVM、babysigin、evm、magicpp

BlindVM 题解

题目概述

  • 检查保护:Partial RELRO, NX enabled, PIE enabled
  • 关键提示:使用堆喷射(heap spraying)使堆空间与LIBC空间连续

关键知识点

  1. 线程堆栈分配机制

    • __pthread_create_2_1 通过mmap分配0x801000大小的线程栈
    • 分配后被分割成800000和1000两部分
  2. 线程堆初始化流程

    • __GI___libc_malloc -> tcache_init -> arena_get -> arena_lock -> arena_get2 -> _int_new_arena -> new_heap -> alloc_new_heap
    • 初始分配大小:max_size << 1 = 8000000
  3. 堆扩展机制

    • 当分配大小超过topchunk但小于0x20000时:
      • 调用grow_heap增加heap_info的size
      • 设置新的topchunk大小
    • 当分配大小≥0x20000时:
      • 直接通过mmap分配
  4. 漏洞利用思路

    • 分配heap_info空间使topchunk无法扩展
    • 申请大于0x20000的空间填充heap到libc部分
    • 修改unsortedbin的fd指向libc对应的heap_info的ar_ptr
    • 通过部分写控制ar_ptr
    • 修改topchunk的size
    • 最终实现控制heap_info和grow_heap,覆盖libc
  5. libc函数地址解析

    • dl_fixup中根据字符串找到函数对应的结构体
    • 结构体存储偏移量,最终地址为l_addr(库加载地址)+offset

利用步骤

  1. 通过堆喷射使堆空间与libc空间连续
  2. 控制heap_info结构
  3. 修改topchunk大小
  4. 覆盖libc关键数据
  5. 劫持控制流

babysigin (LLVM pass题)

题目概述

  • 提供了mmap、open、read、write等函数
  • 需要通过LLVM pass分析

关键知识点

  1. LLVM IR基本概念

    • Module: 整个程序的顶层容器
    • Function: 函数定义
    • Basic Block: 基本代码块
  2. 逆向分析要点

    • 使用opt -load ./WMCTF.so -WMCTF -enable-new-pm=0 ./llk.bc启动
    • 分析pass对IR的修改
  3. 关键检查点

    • 变量名需要包含".addr"
    • 递归调用层次检查
    • 全局变量初始化检查
  4. 函数调用链分析

    void func1(const char *arg) {
        WMCTF_MMAP(0x7890);
        WMCTF_OPEN(recrusive);
        WMCTF_READ(0x6666);
        WMCTF_WRITE(GLOBAL_CONSTANT);
    }
    
  5. 字符串处理

    • 全局变量声明与IR对应关系
    • 字符串常量在IR中的表示

解题思路

  1. 构造满足pass检查的函数调用链
  2. 通过全局变量传递关键数据
  3. 绕过递归层次限制
  4. 最终触发后门函数

evm题解

题目概述

  • 检查保护:Partial RELRO, Canary found, NX enabled, No PIE
  • 自定义虚拟机实现

关键知识点

  1. 虚拟机指令分析

    • 寄存器操作指令格式
    • 内存访问指令
    • 控制流指令
  2. 指令解码

    result = (BYTE1(code) >> 4) & 7;
    dest = ((unsigned __int16)code >> 7) & 0x1F;
    src_1 = (code >> 15) & 0x1F;
    
  3. 页表管理

    • 自定义页表实现
    • 物理地址转换机制
  4. 漏洞利用

    • 后门函数存在/bin/sh地址
    • 通过第一个页表修改第二个页表内容
    • 寄存器越界修改

利用步骤

  1. 构造特定指令序列
  2. 修改页表项内容
  3. 控制寄存器值
  4. 触发后门函数

magicpp题解

题目概述

  • 检查保护:Partial RELRO, Canary found, NX enabled, PIE enabled
  • 文件操作功能

关键知识点

  1. 漏洞发现

    • 通过fuzz发现unsorted bin corruption
    • 特定操作次数后出现崩溃
  2. 漏洞成因

    • vector扩容时free旧内存
    • use-after-free修改unsorted bin的fd
  3. 信息泄露

    • 通过/proc/self/maps泄露地址
    • 获取heap、libc、stack、ld地址
  4. 利用方法

    • 修改tcache的fd
    • 攻击libc GOT表
    • 可能的攻击目标:
      • IO house of cat
      • exit处理流程
      • libc GOT表函数

利用步骤

  1. 泄露内存布局
  2. 构造特定内存布局
  3. 触发use-after-free
  4. 修改关键指针
  5. 劫持控制流

总结

这些题目涵盖了多种漏洞利用技术:

  • 堆布局与堆喷射
  • LLVM IR分析与pass绕过
  • 自定义虚拟机漏洞利用
  • 复杂内存破坏漏洞利用

关键点在于理解每种环境下的内存管理机制和精心构造利用链。

WMCTF 2024 PWN题解:BlindVM、babysigin、evm、magicpp BlindVM 题解 题目概述 检查保护:Partial RELRO, NX enabled, PIE enabled 关键提示:使用堆喷射(heap spraying)使堆空间与LIBC空间连续 关键知识点 线程堆栈分配机制 : __pthread_create_2_1 通过mmap分配0x801000大小的线程栈 分配后被分割成800000和1000两部分 线程堆初始化流程 : __GI___libc_malloc -> tcache_init -> arena_get -> arena_lock -> arena_get2 -> _int_new_arena -> new_heap -> alloc_new_heap 初始分配大小:max_ size < < 1 = 8000000 堆扩展机制 : 当分配大小超过topchunk但小于0x20000时: 调用 grow_heap 增加heap_ info的size 设置新的topchunk大小 当分配大小≥0x20000时: 直接通过mmap分配 漏洞利用思路 : 分配heap_ info空间使topchunk无法扩展 申请大于0x20000的空间填充heap到libc部分 修改unsortedbin的fd指向libc对应的heap_ info的ar_ ptr 通过部分写控制ar_ ptr 修改topchunk的size 最终实现控制heap_ info和grow_ heap,覆盖libc libc函数地址解析 : 在 dl_fixup 中根据字符串找到函数对应的结构体 结构体存储偏移量,最终地址为l_ addr(库加载地址)+offset 利用步骤 通过堆喷射使堆空间与libc空间连续 控制heap_ info结构 修改topchunk大小 覆盖libc关键数据 劫持控制流 babysigin (LLVM pass题) 题目概述 提供了mmap、open、read、write等函数 需要通过LLVM pass分析 关键知识点 LLVM IR基本概念 : Module: 整个程序的顶层容器 Function: 函数定义 Basic Block: 基本代码块 逆向分析要点 : 使用 opt -load ./WMCTF.so -WMCTF -enable-new-pm=0 ./llk.bc 启动 分析pass对IR的修改 关键检查点 : 变量名需要包含".addr" 递归调用层次检查 全局变量初始化检查 函数调用链分析 : 字符串处理 : 全局变量声明与IR对应关系 字符串常量在IR中的表示 解题思路 构造满足pass检查的函数调用链 通过全局变量传递关键数据 绕过递归层次限制 最终触发后门函数 evm题解 题目概述 检查保护:Partial RELRO, Canary found, NX enabled, No PIE 自定义虚拟机实现 关键知识点 虚拟机指令分析 : 寄存器操作指令格式 内存访问指令 控制流指令 指令解码 : 页表管理 : 自定义页表实现 物理地址转换机制 漏洞利用 : 后门函数存在/bin/sh地址 通过第一个页表修改第二个页表内容 寄存器越界修改 利用步骤 构造特定指令序列 修改页表项内容 控制寄存器值 触发后门函数 magicpp题解 题目概述 检查保护:Partial RELRO, Canary found, NX enabled, PIE enabled 文件操作功能 关键知识点 漏洞发现 : 通过fuzz发现unsorted bin corruption 特定操作次数后出现崩溃 漏洞成因 : vector扩容时free旧内存 use-after-free修改unsorted bin的fd 信息泄露 : 通过/proc/self/maps泄露地址 获取heap、libc、stack、ld地址 利用方法 : 修改tcache的fd 攻击libc GOT表 可能的攻击目标: IO house of cat exit处理流程 libc GOT表函数 利用步骤 泄露内存布局 构造特定内存布局 触发use-after-free 修改关键指针 劫持控制流 总结 这些题目涵盖了多种漏洞利用技术: 堆布局与堆喷射 LLVM IR分析与pass绕过 自定义虚拟机漏洞利用 复杂内存破坏漏洞利用 关键点在于理解每种环境下的内存管理机制和精心构造利用链。