O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

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

3.395 visualizações

Publicada em

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

Publicada em: Engenharia
  • Seja o primeiro a comentar

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

  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}はシンプルでカッコいい 難読化なのにシンプルとは なにもわからない

×