Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

超・記号オンリー難読化シェル芸

1,357 views

Published on

2018/04/07に開催された第35回シェル芸勉強会の大阪サテライトでLTしたときに使った資料です

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

超・記号オンリー難読化シェル芸

  1. 1. 超・記号オンリー難読化シェル芸 たいちょー
  2. 2. みなさん#!/bin/bash(こんにちはの意) たいちょーです  @xztaityozx_001 母語はC# 胃下垂かもしれなくて悲しい
  3. 3. 最近の難読化事情(フィクション) いくら難読化を行ったところで随所に現れるコ マンド列が難読化の可読化をしていた ls --helpから始まるもんなら 「ははーんさてはdateだな?」 そうでなくてもls --helpの出力から何か作ろうとし ているのが分かる
  4. 4. 難読化過激派の暴走 いったんは落ち着いた難読化の流れ 人間一時は納得しても、それに慣れると「もっと もっと」と欲張るのです 十分に難読化されたこれまでの手法では 「たりぬ」 結果、暴走
  5. 5. 記号オンリー難読化シェル芸 前回のシェル芸勉強会で少しだけお話しさせて いただいたkanataさんの獄炎 アルファベット2文字と記号と1、2だけでシェル 芸をする。 https://raintrees.net/news/114
  6. 6. dateコマンドの例 普通の難読化シェル芸 $(printf "%b" $(printf '%s%x' '¥x' $((0x83 ^ 0xe7))))$(ls --help|grep ^G|cut -c53)$(ls -- help|grep ^G|cut -c10)$(ls --help|grep ^G|cut - c8) まだわかる
  7. 7. dateコマンドの例 A,z,記号,1,2のみの難読化シェル芸 A=$(. 2>&1);A=${A##*.};${A:$((++z*++z*++z*z- z+++z)):$((z=z^z||++z))}${A:$((++z*++z--- z)):$((z=z^z||++z))}${A:$((++z*++z*z)):$((z=z^z||+ +z))} -- {z..A};${@:$((++z*++z*++z---z+++z--- z+++z---z)):$((z=z^z||++z))}${@:$((++z*++z*++z--- z+++z---z+++z)):$((z=z^z||++z))}${@:$((++z+++z+-- z)):$((z=z^z||++z))}${@:$((++z*++z*++z---z+++z--- z)):$((z=z^z||++z))} 何もわからない。見えない
  8. 8. 手法の説明 A=$(. 2>&1) 無から有を生み出すすべての源 後のために命の泉と名付けます A=${A##*.}; 環境に依存する文字列を取り除く Aには"filename [arguments]"だけが残る
  9. 9. 手法 変数展開を利用してブレース展開をつくればOK kanataさんによると set -- {z..A} でいいらしいので変数Aを使って ${A:19:1}${A:4:1}${A:18:1} -- {z..A}
  10. 10. 手法 結果は z y x w v u t s r q p o n m l k j i h g f e d c b a ` _ ^ ] [ Z Y X W V U T S R Q P O N M L K J I H G F E D C B A 何でもできそう
  11. 11. 課題だったところ 変数Aや${A:19:1}${A:4:1}${A:18:1} -- {z..A} などが問題 ここにはなんとアルファベットが2文字もあるの でまだまだ読める ホンマか
  12. 12. 超・記号オンリー難読化シェル芸 本当に課題なのか解りませんがなんとかアル ファベットを削ってみました 基本のやり方は前述までと同じです
  13. 13. 変数A 変数名にAを使っていたので削ります。 代わりに使えるものを記号群から探す必要があ ります 大体は式の一部だったり特殊変数だったりで使えま せん
  14. 14. 変数にできる記号 しかし変数群の中に2つ以上つなげれば変数に使 える記号がありました だ~れだ 時間切れです 正解は_(アンダーバー)です
  15. 15. 変数__ $_は直前のコマンドの引数がはいるので使えま せんが$__は変数として使えます $___も使えるので実質変数は無限個作れる 変数Aを消せた
  16. 16. ブレース展開に使うやつを消す set -- {z..A}で使っていたz,Aを削ります ブレース展開をどうにかして表現しようと思っ たのですが無理だったので別のアプローチをと りました
  17. 17. filename [arguments]で表現できるコマンド きれいなWSLのbinにあるやつから探しました ls /bin /usr/bin -1| grep -v "[^ a|e|f|g|i|l|m|n|r|s|t|u]" 使えるコマンドが64個ありました 結構ありますね
  18. 18. mtコマンド 今回採用したのはmtコマンドです 磁気テープ?を操作?するコマンド これを命の泉から作ります Usageが出力されます あとのためにこれをマナと名付けます
  19. 19. mtのUsage Usage: mt [OPTION...] operation [count] Try `mt --help' or `mt --usage' for more information. l,s,--helpがあるのでls --helpが使えます 後のためにls --helpの出力を世界樹と名付けます
  20. 20. 世界樹に含まれる文字 サクッと調べてみます ls --help|grep -o .|sort -u|tail -58|tr -d '¥n' 出力は以下みたいになってました 012345678aAbBcCdDeEfFgGhHiIkKlLmMnNoOpPqQrRsS tTuUvwWxXyYzZ
  21. 21. 世界樹の出力を得る記号難読化ワンライナー __="$(. 2>&1)"; __=${__##*.}; ___=($(${__:2*2+2+1:1}${__:2*((1+2)*(1+2)):1} 2>&1)); ${___[2*2*2-1]:2+2:1}${___[1-1]:1:1} ${___[2*2*2-1]:1-1:2*2+2}|${___[1- 1]:1+2:1}${___[2+2+1]:1:1}${___[1- 1]:2+2:1}${___[1+2]:1:1} -${___[1+2]:1- 1:1} .|${___[1-1]:1:1}${___[2*2*2]:1- 1:2}${___[1]:1:1} ${___[11- 1]:1:2}|${___[1]:1:1}${___[1-1]:2:1}${___[12+1]:1- 1:1}${___[2*2*2-1]:2+2:1} -$((22*2+12+2))
  22. 22. 世界樹に含まれない文字 j,J,V,9がありませんでした・・・ しかし世界樹をちぎればevalが作れるのでブレース 展開ができますね z=z; A=A eval echo {$z..$A} z y x w v u t s r q p o n m l k j i h g f e d c b a ` _ ^ ] [ Z Y X W V U T S R Q P O N M L K J I H G F E D C B A 9は計算すればいいですね
  23. 23. というわけで 0123456789,a~z,A~Zが作れました。 いえ~い あとはお好みで数字の部分を変数の算術演算に して完全に記号のみにするか、1と2は許してし まうかを選んで好きなコマンドを作り上げます
  24. 24. 注意:dateコマンドです ____=($(__="$(. 2>&1)"; __=${__##*.}; ___=($(${__:2*2+2+1:1}${__:2*((1+2)*(1+2)):1} 2>&1)); ${___[2*2*2-1]:2+2:1}${___[1-1]:1:1} ${___[2*2*2-1]:1- 1:2*2+2}|${___[1-1]:1+2:1}${___[2+2+1]:1:1}${___[1- 1]:2+2:1}${___[1+2]:1:1} -${___[1+2]:1-1:1} .|${___[1- 1]:1:1}${___[2*2*2]:1-1:2}${___[1]:1:1} ${___[11- 1]:1:2}|${___[1]:1:1}${___[1-1]:2:1}${___[12+1]:1- 1:1}${___[2*2*2-1]:2+2:1} - $((22*2+12+2))));${____[11+2+2]}${____[2*2*2+1]}${____[2 2*2+1]}${____[12+2*2+1]}
  25. 25. 解説 ____=( $(__="$(. 2>&1)" __=${__##*.} ___=( $(${__:2*2+2+1:1}${__:2*((1+2)*(1+2)):1} 2>&1) ) ${___[2*2*2-1]:2+2:1}${___[1-1]:1:1} ${___[2*2*2-1]:1-1:2*2+2}| ${___[1-1]:1+2:1}${___[2+2+1]:1:1}${___[1-1]:2+2:1}${___[1+2]:1:1} -${___[1+2]:1-1:1} .| ${___[1-1]:1:1}${___[2*2*2]:1-1:2}${___[1]:1:1} ${___[11-1]:1:2}| ${___[1]:1:1}${___[1-1]:2:1}${___[12+1]:1-1:1}${___[2*2*2-1]:2+2:1} -$((22*2+12+2)) )); ${____[11+2+2]}${____[2*2*2+1]}${____[22*2+1]}${____[12+2*2+1]} 命の泉 mt => マナ ls --help => 世界樹 grep -o . sort -u tail -n58 dateコマンド
  26. 26. ちなみに eval echo {y..A}でいいならマナからも作れま す。 mt --helpにe,v,a,c,h,o,l,y,Aが含まれるのでそこ から錬金すればいいです
  27. 27. 超・記号オンリー難読化シェル芸 良いところ 読めない 数字もつくれる 悪いところ 読めない 長い
  28. 28. 呪文か何かなのか・・・? 実験中はこれまでで最高に呪文感が強くて頭が おかしくなりそうでした 今回はmtを使いましたが他の64個から始めても いいと思います mt始動とかls始動とか名前を付けよう!
  29. 29. 今後の課題 スマートじゃない mt始動は結局ls --helpに頼るのでカッコよくない set -- {z..A}はシンプルでカッコいい 難読化なのにシンプルとは なにもわからない

×