😊

SECCON beginners 2023 参加レポート

2023/06/17に公開

タイトルの通り、参加してきまして以下の結果でした。

当初の目標は1問でも解ければ!という感じでしたので、
そう考えると悪くない結果と自分では思うことにしました。
上位50%には入れたし!

writeup?

さて、解いた問題です。

・Welcome
Welcomeなのでさすがに・・・ただどのチャンネルだ!と最初迷ったのは内緒。

・Half
ヒントにもある通り…Stringsで一発でした。

・Three
こっからが本気ですね。Stringsではなにもみえない。
Ghidraで逆アセンブルして・・・
ソース読むのは下手なのでgdbでフラグチェック部を気合でチェック!
フラグ40文字ぐらいなのでなかなか骨折れました。

・CoughingFox2
こいつにはやられました・・・
暗号化のプログラムソースは以下。

# coding: utf-8
import random
import os

flag = b"ctf"
#flag = b"ctf4b{xxx___censored___xxx}"

# Please remove here if you wanna test this code in your environment :)
#flag = os.getenv("FLAG").encode()

cipher = []

for i in range(len(flag)-1):
    c = ((flag[i] + flag[i+1]) ** 2 + i)
    cipher.append(c)

random.shuffle(cipher)

print(f"cipher = {cipher}")

去年のCoughingFoxは解いてたので、(flag[i] + flag[i+1]) ** 2を出すまではすぐできました。
こっからが問題・・・この数字の順番どうすればいいんだ!?となぜか悩む。
ラグのフォーマットは ctf4b{[\x20-\x7e]+} だから
最初は ct tf f4 4b b{ まではわかり、あとは {? と ?} は分かる。
総当たりで行けんじゃね?とプログラムを組むもわからず…ここでchatgptに頼る。
結果、進捗ダメです。再帰とトラックバックを使えば行けそうと
想定したものの全然プログラムかけない。ここで3時間以上溶かす・・・

そして、ついにひらめきました! i、そもそもわかってんじゃん!!!
はい、とけました。まぁでも再帰とトラックバックの概念を知れたので良かったです。
そう思っておくことにします。

こっから先は時間内に解けなかったですが、もうちょっと頑張れば行けたのがpwn1問目。

・poem
ソースはこれ。

#include <stdio.h>
#include <unistd.h>

char *flag = "ctf4b{***CENSORED***}";
char *poem[] = {
    "In the depths of silence, the universe speaks.",
    "Raindrops dance on windows, nature's lullaby.",
    "Time weaves stories with the threads of existence.",
    "Hearts entwined, two souls become one symphony.",
    "A single candle's glow can conquer the darkest room.",
};

int main() {
  int n;
  printf("Number[0-4]: ");
  scanf("%d", &n);
  if (n < 5) {
    printf("%s\n", poem[n]);
  }
  return 0;
}

__attribute__((constructor)) void init() {
  setvbuf(stdin, NULL, _IONBF, 0);
  setvbuf(stdout, NULL, _IONBF, 0);
  alarm(60);
}

scanf("%d", &n)の後、負数をチェックしてないので-1でどうだ?とやりましたが
ダメ。ここであきらめてほかの問題いったのがもったいなかった。
CTF終了した後、すこし gdb でメモリのぞいたり chatgpt に聞いてみたりしながら
やったのですが、chatgptいわく超でかい数字入れたらいいんじゃないかと。
それは意味ないでしょ…じゃぁ超でかいマイナスならどうだろうと試すもダメ。
2の補数で0xffffffffから1ずつ上下にずらしたらどうだ…とやってたら
-4294967300でビンゴ。
ここで他の人のwriteupみてみる。-4でええんやん・・・・難しく考えすぎました。

・double check
とけてないけど・・・大文字小文字をちょちょいとやるだけでいけたんですね…
case sensitiveじゃない、ってことかぁ・・・

・Poker
多分これもgdbでフラグ書き換えで強行突破できた気がする。
99 回やるのはバカバカしいですが笑

来年はもっと頑張ります!pwn、reversing、cryptoもっととけるようになるぞ!
webは・・・まぁぼちぼち頑張ります。network問題来てほしいなぁ…

おまけ:ctfとchatgpt

結論からいうとまだまだダメダメです。私のプロンプトがいけてなかったのかもしれませんが。
なおルール違反ではない、はず…atcoderでもルール違反にしない、と言ってた気がします。

ただCoughingFox2とpoemで頼りましたが、ぜんぜん回答に導いてくれませんでした。
CoughingFox2にいたっては謎の解答を出してくれて笑いました笑
他のcrypto問題の答え持ってきたでしょ!
poemも、負数でどう?と聞いたのに-1から順にとは言ってくれず、時間内に回答たどり着けず。

まだまだ、ということで今後に期待ですね。

Discussion