TJCTF2019に参加しました。その記録です。

Blurry

Description

I found this slightly sketchy site that deals flags, but my mom hasn’t given me my allowance yet :(. You tryna help me out?

Details

Points
5
Genre
Web
Author
boomo
Solves
585

Method

siteをクリックするとフラグがぼかされたサイトが表示されます。

site

開発者ツールですぐにフラグが見えます。

Click here to buy access to our flag.

hereをクリックするとyoutubeに飛びますが、動画は何だったんでしょう。有名な動画なんでしょうか?

Flag

tjctf{cl0se_1nspecti0n}

Double Duty

Description

Everyone knows that caesar ciphers aren’t very good. So I caesared my message 2000 times. Good luck trying to decode that!

yfn uzu pfl tirtb dp katkw{jvbivk_tfuv}

Details

Points
5
Genre
Cryptography
Author
boomo
Solves
528

Method

カエサル暗号らしいです。2000回やったらしいですが、26回で一回りするので全く意味がないですね…。 カエサル暗号を解くプログラムに突っ込んであげると、意味の繋がる文章が一つ出てきます。

double_duty.c

#include <stdio.h>
#include <ctype.h>

int main (void)
{
    char s[] = "yfn uzu pfl tirtb dp katkw{jvbivk_tfuv}";
    char *p;

    for (int i = 0; i <= ('z' - 'a'); i++) {
        p = s;
        while (*p) {
            if (islower(*p)) {
                putchar(((*p - 'a' + i) % 26) + 'a');
            } else {
                putchar(*p);
            }
            p++;
        }
        puts("");
    }
    return 0;
}

$ cc double_duty.c
$ ./a.out | grep tjctf
how did you crack my tjctf{sekret_code}

Flag

tjctf{sekret_code}

MC Woes

Description

My world won’t launch anymore! I’m sure its something in the files…

Details

Points
5
Genre
Forensics
Author
boomo
Solves
275

Method

マイクラなんも分からん。

Flag

-

Touch Base

Description

Decode this string for an easy flag!

Encoded: dGpjdGZ7ajJzdF9zMG0zX2I0c2U2NH0=

Details

Points
5
Genre
Cryptography
Author
rj9
Solves
540

Method

Base64ですね。

$ echo dGpjdGZ7ajJzdF9zMG0zX2I0c2U2NH0= | base64 -d
tjctf{j2st_s0m3_b4se64}

Flag

tjctf{j2st_s0m3_b4se64}

Corsair

Description

Here is a picture of my favorite plane!

corsair

corsair

Details

Points
5
Genre
Forensics
Author
rj9
Solves
401

Method

左上にうっすら何かが見えます。GIMPとかで色調を変えてやるとみやすくなります。

が、最初は全く気付きませんでした!!

exiftoolをみたり、ZIPが中に入ってないかみたり、ステガノグラフィーないか調べたりしましたが、全く当たらず。

画像検索してみると、元画像が見つかりました。

http://www.richard-seaman.com/Aircraft/AirShows/Midland/2008/Highlights/F4uMidland08.jpg

CTFの問題で出されている画像の大きさが975×704で、元画像が980×705だったので、この若干の大きさの違いが関係しているのかなって考えましたが当たらず。

と、このような感じで時間をとられてしまいました。

Flag

tjctf{c0l0r_pl4n3s_ar3_c00l}

Python in One Line

Description

It’s not code golf but it’s something…

one.py This is printed when you input the flag: .. - / .. … -. - / – — .-. … / -.-. — -.. .

Details

Points
10
Genre
Reversing
Author
boomo
Solves
414

Method

Pythonのファイルに記号とアルファベットの対応が書いてあったので、手作業でフラグを書きました。

Flag

tjctf{jchiefcoil}

Sportsmanship

Description

It is simply this: do not tire, never lose interest, never grow indifferent—lose your invaluable curiosity and you let yourself die. It’s as simple as that.” “I’m a liar and a cheat and a coward, but I will never, ever, let a friend down. Unless of course not letting them down requires honesty, fair play, or bravery.

ciphertext: ROEFICFEENEBZDLFPY

key: UNPROBLEMATICDFGHKQSVWXYZ

Flag format is tjctf{plaintext}

Details

Points
10
Genre
Cryptography
Author
rj9
Solves
294

Method

太字でfair playってあるので、Playfair暗号っぽいです。 デコードしたんですが、なぜかフラグが合わずよくわかりません。

tjctf{PRACTICALPLAYFAIR}もしくはtjctf{PRACTICALPLAYFAIRX}だと思ったんだけど正解は何だったんでしょうか?

Flag

-

Guess My Hashword

Description

I bet you’ll never guess my password!

I hashed tjctf{[word]} - my word has a captial letter, two lowercase letters, a digit, and an underscore. ex: hash(‘tjctf{o_0Bo}’) or hash(‘tjctf{Aaa0_}’)

Here’s the md5 hash: 31f40dc5308fa2a311d2e2ba8955df6c

Details

Points
10
Genre
Cryptography
Author
boomo
Solves
193

Method

tjctf{o_0Bo}みたいなやつをmd5したから元のやつを当ててねって問題です。

大文字が1つ、小文字が2つ、数字が1つ、アンダースコアが1つと限られているので全探索すればよさそうです。

そういうわけでプログラムを書いて全探索します。

guess_my_hashword.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <ctype.h>
#include <md5.h>

char hash[] = "31f40dc5308fa2a311d2e2ba8955df6c";
char word[6];
char flag[13];
char data[6] = "Aaa0_";
int used[5] = {0};

void checkMD5 (void)
{
    MD5_CTX context;
    char md5[33];

    sprintf(flag, "tjctf{%s}", word);

    MD5Init(&context);
    MD5Update(&context, flag, strlen(flag));
    MD5End(&context, md5);

    if (strcmp(md5, hash) == 0) {
        puts(flag);
        exit(EXIT_SUCCESS);
    }
}

void round_robin (int i)
{
    if (i == 5) {
        word[5] = '\0';
        checkMD5();
        return;
    }

    if (isnumber(word[i])) {
        for (char j = '0'; j <= '9'; j++) {
            word[i] = j;
            round_robin(i + 1);
        }
    } else if (isupper(word[i])) {
        for (char j = 'A'; j <= 'Z'; j++) {
            word[i] = j;
            round_robin(i + 1);
        }
    } else if (islower(word[i])) {
        for (char j = 'a'; j <= 'z'; j++) {
            word[i] = j;
            round_robin(i + 1);
        }
    } else {
        word[i] = '_';
        round_robin(i + 1);
    }
}

void permutation (int i)
{
    if (i == 5) {
        round_robin(0);
    } else {
        for (int j = 0; j < 5; j++) {
            if (used[j]) continue;
            used[j] = 1;
            word[i] = data[j];
            permutation(i + 1);
            used[j] = 0;
        }
    }
}

int main (void)
{
    permutation(0);
}

$ cc -lmd guess_my_hashword.c
$ ./a.out
tjctf{w0w_E}

ところで、このプログラムは小文字2つが重複してしまっているのですが、このような順列を列挙するプログラムってどう書けばいいのか分からなかったので、誰か教えてください。 ググってみたのですが、理解できず…

Flag

tjctf{w0w_E}

Easy as RSA

Description

Decrypt this for a quick flag!

rsa

Details

Points
243
Genre
Cryptography
Author
rj9
Solves
243

Method

N:素数の積(公開鍵)、E:公開鍵のもう一方、C:暗号文 が提示されています。

msieveというツールでNを素因数分解します。すると、素数のペアp, qが出てくるので、それを使って秘密鍵Dを生成します。秘密鍵Dで暗号文Cを複合したらフラグが出てきます。

Flag

tjctf{RSA_2_3asy}

Conclusion

簡単な問題が多かったので、スラスラ解けて面白かったです。 つぎはもっと難しい問題ができるようにしないと!