论坛首页 安全编程开发区 阅读主题

[原创]利用NtReadVirtualMemory实现IAT中规避高危API

450 浏览 2 回复
#1 楼主 2026-06-01 21:09:06
Win32 API实现最简单的Shellcode Loader如下,代码中包含注释,可以看到每条语句的含义上述代码编译执行后,Meterpreter可成功收到反连,如下图
通过PE-bear查看,可以看到IAT中存在之前用到的几个Win32 API,如下图
然后进化出通过LoadLibrary、GetProcAddress实现的动态API调用,代码中包含注释,可以看到每条语句的含义上述代码编译执行后,Meterpreter可成功收到反连,如下图
通过PE-bear查看,可以看到IAT中不再有之前的几个Win32 API,仅有LoadLibrary、GetProcAddress,如下图
再进化后,当今动态获取函数地址主流的方式是查询PEB和EAT,这样在IAT中连GetModuleHandle、GetProcAddress也不会出现,甚至还可以遍历内存,通过特征匹配定位函数,进而动态获取函数地址,不过今天要分享的是一个好玩的东西,通过故意泄露内存地址,然后通过NtReadVirtualMemory读取内存来获取函数地址首先我们有这样一个工具resolve.c,传入NtReadVirtualMemory的地址、DLL名称、函数名称后,可以计算出函数地址代码比较多我就不贴出来了,基本原理是通过Native API解析PE及PEB,进而获取DLL基址和函数地址,展开讲的话内容比较多,由于不是本篇文章的重点,先不去细究VS2022下编译后,用法如下图接下来的问题是如何获得NtReadVirtualMemory的地址编译后执行如下将Leak-1.exe传到VT上,可以看到是11/72的检测率上面的代码太少了,很容易被检测,我们用AI生成一个C++实现的200行的任务管理器,并将上面的代码插入其中,当输入我们自定义的z时,会输出NtReadVirtualMemory的地址将Leak-2.exe传到VT上,可以看到是5/72的检测率,检测率降低了将近一半尝试用AI生成别的程序,包括涉及进程管理的控制台任务管理器、涉及文件操作的控制台学生成绩管理系统、甚至不涉及进程管理和文件操作的数学运算、C语言版本、C++版本、加上元数据,传到VT上后,至少会有2个杀毒引擎检测到,实在无奈不过,尽管VT上显示Microsoft将其标识为恶意的,但在本地Defender中,并不会查杀下述代码是一个典型的格式化字符串漏洞,使用sprintf将格式化数据写入input时,由于没有指定变量,所以会随机打印栈上的值,其中就包括上面定义的leakme1的值,也就造成了内存地址泄露如果直接在VS2022中编译,默认会带有各种优化,导致不能触发格式化字符串漏洞,需要使用如下命令编译执行后可以看到,输出的四个地址中,有一个是NtReadVirtualMemory的地址下述代码原理和上面有点类似,字符数组buffer只有8字节,在栈上越界读,可以读到保存NtReadVirtualMemory地址的变量,之所以选择ptr[23]-ptr[16],是经过测试发现,这几个字节保存的是NtReadVirtualMemory地址使用如下命令编译执行后可以看到,成功输出的地址下述代码原理和上面的栈越界读基本一致使用如下命令编译编译后执行,可以看到,成功输出了NtReadVirtualMemory的地址上述代码,结合AI生成的代码,执行后如下图在Defender下测试,不会被拦截把输出的函数地址和resolve相结合,可以成功获取到NTAPI的地址#include <windows.h>

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-287815.htm
#2 2026-06-01 21:09:06
可以私聊吗
#3 2026-06-01 21:09:06
师傅可以加我微信:yibudengtian1

请登录后参与讨论

立即登录 注册账号