LoginSignup
2
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-10

当日はブラウザに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

2
0
0

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
  3. You can use dark theme
What you can do with signing up
2
0