LoginSignup
0

More than 5 years have passed since last update.

posted at

updated at

SECCON 2015 Online予選 Connect the serverの再調査

当日はブラウザに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を見つけ出すというのがこの問題の正規解なのでしょう。

VirtualBox_Kali_11_12_2015_00_23_46.png

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0