2025年06月29日の日記です


uniqlo のシャツ  2025-06-29 19:36:21  コンピュータ 歯車
uniqlo のシャツ

家族の買い物に付き合って 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 と書いてあり、これは命令ではないと先に書いた。

しかし、この仕組みにより、命令でないものが書かれていても、特にエラーにはならない。



同じテーマの日記(最近の一覧)

コンピュータ

歯車

別年同日の日記

06年 訃報

12年 続々々おたふく

13年 髪ゴム

14年 DAISY DAISY

18年 関東梅雨明け


申し訳ありませんが、現在意見投稿をできない状態にしています


戻る
トップページへ

-- share --

0000

-- follow --




- Reverse Link -