查看原文
其他

如何阅读只包含特殊符号的powershell脚本

LarryS 看雪学苑 2022-07-01


本文为看雪论坛优秀‍‍‍文章
看雪论坛作者ID:LarryS




基础变量


1、数字

首先根据分号将文档分为两部分,先看第一部分的内容:
('[%' |% { ${[[[[[[[} = + $() }{ ${[[[[[[[[}=${[[[[[[[}} {${[[[[[[[[[[[}= ++ ${[[[[[[[} }{${[[[} = ++${[[[[[[[} } {${[[[[[[} = ++ ${[[[[[[[} }{${[[} =++${[[[[[[[}} { ${[[[[[[[[[[[[} =++ ${[[[[[[[} }{${[[[[[[[[[[}= ++ ${[[[[[[[} }{${[[[[[[[[[}=++${[[[[[[[} } {${[[[[} = ++ ${[[[[[[[}} {${[} = ++ ${[[[[[[[} } {${[[[[[} = "["+"$( @{ })"[ ${[[[[[[[[[}] +"$(@{ })"[ "${[[[[[[[[[[[}" +"${[}" ]+"$( @{ } ) "["${[[[}"+"${[[[[[[[[}"]+ "$? "[ ${[[[[[[[[[[[} ]+ "]" }{${[[[[[[[} = "".("$(@{} ) "["${[[[[[[[[[[[}${[[}"] +"$(@{})"["${[[[[[[[[[[[}${[[[[[[[[[[}"]+"$(@{} ) "[ ${[[[[[[[[} ] +"$(@{ } )"[ ${[[}] +"$?"[ ${[[[[[[[[[[[} ] + "$(@{ } ) "[ ${[[[[[[} ] ) } {${[[[[[[[} ="$( @{})"["${[[[[[[[[[[[}${[[}"] +"$( @{ } ) "[${[[} ]+"${[[[[[[[}"[ "${[[[}${[[[[[[[[[}"] } ) ;

可以根据大括号分一下行,并且先去掉前面的'[%' |% :
{ ${[[[[[[[} = + $() } { ${[[[[[[[[} = ${[[[[[[[} } # 0{ ${[[[[[[[[[[[} = ++ ${[[[[[[[} } # 1{ ${[[[} = ++${[[[[[[[} } # 2 { ${[[[[[[} = ++ ${[[[[[[[} } # 3{ ${[[} = ++${[[[[[[[} } # 4 { ${[[[[[[[[[[[[} = ++ ${[[[[[[[} } # 5{ ${[[[[[[[[[[} = ++ ${[[[[[[[} } # 6{ ${[[[[[[[[[} = ++${[[[[[[[} } # 7 { ${[[[[} = ++ ${[[[[[[[} } # 8 { ${[} = ++ ${[[[[[[[} } # 9 { ${[[[[[} = "["+"$( @{ })"[ ${[[[[[[[[[}] +"$(@{ })"[ "${[[[[[[[[[[[}" +"${[}" ]+"$( @{ } ) "["${[[[}"+"${[[[[[[[[}"]+ "$? "[ ${[[[[[[[[[[[} ]+ "]" }{ ${[[[[[[[} = "".("$(@{} ) "["${[[[[[[[[[[[}${[[}"] +"$(@{})"["${[[[[[[[[[[[}${[[[[[[[[[[}"]+"$(@{} ) "[ ${[[[[[[[[} ] +"$(@{ } )"[ ${[[}] +"$?"[ ${[[[[[[[[[[[} ] + "$(@{ } ) "[ ${[[[[[[} ] ) } { ${[[[[[[[} = "$( @{})"["${[[[[[[[[[[[}${[[}"] +"$( @{ } ) "[${[[} ]+"${[[[[[[[}"[ "${[[[}${[[[[[[[[[}"] }

在powershell中,可以使用${变量名}的格式定义任意变量。
 
先看第一行,$()是一个空的子表达式,等价于$null,如果在前面添加上一个+,就会发生格式转换,整个值变成0。所以第一行定义了一个变量${[[[[[[[},其值为0。
 
第二行定义了另一个变量${[[[[[[[[},它的值和${[[[[[[[}一样,也是0。之后通过递增符号不断执行+1操作,从而用特殊符号表达了0~9十个数字。
 
我们可以把这里表达数字的十个变量替换成对应的数字了,此时上述代码的后三行变成了(去除了多余的空格):
{ ${[[[[[} = "["+"$( @{ })"[ 7] +"$(@{ })"[ "1" +"9" ]+"$( @{ } ) "["2"+"0"]+ "$? "[ 1 ]+ "]" }{ ${[[[[[[[} = "".("$(@{} ) "["14"] +"$(@{})"["16"]+"$(@{} ) "[ 0 ] +"$(@{ } )"[ 4] +"$?"[ 1 ] + "$(@{ } ) "[ 3 ] ) } { ${[[[[[[[} = "$( @{})"["14"] +"$( @{ } ) "[4 ]+"${[[[[[[[}"[ "27"] }

2、“CHar”

然后看倒数第三行,@{}是一个空的哈希表,如果把它放在子表达式符号$()中,并转换为字符串,即"$(@{})",就会得到字符串“System.Collections.Hashtable”,可以按照下面的索引做替换了。
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27S y s t e m . C o l l e c t i o n s . H a s h t a b l e

也就是说第7个索引是“C”,第19个索引是“H”,第20个索引是“a”。
 
$?是一个自动变量,表示上一句指令的执行情况,如果执行成功,就表示True。所以它的第1个索引就是”r”。由此得到变量${[[[[[},值为[CHar]


3、 “iex”

根据上一小节的替换规则,可以得到倒数第二行等号右侧的值为"".inSert。
 
Insert()是System.String中的一个方法名,原型为:
string Insert(int startIndex, string value)

使用
<Object>.Method name

就可以得到上述一个方法对象。倒数第二行做了一个格式转换,将方法对象转换成对应的字符串表达:
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42s t r i n g I n s e r t ( i n t s t a r t I n d e x , s t r i n g v a l u e )

至此,就可以对最后一行做一个替换,得到变量${[[[[[[[},值为iex。





脚本处理


目前得到的完整替换规则:
{ ${[[[[[[[[} = 0 } { ${[[[[[[[[[[[} = 1 }{ ${[[[} = 2 } { ${[[[[[[} = 3 }{ ${[[} = 4 } { ${[[[[[[[[[[[[} = 5 }{ ${[[[[[[[[[[} = 6 }{ ${[[[[[[[[[} = 7 } { ${[[[[} = 8 } { ${[} = 9 } { ${[[[[[} = "CHar" }{ ${[[[[[[[} = "iex" }

可以使用上述规则替换文档下半部分的脚本了。截取其中的部分内容(“CHar”换成了“Char”,不影响最终结果):
"iex([Char]83+[Char]101 +[Char]116+[Char]45 + [Char]83+[Char]116 + [Char]114+[Char]105+ [Char]99 +[Char]116+ [Char]77+[Char]111+ [Char]100 + [Char]101 + [Char]32+[Char]45 +[Char]86 + [Char]101+[Char]114 +[Char]115 +[Char]105 + [Char]111+[Char]110+ [Char]32+[Char]50 +[Char]10 +[Char]10 + [Char]102+[Char]117+[Char]110+ [Char]99+[Char]116+[Char]105 +[Char]111 + [Char]110 +[Char]32 +[Char]102 + [Char]117 + [Char]110 + [Char]99+ [Char]95 + [Char]103 +[Char]101+ [Char]116+[Char]95+[Char]112 +[Char]114+[Char]111+ [Char]99 + [Char]95+ [Char]97 + [Char]100+[Char]100+[Char]114+[Char]101 +[Char]115 + [Char]115+ [Char]32 +[Char]123 +[Char]10 +[Char]9 +[Char]80 + [Char]97 +[Char]114 + [Char]97+[Char]109 +[Char]32+[Char]40+[Char]36 +[Char]118 +[Char]97 +[Char]114+[Char]95 +[Char]109 +[Char]111+ [Char]100 + [Char]117 +[Char]108 +[Char]101 + [Char]44+[Char]32+ [Char]36 +[Char]118+ [Char]97+[Char]114+[Char]95+[Char]112 +[Char]114+[Char]111 +[Char]99+ [Char]101+ [Char]100 + [Char]117 +[Char]114+ [Char]101 +[Char]41 +[Char]9+ [Char]9+ [Char]10+ [Char]9 + [Char]36+[Char]118 +[Char]97 +[Char]114 +[Char]95 + [Char]117+[Char]110+ [Char]115 + [Char]97 +[Char]102+[Char]101+ [Char]95 +[Char]110 + [Char]97 +[Char]116+[Char]105 + [Char]118 + [Char]101+ [Char]95+[Char]109+ [Char]101 + [Char]116+ [Char]104 +[Char]111+ [Char]100 +[Char]115+ [Char]32 + [Char]61 +[Char]32 +[Char]40 + [Char]91 + [Char]65 +[Char]112+[Char]112 +[Char]68+ [Char]111+ [Char]109+ [Char]97 + [Char]105+[Char]110 +[Char]93 +[Char]58 +[Char]58 +[Char]67+[Char]117 + [Char]114+ [Char]114 + [Char]101 +[Char]110 + [Char]116 +[Char]68+[Char]111 +[Char]109 + [Char]97 + [Char]105 + [Char]110+[Char]46 +[Char]71 + [Char]101+[Char]116 + [Char]65+......

可以把iex后面的部分复制出来,用Notepad++做一下处理,去除[Char],删除空格,把+替换成空格。结果截取:
83 101 116 45 83 116 114 105 99 116 77 111 100 101 32 45 86 101 114 115 105 111 110 32 50 10 10 102 117 110 99 116 105 111 110 32 102 117 110 99 95 103 101 116 95 112 114 111 99 95 97 100 100 114 101 115 115 32 123 10 9 80 97 114 97 109 32 40 36 118 97 114 95 109 111 100 117 108 101 44 32 36 118 97 114 95 112 114 111 99 101 100 117 114 101 41 9 9 10 9 36 118 97 114 95 117 110 115 97 102 101 95 110 97 116 105 118 101 95 109 101 116 104 111 100 115 32 61 32 40 91 65 112 112 68 111 109 97 105 110 93 58 58 67 117 114 114 101 110 116 68 111 109 97 105 110 46 71 101 116 65 115 115 101 109 98 108 105 101 115 40 41 32 124 32 87 104 101 114 101 45 79 98 106 101 99 116 32 123 32 36 95 46 71 108 111 98 97 108 65 115 115 101 109 98 108 121 67 97 99 104 101 32 45 65 110 100 32 36 95 46 76 111 99 97 116 105 111 110 46 83 112 108 105 116 40 39 92 92 39 41 91 45 49 93 46 69 113 117 97 108 115 40 39 83 121 115 116 101 109 46 100 108 108 39 41 32 125 41 46 71 101 116 84 121 112 101 40 39 77 105 99 114 111 11......

然后使用CyberChef的From CharCode做一下转换,得到脚本:


到这里其实已经得到了正常的Powershell脚本了。





额外处理


还可以对其中的base64编码字符串进行一个解码,并根据代码进行一个异或处理,得到:
 
 
可以看到其中的C2地址42.192.152.182

参考文章:Understanding Invoke- “X” Special Character Encoding




看雪ID:LarryS

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

*本文由看雪论坛 LarryS 原创,转载请注明来自看雪社区



# 往期推荐

1.栈与栈帧的调试

2.python_mmdt:ssdeep、tlsh、vhash、mmdthash对比

3.CVE-2021-31956分析与利用

4.malloc源码分析

5.Windows本地代码执行漏洞(CVE-2012-1876)x86/x64平台分析

6.栈溢出原理与实践之读书笔记






球分享

球点赞

球在看



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

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存