たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

難読化dateコレクション-3-$[]利用

難読化dateしましょう

難読化dateコレクション、略して難daコレは難読化された date コマンド(略して難da)を集めた聖典

dateコマンド

$ date
20191211日 水曜日 20:31:43 JST

見ての通り日付を出力するツール。coreutils に入っている。 PowerShellにも Get-Date なるものがある。PowerShellだと、 Get を取ってもいいのと、大文字小文字が関係ないことから同じように date で日付が得られる。

# powershell
$ Get-Date
2019年12月11日 20:35:30

$ date
2019年12月11日 20:35:30

$[]利用難da

$ : sed; $_ "s/$[-$[$[~$[!$[]]<<$[!$[]]]+~$[!$[]]]]/$[$[-~$[!$[]]<<-~$[!$[]]]+~$[]]/${#_}" <(echo x6{$[-~$[!$[]]<<$[!$[]]],$[!$[]],$[-~$[!$[]]<<$[!$[]]],$[$[-~$[!$[]]<<$[!$[]]]+$[!$[]]]})|$_ "s/^\| /\\/g;s/.\+/$'&'/"|bash
2020116日 木曜日 21:01:54 JST

$[] で囲んだ部分を式として評価できる。これを使って数値を作り、bashに評価させる感じ。$[] の利用自体はわりとメジャーっぽいかなぁ

動作確認した環境

$ bash --version
GNU bash, バージョン 5.0.11(1)-release (x86_64-pc-linux-gnu)
$ sed --version
sed (GNU sed) 4.7

解説

難daを分割する前に、$[] について

$[]

$[] を空打ちすると 0 になる

$ echo $[]
0

$[!$[]]

$[] が 0 なので、まず $[!0] になり、0のNOTなので1になる

$ echo $[!$[]]
1

$[-~$[!$[]]]

~はビット反転、1をビット反転は-2なので ~1-2 $[!$[]] が 1 なのでこの式は 2 になる

$ echo $[-~$[!$[]]]
2

難daを分割してみる

1: : sed
2: $_ "s/$[-$[$[~$[!$[]]<<$[!$[]]]+~$[!$[]]]]/$[$[-~$[!$[]]<<-~$[!$[]]]+~$[]]/${#_}" 
3: <(echo x6{$[-~$[!$[]]<<$[!$[]]],$[!$[]],$[-~$[!$[]]<<$[!$[]]],$[$[-~$[!$[]]<<$[!$[]]]+$[!$[]]]})
4: $_ "s/^\| /\\/g;s/.\+/$'&'/"
5: bash

ちょっと見づらいので算術式を展開する。

1: : sed
2: $_ "s/6/7/3" 
3: <(echo x6{4,1,4,5})
4: $_ "s/^\| /\\/g;s/.\+/$'&'/"
5: bash

: sed

$_sed という文字列をセットする

$_ "s/6/7/3"

前段で $_sed がセットされているので、この段では sed "s/6/7/3" が実行される。内容的には3つ目の 67 に置換するという感じ

$ echo 1:6,2:6,3:6,4:6 | sed 's/6/7/3'
1:6,2:6,3:7,4:6

<(echo x6{4,1,4,5})

プロセス置換で前段の sed に ブレース展開を流し込む

$ echo x6{4,1,4,5}
x64 x61 x64 x65
$ sed "s/6/7/3" <(echo x6{4,1,4,5})
x64 x61 x74 x65

$_ "s/^| /\/g;s/.+/$'&'/"

これも seds/^\| /\\/gs/.\+/$'&'/ を評価する

  • s/^\| /\\/g
    • 先頭とスペースを\に置換
  • s/.\+/$'&'/
    • 1文字以上の文字列(ようは全部)を $'' でくるむ
$ echo x64 x61 x74 x65 | sed "s/^\| /\\/g;s/.\+/$'&'/"
$'date'

bash

前段までで date ができているので bash に渡して実行してもらう

: sed; $_ "s/6/7/3" <(echo x6{4,1,4,5}) | $_ "s/^\| /\\/g;s/.\+/$'&'/"|bash
20191211日 水曜日 20:31:43 JST

改めて見ると、コレでも十分難daコレって感じですね。

終わりに

$[] を使った難daコレのもっとヤバイやつは #難daコレ で見られるのでぜひどうぞ。私も $[] でできることもっと探します