当日はブラウザにURLを貼り、落ちてきたファイルからflagをコピペし整えるだけで終了してしまったので、後日再調査しました。
まずは公式が公開していたサーバプログラムのソースを見てみます。
mylogin.c
int main()
{
int ch;
FILE *fpw = stdout;
sleep(1);
printf("CONNECT");
#if BPS > 0
printf(" %u", BPS);
#endif
printf("\r\n");
fflush(stdout);
sleep(1);
show(fpw, "\n");
show(fpw, "Welcome to SECCON server.\n");
show(fpw, "\n");
show(fpw, "The server is connected via slow dial-up connection.\n");
show(fpw, "Please be patient, and do not brute-force.\n");
flag(fpw);
ここは通信相手に文字を送信する部分、show()関数を使って文字を送信していて、最後のflags()がflag送信部分になっています。ということでflags()の中身を見てみます。
mylogin.c
void flag(FILE *fpw)
{
const char *the_flag = "SECCON{Sometimes_what_you_see_is_NOT_what_you_get}";
const char *p;
for (p = the_flag; *p; p++) {
fputc(*p, fpw);
fputc('\b', fpw);
fputc(' ', fpw);
fputc('\b', fpw);
}
}
fputcを使って一文字づつflagを吐き出しています。それだけではなく、flag一文字ごとに何らかの制御文字とスペースを書き込んでいます。\bってなんだったっけ…調べたらカーソルを左に動かすだそうな。
フラグを書き込む→カーソルを左にずらす→空白で上書きする→カーソルを左にずらすを繰り返すことによって、一文字書き込んで一文字消す処理を行っていたわけですね。
ファイル内の謎のスペース部分はこの制御文字で、一文字づつの処理はこの処理のヒントだったということでした。
wiresharkなどでパケットをキャプチャし、観察することによってflagを見つけ出すというのがこの問題の正規解なのでしょう。