Successfully reported this slideshow.
Your SlideShare is downloading. ×

難読化PowerShell芸入門

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 46 Ad

More Related Content

Slideshows for you (20)

More from xztaityozx (20)

Advertisement

Recently uploaded (20)

難読化PowerShell芸入門

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

×