難読化PowerShell芸入門
たいちょー
みなさん#!/bin/bash(こんにちはの意)
たいちょー
@xztaityozx_001
母語はC#
ゆるふわお嬢様系難読化シェル芸人
最近
研究で思ってたより大量のデータが集まる
DBにいれたい(DBわからん)
難読化シェル芸
難読化シェル芸わからん
こわい
難読化シェル芸
#難daコレ
ありがとうございます(見てます)
難読化シェル芸
ぞくぞくふえ~る
難読化シェル芸
解読するだけで体力を失う
困る
それぞれの個性を感じたりできて楽しい
楽しい
PowerShell芸
PowerShell芸、始めました
勉強会の問題を解くなど
PowerShellとは
PowerShell(パワーシェル)は、マイクロソフ
トが開発した拡張可能なコマンドラインイン
ターフェース (CLI) シェルおよびスクリプト言
語である。オブジェクト指向に基づいて設計さ
れており、.NET Frameworkと.NET Coreを基盤と
している。 -- Wikipediaより
PowerShell
型があり、メソッドが生えてる
"abc".ToUpper()
=> ABC
.NETにある静的メソッドも呼べる
[System.Text.Encoding]::Unicode.GetString(
[Convert]::FromBase64String("RjCTMFMw"))
=> うんこ
PowerShell芸
とりあえずFizzBuzz
1..30 | %{ ((($_, "Fizz")[$_%3 -eq 0], "Buzz")[
$_%5 -eq 0], "FizzBuzz")[$_%15 -eq 0] }
解説
1..30
seq 30と同じ
$True = 1
$False = 0
解説
()
System.Objectの配列
()[index] でアクセスできる
解説
%
ForEach-Object へのエイリアス
ループ変数 $_ を操作して各Objectを加工できる
1..3|% {$_+1}
2 3 4
解説
($_, "Fizz")[$_%3 -eq 0]
$_%3 == 0 ? "Fizz" : $_ と同じ意味
TrueとFalseがそれぞれ1,0になることを利用してる
解説
1..30 | %{ ((($_, "Fizz")[$_%3 -eq 0],
"Buzz")[$_%5 -eq 0], "FizzBuzz")[$_%15 -eq
0] }
これは15,5,3の条件演算をネストしているとい
うことになる
簡単ですね!
難読化PowerShell芸
本題です
難読化ターゲット
Get-Date
PowerShellで難daコレ
文字列を評価してもコマンドを実行しない
# bash
> d="date"
> $d
2019年 8月 2日 金曜日 15:40:35 JST
# powershell
> $d="Get-Date"
> $d
Get-Date #文字列が出力されるのみ
Invoke-Expression
Invoke-Expression
bashとかでいうところのeval
# powershell
> $d="Get-Date"
> Invoke-Expression $d
2019年8月2日 16:14:36
Invoke-Expression
$d="Get-Date"
$i="Invoke-Expression"
$i $d # $iが評価できないね!
&
Invoke-Expressionと似た動きをする
これなら何とかできそう
$d="Get-Date"
& $d
2019年8月2日 16:14:36
やること
記号のみから得られる文字列から"Get-Date"を
作り、変数に代入
& $date を実行して日付を得る
記号変数
PowerShellでは${}で囲むとほとんどの記号を変
数にできる
${"}, ${@}, ${'}
数値を作る
この先数値が必要になるので記号変数に入れて
おく
${;}=+$() # 0
${%}=++${;} # 1
${;}++ # 2
${+}=${;}*${;}*${;} # 8
PowerShellの.&>/???/??/${##}
なんかしらの文字列を得られるやつ
"$?"
""+@{}
"$?"
前のコマンドが
正常終了 => True
異常終了 => False
""+@{}
これを実行すると
System.Collections.Hashtable
という文字列が得られる
stringへのキャストでToString()が呼ばれるため
文字の切り出し
欲しい文字だけを取り出す
stringなので[]でアクセスできる
${@}=""+@{}
${@} # System.Collections.Hashtable
"${@}"[0] # S
"${@}"[-1] # e
組み立てる
ではGet-Dateを作っていきましょう!
Get-Date
a,e,tを取り出す
Collections.Hashtable
ここからa,e
True
ここからT
取り出せました
${;}=+$() # 0
${%}=++${;} # 1
${;}++ # 2
${@}=""+@{} # System.Collections.Hashtable
"${@}"[-${;}-${;}] # => "${@}"[-4] => a
"${@}"[-${%}] # => "${@}"[-1] => e
"$?"[+$()] # => "True"[0] => T
Get-Date
残念ながらG,Dがありません
System.Collections.Hashtable
False
True
どこ探してもG,Dがありません…
シグネチャからG,Dを得る
string.Insert() のシグネチャは
string Insert(int startIndex, string value)
なんとG,Dがありました!
PowerShellでシグネチャを得る
オブジェクト.メソッド名 とするとPSMethodオ
ブジェクトを得られる
stringへキャストするとシグネチャが得られる
$s="".Insert # PSMethodオブジェクトを$sに代入
"$s" # stringへキャスト
# => string Insert(int startIndex, string value)
"".Insertを作ってシグネチャを得る
このシグネチャアクセスするにはInsertを作る必要
があります
文字自体はすでに揃っていますね
$Insert="Insert"
"".$Insert # "".Insertが呼べる
できました
${;}=+$(); ${%}=++${;}; ${;}++ # ${%}=1, ${;}=2
${@}=""+@{}
${&}="${@}"[-${%}$(${;}+${;})"]+"${@}"[${%}${;}"]+"${@}"[+
$()]+"${@}"[-${%}]+"$?"[${%}]+"$?"[+$()]
${&} # inSerT 大文字小文字は関係ない
${&}="".${&} # PSMethod Object
"${&}" # string Insert(int startIndex, string value)
G,Dを取り出します
シグネチャを無事得られたのでG,Dを取りだします
できました
${;}=+$(); ${%}=++${;}; ${;}++; # ${%}=1, ${;}=2
${+}=${;}*${;}*${;} # 8
"${&}" # string Insert(int startIndex, string value)
"${&}"[-${+}] # => "${&}"[-8] => g
"${&}"[-"${%}${+}"] # => "${&}"[-18] => d
合体!!!発進!!!
${#}="${&}"[-${+}]+"${@}"[-${%}]+"$?"[+$()]+"-"+"${&}"[-"$
{%}${+}"]+"${@}"[-${;}-${;}]+"$?"[+$()]+"${@}"[-${%}]
${#} # geT-daTe
& ${#} # Get-Date が実行される
まとめ
${;}=+$();${%}=++${;};${;}++;${+}=${;}*${;}*${;};${@}=""+@
{};${&}="${@}"[-"${%}$(${;}+${;})"]+"${@}"[-"${%}${;}"]+"$
{@}"[+$()]+"${@}"[-${%}]+"$?"[${%}]+"$?"[+$()];${&}=""+$("
".${&});${#}="${&}"[-${+}]+"${@}"[-${%}]+"$?"[+$()]+"-"+"$
{&}"[-"${%}${+}"]+"${@}"[-${;}-${;}]+"$?"[+$()]+"${@}"[-${
%}];& ${#}
な、なにこれ…(ドン引き)
OMAKE
pwsh -c "Get-Date" でbashからGet-Dateできま
す
ちょっと記号難読化してみます
できました
: "$(.&>/???/??/${##}) /*/$$"; __=(${_##*.}); : ${__[${##}
+${##}]/¥/$$}; : -${_/${_%?}};
/???/?????/???/${__[${##}+${##}]:${##}:${##}}?${__[${##}]:
-${##}-${##}:${##}}? $_ # /usr/local/bin/pwsh -c
超!合体!!!!
: "$(.&>/???/??/${##}) /*/$$"; __=(${_##*.}); : ${__[${##}
+${##}]/¥/$$}; : -${_/${_%?}};/???/?????/???/${__[${##}+${
##}]:${##}:${##}}?${__[${##}]: -${##}-${##}:${##}}? $_ '${
;}=+$();${%}=++${;};${;}++;${+}=${;}*${;}*${;};${@}=""+@{}
;${&}="${@}"[-"${%}$(${;}+${;})"]+"${@}"[-"${%}${;}"]+"${@
}"[+$()]+"${@}"[-${%}]+"$?"[${%}]+"$?"[+$()];${&}=""+$("".
${&});${#}="${&}"[-${+}]+"${@}"[-${%}]+"$?"[+$()]+"-"+"${&
}"[-"${%}${+}"]+"${@}"[-${;}-${;}]+"$?"[+$()]+"${@}"[-${%}
];& ${#}'
おわり
たのしいですね
参考文献
PowerShell難読化の基礎 (1) - Binary Pulsar
https://binary-
pulsar.hatenablog.jp/entry/2018/09/01/000000
PowerShellの演算子一覧 - しばたテックブログ
https://blog.shibata.tech/entry/2015/12/03/000000
記号のみで任意のPowerShellコードを実行 - JPerl
Advent Calendar 2010 Sym Track
リンク切れ

難読化PowerShell芸入門