プログラミング
Bad Apple!! が Traceroute で再現される
Bad Apple but It's Traceroute (jssfr.de)
要約
この記事では、Traceroute の出力を使って有名な「Bad Apple!!」のミュージックビデオを再現する方法が解説されています。nftables の numgen 機能と ICMPv6 パケットを操作することで、各ホップが異なる IPv6 アドレスを返すように偽装し、ビデオフレームを生成しています。この技術は、低ビット深度でも表示可能な「Bad Apple!!」の特性と、Traceroute の出力操作の容易さを利用したものです。
全文翻訳
Bad Apple!! が Traceroute で再現される
Traceroute ツールで任意のコンテンツを表示する方法に関する以前の投稿のフォローアップとして、そして先日公開された別の Bad Apple!! カバーに触発されて、私はこれを実行するしかありませんでした。もちろん、これを最初にやったのは私ではありません。しかし、それは私を止めることはできませんでした。
仕組み
上記の投稿で、Traceroute 出力に偽のホップを注入する方法を実証しました。nftables の numgen 機能を使用することで、ICMPv6 パケットが生成されるたびにホップを変化させることができます。numgen はランダムな数値または単調増加するカウンターを提供します。カウンターを使用すると、応答パケットが生成されるたびに、各ホップが異なる IPv6 アドレスを返すように簡単にできます。
以前の投稿のプレイグラウンドを使用して:
ip netns exec tracemess nft -f - <<EOF
destroy table inet tracemess
table inet tracemess {
chain prerouting {
type filter hook prerouting priority raw;
ip6 daddr fd00::1 ip6 hoplimit 1 reject with icmpv6 admin-prohibited;
}
chain postrouting {
type filter hook postrouting priority raw;
icmpv6 type destination-unreachable icmpv6 code admin-prohibited ip6 saddr fd00::1 @th,120,8 1 ip6 saddr set numgen inc mod 3 map {
0: fd00::2,
1: fd00::3,
2: fd00::4
}
icmpv6 type set 3 icmpv6 code set 0 accept;
}
}
EOF
これを実現するために、さらに2つのことが必要でした。まず、ICMPv6 の送信レート制限(デフォルトでは 1 秒あたり 1 回)を sysctl net.ipv6.icmp.ratelimit=0 を使用して無効にする必要があります。そうしないと、すぐにパーティーは終わってしまいます。2つ目の問題は、mtr が通常、ホップごとに複数のアドレスを表示することです。これは、パケットに使用されている複数の異なるパスがあることを示しており、通常は有用な情報です。しかし、この場合、それはむしろ迷惑です。
これを修正するために、mtr に1行のパッチを適用する必要があります。
diff --git a/ui/net.c b/ui/net.c
index c0cbf28..7c52710 100644
--- a/ui/net.c
+++ b/ui/net.c
@@ -266,6 +266,7 @@ static void net_process_ping( break; /* Found first vacant position */ }
}
+
i = 0;
if (found == 0 && i < MAX_PATH) {
memcpy(&nh->addrs[i], &addrcopy, sockaddr_addr_size(sourcesockaddr));
これらすべてを配置した後、ffmpeg を使用してビデオを 8 フレーム/秒(フレーム間隔 125 ミリ秒に相当)にリサンプリングし、個々のフレームを縮小(30x11 ピクセルに)して PNG ファイルにエクスポートしました。次に、画像ファイルを読み込み、対応する ICMPv6 応答を生成するための nftables ルールセットに変換する Python スクリプトを作成しました。これにより、1メガバイト強の nftables ルールセットが生成されますが、それだけの価値は間違いなくあります。
なぜか?
シャドーアートの Bad Apple!! ミュージックビデオは、非常に緩い定義での「ディスプレイ」のハックされたディスプレイのベンチマークとなっています。これは、Doom(1993年のビデオゲーム)を実行することが、新しいハードウェアプラットフォームでコード実行を獲得することのベンチマークになっているのと似ています。その理由はおそらく、シャドーアートスタイルのおかげで、ビデオはピクセルあたり1ビット(オン/オフ)しかない「ディスプレイ」でもレンダリングできるからだと思います。人々が Bad Apple!! を表示させたデバイスの種類を示すためのサブredditがあります。現時点での私のお気に入りは、HD47780 互換のキャラクタ LCD を悪用したこのハックです。単純に私もこれらのデバイスをハッキングするのが好きだからです。複数のバージョンを示すコンパイル済みビデオも1つ以上あります。
それを考えると…私には選択の余地がなかったのでしょうか?
コメントは、この投稿の Fediverse スレッドで歓迎します。
mtr をパッチする代わりに、traceroute を囲むシェルループを使用することもできます。これはパッチは不要ですが、mtr の1行パッチとほとんど変わらないごまかしです。
mtr はホップごとに表示されるアドレスの数を制限できます(-E フラグ)。しかし、その場合、常に最初のアドレスが表示されます。つまり、ビデオの最初のフレームのフリーズフレームしか得られません。
この、人々が共有オンラインキャンバスにビデオをリドローしたものや、オートステレオグラムのものとどちらが私の個人的なランキングで2位になるか決めかねています。