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

More Related Content

What's hot

2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
智啓 出川
 

What's hot (20)

How A Compiler Works: GNU Toolchain
How A Compiler Works: GNU ToolchainHow A Compiler Works: GNU Toolchain
How A Compiler Works: GNU Toolchain
 
第1回 配信講義 計算科学技術特論A (2021)
第1回 配信講義 計算科学技術特論A (2021)第1回 配信講義 計算科学技術特論A (2021)
第1回 配信講義 計算科学技術特論A (2021)
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
 
ret2dl resolve
ret2dl resolveret2dl resolve
ret2dl resolve
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
汎用ニューラルネットワークポテンシャル「PFP」による材料探索_MRS-J2021招待講演_2021/12/15
汎用ニューラルネットワークポテンシャル「PFP」による材料探索_MRS-J2021招待講演_2021/12/15汎用ニューラルネットワークポテンシャル「PFP」による材料探索_MRS-J2021招待講演_2021/12/15
汎用ニューラルネットワークポテンシャル「PFP」による材料探索_MRS-J2021招待講演_2021/12/15
 
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
2015年度GPGPU実践プログラミング 第6回 パフォーマンス解析ツール
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
 
PPAPを何とかしたいがPHSも何とかしたい
PPAPを何とかしたいがPHSも何とかしたいPPAPを何とかしたいがPHSも何とかしたい
PPAPを何とかしたいがPHSも何とかしたい
 
Deep learningの発展と化学反応への応用 - 日本化学会第101春季大会(2021)
Deep learningの発展と化学反応への応用 - 日本化学会第101春季大会(2021)Deep learningの発展と化学反応への応用 - 日本化学会第101春季大会(2021)
Deep learningの発展と化学反応への応用 - 日本化学会第101春季大会(2021)
 
What Can Compilers Do for Us?
What Can Compilers Do for Us?What Can Compilers Do for Us?
What Can Compilers Do for Us?
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
 
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
 
Shunsuke Horii
Shunsuke HoriiShunsuke Horii
Shunsuke Horii
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
GNU ld的linker script簡介
GNU ld的linker script簡介GNU ld的linker script簡介
GNU ld的linker script簡介
 
私を SKI に連れてって
私を SKI に連れてって私を SKI に連れてって
私を SKI に連れてって
 
ENEOSにおける低炭素技術への挑戦~汎用原子レベルシミュレータMatlantis™の共同開発者とユーザーの視点から~
ENEOSにおける低炭素技術への挑戦~汎用原子レベルシミュレータMatlantis™の共同開発者とユーザーの視点から~ENEOSにおける低炭素技術への挑戦~汎用原子レベルシミュレータMatlantis™の共同開発者とユーザーの視点から~
ENEOSにおける低炭素技術への挑戦~汎用原子レベルシミュレータMatlantis™の共同開発者とユーザーの視点から~
 

More from xztaityozx

More from xztaityozx (20)

呪符式高速詠唱シェル芸2
呪符式高速詠唱シェル芸2呪符式高速詠唱シェル芸2
呪符式高速詠唱シェル芸2
 
呪符式高速詠唱シェル芸
呪符式高速詠唱シェル芸呪符式高速詠唱シェル芸
呪符式高速詠唱シェル芸
 
surgeコマンド作りました
surgeコマンド作りましたsurgeコマンド作りました
surgeコマンド作りました
 
ナーベンシュタイン距離 ~グラフを添えて~
ナーベンシュタイン距離 ~グラフを添えて~ナーベンシュタイン距離 ~グラフを添えて~
ナーベンシュタイン距離 ~グラフを添えて~
 
あの、selのリベンジをさせてください
あの、selのリベンジをさせてくださいあの、selのリベンジをさせてください
あの、selのリベンジをさせてください
 
Owari version 2.0 をつくりました
Owari version 2.0 をつくりましたOwari version 2.0 をつくりました
Owari version 2.0 をつくりました
 
実績を達成しました!
実績を達成しました!実績を達成しました!
実績を達成しました!
 
ワタナBase59
ワタナBase59ワタナBase59
ワタナBase59
 
ocsとselってコマンド作ったわよ
ocsとselってコマンド作ったわよocsとselってコマンド作ったわよ
ocsとselってコマンド作ったわよ
 
ワタナベシェル
ワタナベシェルワタナベシェル
ワタナベシェル
 
柿と杮
柿と杮柿と杮
柿と杮
 
難読化PowerShell芸入門
難読化PowerShell芸入門難読化PowerShell芸入門
難読化PowerShell芸入門
 
シェル芸をドット絵にして思いを伝えよう!
シェル芸をドット絵にして思いを伝えよう!シェル芸をドット絵にして思いを伝えよう!
シェル芸をドット絵にして思いを伝えよう!
 
終わりを出力するコマンドつくった
終わりを出力するコマンドつくった終わりを出力するコマンドつくった
終わりを出力するコマンドつくった
 
ワタナベ難読化シェル芸
ワタナベ難読化シェル芸ワタナベ難読化シェル芸
ワタナベ難読化シェル芸
 
~/.bashrcを難読化しよう!
~/.bashrcを難読化しよう!~/.bashrcを難読化しよう!
~/.bashrcを難読化しよう!
 
CLIツール作るの楽しい
CLIツール作るの楽しいCLIツール作るの楽しい
CLIツール作るの楽しい
 
レッツゴー難読化シェル芸
レッツゴー難読化シェル芸レッツゴー難読化シェル芸
レッツゴー難読化シェル芸
 
部活でシェル芸がはやらない
部活でシェル芸がはやらない部活でシェル芸がはやらない
部活でシェル芸がはやらない
 
潜入工作任務用シェル芸
潜入工作任務用シェル芸潜入工作任務用シェル芸
潜入工作任務用シェル芸
 

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