ROP与SROP技术在Linux Pwn中的应用分析
字数 1535 2025-12-20 12:02:58
ROP与SROP技术在Linux Pwn中的应用分析
一、ROP技术基础
1.1 ROP保护机制RELRO详解
RELRO(Relocation Read-Only)重定位段只读保护分为三个等级:
NO RELRO:
- 保护未开启状态
- 所有重定位段均可写,包括.dynamic、.got、.got.plt
Partial RELRO:
- GCC编译的默认配置
- .dynamic、.got被标记为只读
- 强制将ELF内部数据段.got、.got.plt放到外部数据段.data、.bss之前
- 防止程序数据段溢出改变内部数据段的值
- .got.plt仍然可写,可改写GOT表劫持控制流
Full RELRO:
- 继承Partial RELRO的所有保护
- .got.plt也被标记为只读
- 延迟绑定技术被禁止
- 所有外部函数地址在程序装载时解析、装入并标记为只读
- GOT表中link_map和dl_runtime_resolve项置为0
1.2 特殊参数利用技巧
在Unix/Linux系统中,除了常见的sh参数外,还存在其他可达到RCE效果的参数:
# 示例:利用$0获取shell
# 当sh参数被过滤时,可以使用$0作为替代方案
payload = b'\x24\x30' # '$0'的小端序表示
1.3 端序处理与内存布局
小端序处理:
# 内存中的写入效果:\x24\x30\x00\x73\x91
# 在gdb中呈现:0x4049d0 ◂◂— 0x9173003024 /* '$0' */
# 使用pwntools打包:
p8(0x24) + p8(0x30) + p8(0x00) + p8(0x73) + p8(0x91)
二、SROP技术深入分析
2.1 32位SROP技术
信号帧结构特点:
- sigreturn调用需要80字节(0x50)长度
- 32位系统调用号较大
- read函数有足够写入空间,利用read返回值无需提前布局
32位寄存器控制:
0x80497d8 <func+22> lea edx, [ebp - 0x12] ; EDX => 0x80ed9ee
0x80497db <func+25> push edx
0x80497dc <func+26> push 0
0x80497de <func+28> mov ebx, eax ; EBX => 0x26
0x80497e0 <func+30> call read <read>
利用要点:
- 聚焦栈空间控制而非寄存器
- 利用压栈操作控制参数
- 当ebp地址已知时可实现精确控制
- syscall调用需要0x54字节长度
2.2 64位SROP技术
信号帧完整结构:
0byte | 8byte
syscall | uc_flags
&uc | uc_stack.ss_sp
uc_stack.ss_flags | uc_stack.ss_size
r8 | r9
r10 | r11
r12 | r13
r14 | r15
rdi | rsi
rbp | rbx
rdx | rax
rcx | rsp
rip | eflags
cs/gs/fs | err
trapno | oldmask
(unused) | cr2 (segfault addr)
&fpstate | __reserved
sigmask |
三、高级利用技术
3.1 libc劫持技术
环境配置:
# 安装glibc-all-in-one
# 安装patch工具
# 使用patchelf自动切换libc
patchelf --set-interpreter /path/to/ld ./binary
patchelf --set-rpath /path/to/libc ./binary
libc GOT表劫持:
- 劫持libc函数内部的GOT表
- 利用libc.so.6中函数实现,如puts调用j_strlen()
- 跳转地址为libc.address + offset
- 可修改为one-gadget或特定gadget
多次劫持技术:
- 第一次劫持:执行gadget设置one-gadget条件
- 第二次劫持:执行one-gadget
- 示例:mov rdx, r10(当r10为0时可设置rdx=0满足ogg条件)
3.2 栈地址泄露技术
利用环境变量:
# Python实现栈地址泄露
import os
# 通过环境变量布局获取栈地址信息
四、实战例题分析
4.1 例题一:only_read
gadget查找与利用:
0x0000000000401187 : add eax, 0x2ebb ; add dword ptr [rbp - 0x3d], ebx ; nop ; ret
栈帧布局:
- open函数栈帧铺垫
- read函数栈帧铺垫
- write函数栈帧铺垫
利用流程:
- 全部数据写入
- 通过leave_ret指令依次执行
- 完整的exp编写
4.2 例题二:强网杯stack
关键技术点:
- 连续SROP技术应用
- 信号帧的精确构造
- 系统调用链的构建
五、调试与问题解决
5.1 常见问题处理
段错误调试:
- 检查内核架构设置
- 验证信号帧结构完整性
- 确认寄存器值正确性
IDA使用技巧:
- 在options→general中开启16进制显示
- 手动查找特定字节
- 分析代码段布局
5.2 脚本开发要点
字节查找脚本:
# 用于定位特定字节的脚本模板
# 支持小端序效果研究
# 内存映射关系分析
利用脚本结构:
- 参数传递处理
- 内存布局分析
- 利用链构造
- 调试信息输出
六、技术发展趋势
6.1 防护绕过技术
- 针对Full RELRO的利用方法
- libc段写入技术发展
- 新型gadget发现技术
6.2 自动化工具
- 利用链自动生成
- 防护检测与绕过
- 漏洞利用框架集成
本教学文档涵盖了ROP和SROP技术的核心知识点,从基础概念到高级利用技术,包括32位和64位系统的差异处理,以及实际例题的详细分析。重点突出了信号帧构造、libc劫持、防护绕过等关键技术,为深入理解Linux Pwn技术提供了完整的知识体系。