【流程分析】网络拉取内存加载C#木马
2021-02-13 18:58:00 Author: mp.weixin.qq.com(查看原文) 阅读量:237 收藏

本文为看雪论坛优秀文章

看雪论坛作者ID:情话布墨

1. 拖到查壳中

没有分析出来

2. 直接用火绒剑看一下调用

C# 的系统dll

运行的时候 并没有发现有什么网络请求

3. 直接拖IDA

发现IDA识别出来很多函数。看了一下字符串也没看到啥有用的,主函数一堆乱七八糟的。

仔细看主函数 一堆乱七八杂的判断和 if,但是 在这里面 它肯定要调用函数,我只发现了一个调用点。

进去分析发现了类似的代码结构(有点像llvm过的代码),它调用了InternetOpenA(导入表中有一些 winiNet http请求的函数)然后又jmp走了。

winiNetHttp请求参考网址:https://my.oschina.net/allenwen/blog/685573

4. x32dbg动态调试

直接下断 InternetConnectA,HttpOpenRequestA 看一下它的请求:

url: pastebin.com:443(0x1BB)/raw/nrSZnmgc Get Https(443)

返回值很像base64

base64解密之后 发现 开头就是 e9 0a 05 00 00 很像jmp (怀疑是shellcode)

动态调试下断点:InternetReadFile 函数返回结束的地方。

因为返回值是base64加密,而且是shellcode,所以怀疑出去之后解密数据,解密完之后把shellcode贴到内存中。

直接下memcpy,发现程序都运行起来了,它都没有copy...所以只能慢慢跟/

找到它贴shellcode的地方,然后下断点,动态跟踪。

动态调试shellcode的时候发现了C加载C#的函数。

C内存运行C#dll-参考地址:www.cnblogs.com/flyDream12315/p/6062920.html

LoadLibrary("mscoree.dll");

LoadLibrary("wininet.dll");

LoadLibrary("oleaut32.dll");

 

网络拉取shellcode base64解密 是个PE文件 esp+104 = PeDll


CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (VOID**)&pMetaHost);

 

ICLRMetaHost: 

IUnknown: 

 (pMetaHost)+0xC的位置 pMetaHost->GetRuntime(runtimeVersion, IID_ICLRRuntimeInfo, (VOID**)&pRuntimeInfo);

ICLRRuntimeInfo:

(pRuntimeInfo)+0x28的位置 pRuntimeInfo->IsLoadable(&load);


(pRuntimeInfo)+0x24的位置 pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (VOID**)&pRuntimeHost);

ICorRuntimeHost:

(pRuntimeHost)+0x28的位置 pRuntimeHost->Start()

(pRuntimeHost)+0x34的位置 pRuntimeHost->GetDefaultDomain(&pAppDomain)

(pAppDomain) 第一个函数 pAppDomain->QueryInterface(IID__AppDomain, (VOID**)&pDefaultAppDomain);

SAFEARRAY* pSafeArray = SafeArrayCreate(0x11,1,pData)

SafeArrayCreate函数相关参考地址:https://blog.csdn.net/jisuanjixu/article/details/5959186

esp+0x110 单步进去发现是 SafeArrayAccessData(pSafeArray,&pvData)

有一块循环赋值的地方,把PEdll的数据复制到了pvData中

又是一个call,单步直接进去是 SafeArrayUnaccessData(pSafeArray)

esp+0x14 = pDefaultAppDomain,(pDefaultAppDomain)+0xB4 pDefaultAppDomain->Load_3(pSafeArray, &pAssembly); 加载C#dll

pAssembly(_Assembly) (pAssembly)+0x40 pAssembly->get_EntryPoint(&pMethodInfo) 获取入口函数。 

[esp+12C] (verctorArg) = SafeArrayCreateVector(8,0,1)

esi(verctor2) = SafeArrayCreateVector(0xC,0,1)

这个shellcode进来的时候有个参数,eax = SysAllocString(arg)

SafeArrayPutElement(verctorArg,&int(0),eax)

SafeArrayPutElement(verctor2,&int(0),一个变量)

esp+C = pMethodInfo pMethodInfo->Invoke_3(obg,verctor2,&retVal) 执行程序入口函数 mian 

总结:全流程就是exe运行了一个shellcode shellcode中执行了C#的dll,所以主程序只是一个加载器而已,当获取到C# pedll的时候,其实就可以直接拉dnspy里面查看。

- End -

看雪ID:情话布墨

https://bbs.pediy.com/user-home-870690.htm

  *本文由看雪论坛 情话布墨 原创,转载请注明来自看雪社区。

# 往期推荐

公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]

球分享

球点赞

球在看

点击“阅读原文”,了解更多!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458381101&idx=2&sn=eb09d4e392128200ac259ebcfcf31459&chksm=b180dba786f752b15c7012f6fac89f91e6018e1d273309b81b622e0c75b9349f78f821200136#rd
如有侵权请联系:admin#unsafe.sh