TJCTF2019 write-up
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をクリックするとフラグがぼかされたサイトが表示されます。
開発者ツールですぐにフラグが見えます。
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!
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!
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
簡単な問題が多かったので、スラスラ解けて面白かったです。 つぎはもっと難しい問題ができるようにしないと!