年賀状ネタばらし: 4日目

さあ、ここで「賀正」というおおきなAAが出てきたのですが、それをよく見るとソースコードになっています。

AAを崩してみると一目瞭然

++++++++++++++++[>++>+++>++++++<<<-]>>++++++++.>++.<<.>-------.>+++
+.<<.>-..<.>.++++++++.<.>------.+.<.>++++.-

どうみてもBrainfuckのソースコードです。

Brainfuck – Wikipedia: http://ja.wikipedia.org/wiki/Brainfuck

やっと僕の大好きなBrainfuckの登場です。

では、実行してみると…

$ bf output
8b 1f 00 08 23 70 4e ff 03 00 ce ed 0a 31 31 02 85 10 d4 e1 62 9e
c1 bc 70 4c 57 27 b2 b0 4c b7 d4 11 71 62 5c 49 db c4 b2 bb 36 16
cd a2 c2 22 35 ff e6 0f f1 4d d2 fa 3e 5a b0 94 9d 24 6f b8 69 1e
d3 a9 9c d7 0d 45 9e 66 47 92 7c eb 5b ba 18 d4 e8 83 ab a2 c6 9e
c9 76 24 55 4f 1c dc f5 ef 8f 3e ff 7f f5 9b 6a e1 87 bb 26 95 72
c9 7d bd 75 f5 fa 00 1e 00 00 00 00 00 00 00 00 00 00 00 00 77 c0
a4 ee 60 f6 00 2a 00 28 00 00

これはバイナリの中身を表示しているようです。

でも、8b 1fなんていうマジックナンバーはありませんよね…. でも、1f 8bならgzipのマジックナンバーです!

これはすでにバイナリ処理された状態のようです。なので、バイナリエディタとかに打ち込んでもだめなのです!1f 8b 08 00っていう風に逆転させてから打ち込んでいくかプログラムに処理させるかしましょう!

こんな感じのコードを組んでやると行けると思います。

#include <stdio.h>

int main(void)
{
 char c;
 FILE *fp;
 fp = fopen("binary", "wb");
 while(scanf("%x", &c) != EOF)
 fwrite(&c, 1, 1, fp);
 fclose(fp);
 return 0;
}

できたデータをfileコマンドでみてみると…

$ file binary
binary: gzip compressed data, from Unix, last modified: Sun Jan 1 00:00:00 2012

2012年の1/1 00:00:00に作られたgzipのアーカイブのようです。

$ mv binary binary.gz
$ gunzip -d binary.gz

現れたファイルをみてみると、tarアーカイブでした。

$ file binary
$ tar xf binary

すると現れるのはmessasgeというテキストファイル!

中身は…

$ cat message
Happy New Year!

これが答えでした!!

年賀状ネタばらし: 4日目」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です