家族の買い物に付き合って Uniqlo に行ったら、イカレたデザインのシャツを売っていたので買ってきた。
Peace for All というキャンペーンで、このテーマでいろいろな人・企業にデザインしてもらったシャツを売っているようだ。
僕が買ってきたのは、Akamai という会社のコラボシャツ。店内ポスターではあいうえお順にデザインが並んでいたので、「アカマイ」は先頭だった。こんなイカレたデザインが先頭に描かれているとは。
Uniqlo も良く Akamai にコラボ依頼したな…と思ったら、後で調べたところこれは第2弾だそうだ。
しかし、第1弾は自分としては惹かれるデザインではなかったようなので、こちらでよい。
さて、この Akamai という会社、多くの人は知らないだろう。
そして、僕のようにネット関連の技術者であれば、知らなくてはならない会社だ。
Akamai は、ネットを裏で支える技術企業だ。
消費者にネット接続を提供するプロバイダも、コンテンツを提供する企業側も、そしてコンテンツを閲覧する利用者側も、全員が儲かって幸せになる仕組みを作り上げている。そしてもちろん、そのシステムを提供する Akamai も大儲けしている大企業だ。
これを、25年前の時点で、誰もがすぐに利用できる既存の仕組みの巧妙な組み合わせで作り上げた、ということが素晴らしい。
この仕組みが非常に面白いのだが…巧妙なので、説明すると非常に長くなる。一度書いてみたのだが、話の腰が折れすぎるので、今回は割愛することにした。
(いい説明があればリンクを…と思ったが、これまた技術的で巧妙なので、ちゃんと説明しているページを見つけられなかった。この話、面白いから機会があれば説明したい。)
さて、そんな技術会社の作ったシャツは、技術オタクが泣いて喜ぶようなデザインになっている。
写真を拡大すればわかるが、暗号のような訳の分からない文字列だ。
すでに解読した blog 等もたくさんあるが、暗号部分の解読どまりで、全体の構造を解説しているページは見つけられなかった。
ちょっと解説しておこう。
書かれている内容は以下のようになる。
(改行位置などは T シャツデザインと違うが「正しい」位置にいれてある。そのため、このままコピペすれば実行可能ファイルになる)
#!/bin/bash
eval "$(base64 -d <<< 'IyEvYmluL2Jhc2gKCiMgQ29uZ3JhdHVsYXRpb25zISBZb3UgZm91bmQgdGhlIGVhc3RlciBlZ2chIOKdpO+4jwojIOOBiuOCgeOBp+OBqOOBhuOBlOOBluOBhOOBvuOBme+8gemaoOOBleOCjOOBn+OCteODl+ODqeOCpOOCuuOCkuimi+OBpOOBkeOBvuOBl+OBn++8geKdpO+4jwoKIyBEZWZpbmUgdGhlIHRleHQgdG8gYW5pbWF0ZQp0ZXh0PSLimaVQRUFDReKZpUZPUuKZpUFMTOKZpVBFQUNF4pmlRk9S4pmlQUxM4pmlUEVBQ0XimaVGT1LimaVBTEzimaVQRUFDReKZpUZPUuKZpUFMTOKZpVBFQUNF4pmlRk9S4pmlQUxM4pmlIgoKIyBHZXQgdGVybWluYWwgZGltZW5zaW9ucwpjb2xzPSQodHB1dCBjb2xzKQpsaW5lcz0kKHRwdXQgbGluZXMpCgojIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0CnRleHRfbGVuZ3RoPSR7I3RleHR9CgojIEhpZGUgdGhlIGN1cnNvcgp0cHV0IGNpdmlzCgojIFRyYXAgQ1RSTCtDIHRvIHNob3cgdGhlIGN1cnNvciBiZWZvcmUgZXhpdGluZwp0cmFwICJ0cHV0IGNub3JtOyBleGl0IiBTSUdJTlQKCiMgU2V0IGZyZXF1ZW5jeSBzY2FsaW5nIGZhY3RvcgpmcmVxPTAuMgoKIyBJbmZpbml0ZSBsb29wIGZvciBjb250aW51b3VzIGFuaW1hdGlvbgpmb3IgKCggdD0wOyA7IHQrPTEgKSk7IGRvCiAgICAjIEV4dHJhY3Qgb25lIGNoYXJhY3RlciBhdCBhIHRpbWUKICAgIGNoYXI9IiR7dGV4dDp0ICUgdGV4dF9sZW5ndGg6MX0iCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhbmdsZSBpbiByYWRpYW5zCiAgICBhbmdsZT0kKGVjaG8gIigkdCkgKiAkZnJlcSIgfCBiYyAtbCkKCiAgICAjIENhbGN1bGF0ZSB0aGUgc2luZSBvZiB0aGUgYW5nbGUKICAgIHNpbmVfdmFsdWU9JChlY2hvICJzKCRhbmdsZSkiIHwgYmMgLWwpCgogICAgIyBDYWxjdWxhdGUgeCBwb3NpdGlvbiB1c2luZyB0aGUgc2luZSB2YWx1ZQogICAgeD0kKGVjaG8gIigkY29scyAvIDIpICsgKCRjb2xzIC8gNCkgKiAkc2luZV92YWx1ZSIgfCBiYyAtbCkKICAgIHg9JChwcmludGYgIiUuMGYiICIkeCIpCgogICAgIyBFbnN1cmUgeCBpcyB3aXRoaW4gdGVybWluYWwgYm91bmRzCiAgICBpZiAoKCB4IDwgMCApKTsgdGhlbiB4PTA7IGZpCiAgICBpZiAoKCB4ID49IGNvbHMgKSk7IHRoZW4geD0kKChjb2xzIC0gMSkpOyBmaQoKICAgICMgQ2FsY3VsYXRlIGNvbG9yIGdyYWRpZW50IGJldHdlZW4gMTIgKGN5YW4pIGFuZCAyMDggKG9yYW5nZSkKICAgIGNvbG9yX3N0YXJ0PTEyCiAgICBjb2xvcl9lbmQ9MjA4CiAgICBjb2xvcl9yYW5nZT0kKChjb2xvcl9lbmQgLSBjb2xvcl9zdGFydCkpCiAgICBjb2xvcj0kKChjb2xvcl9zdGFydCArIChjb2xvcl9yYW5nZSAqIHQgLyBsaW5lcykgJSBjb2xvcl9yYW5nZSkpCgogICAgIyBQcmludCB0aGUgY2hhcmFjdGVyIHdpdGggMjU2LWNvbG9yIHN1cHBvcnQKICAgIGVjaG8gLW5lICJcMDMzWzM4OzU7JHtjb2xvcn1tIiQodHB1dCBjdXAgJHQgJHgpIiRjaGFyXDAzM1swbSIKCiAgICAjIExpbmUgZmVlZCB0byBtb3ZlIGRvd253YXJkCiAgICBlY2hvICIiCgpkb25lCgo= ')"
PEACE FOR ALL
これは UNIX のシェルスクリプトだ。ファイルに chmod +x で実行属性を与えれば実行できる。
先頭行は、bash を使用して実行できる、という、OS に対する指示だ。
2行目が長いのだが、eval している。これは、bash でその次の文字列を評価せよ、という命令だ。
eval の対象となる部分は、 " " で括っている。
さて、「その次」だが、謎の文字列に見える。でも、評価するのはこの文字列ではない。
$( で始まっているが、これは「外部コマンドを実行して、その結果を返せ」という指示だ。
(2行目の最後付近に、対応する閉じ括弧がある)
評価対象は、この外部コマンドが返した結果である。
そして、外部コマンドが base64 -d だ。これは、base64 形式でエンコードされた文字列を、デコードせよ、という指示。
謎の文字列は、base64 エンコードされたもので、後で詳細を書く。
3行目の PEACE FOR ALL は、命令ではない。キャンペーンに合わせて書かれているメッセージ。
しかし、ここに命令ではないものが入っていても大丈夫なようになっている。こちらも詳細は後で。
さて、base64 部分をデコードしたもの。
#!/bin/bash
# Congratulations! You found the easter egg! ❤️
# おめでとうございます!隠されたサプライズを見つけました!❤️
# Define the text to animate
text="♥PEACE♥FOR♥ALL♥PEACE♥FOR♥ALL♥PEACE♥FOR♥ALL♥PEACE♥FOR♥ALL♥PEACE♥FOR♥ALL♥"
# Get terminal dimensions
cols=$(tput cols)
lines=$(tput lines)
# Calculate the length of the text
text_length=${#text}
# Hide the cursor
tput civis
# Trap CTRL+C to show the cursor before exiting
trap "tput cnorm; exit" SIGINT
# Set frequency scaling factor
freq=0.2
# Infinite loop for continuous animation
for (( t=0; ; t+=1 )); do
# Extract one character at a time
char="${text:t % text_length:1}"
# Calculate the angle in radians
angle=$(echo "($t) * $freq" | bc -l)
# Calculate the sine of the angle
sine_value=$(echo "s($angle)" | bc -l)
# Calculate x position using the sine value
x=$(echo "($cols / 2) + ($cols / 4) * $sine_value" | bc -l)
x=$(printf "%.0f" "$x")
# Ensure x is within terminal bounds
if (( x < 0 )); then x=0; fi
if (( x >= cols )); then x=$((cols - 1)); fi
# Calculate color gradient between 12 (cyan) and 208 (orange)
color_start=12
color_end=208
color_range=$((color_end - color_start))
color=$((color_start + (color_range * t / lines) % color_range))
# Print the character with 256-color support
echo -ne "\033[38;5;${color}m"$(tput cup $t $x)"$char\033[0m"
# Line feed to move downward
echo ""
done
また bash のシェルスクリプトだ。
つまりは、シェルスクリプトを、そうと判らなように巧妙に base64 で隠しているだけで、シャツに書かれた元のシェルスクリプトは、上記のスクリプトを動かすためのランチャーに過ぎない。
で、ここまで解読できてしまえば…あとは実行して、としか言いようがない。
このプログラム自体は、それほど面白い動作をするわけではなく、ただカラフルで面白おかしい形に PEACE FOR ALL の文字を書き続けるだけだ。
2行目で起動する上のプログラムは、for 文で「終了条件のない」ループを行っている。
終了条件がないので、終わることはない。CTRL + C で停止するまで止まらない。
そして、CTRL + C した時には、元の(base64 が書かれた)プログラムも停止してしまう。
つまり、元のプログラムの最後の行(3行目)は絶対に実行されない。
元プログラムの3行目には PEACE FOR ALL と書いてあり、これは命令ではないと先に書いた。
しかし、この仕組みにより、命令でないものが書かれていても、特にエラーにはならない。
同じテーマの日記(最近の一覧)
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |