TsukuCTF 2023 writeup #TsukuCTF

TsukuCTF 2023に参加したのでwriteupをば。TsukuCTFといえばOSINTなのにOSINT問やってません。

web – basic

WireSharkで開いてみるとHTTP通信をしている。httpでフィルタするとこんな感じ。
401 Unauthorizedが返ってきた後のリクエストでAuthorizationヘッダにID/パスワード載せて送っている。

httpでフィルタしてみるとわかりやすい

Flag: TsukuCTF23{2929b0u4}

ちなみに最速の正解者は44秒で回答してる。マジかよ。

速すぎんだろ…

misc – what_os

tty.txtを見てみると、/etc/uidsという見慣れないファイルがあることに気づく。

# chdir etc
# ls -al
total   34
104 sdrwr-  2 root    110 Jan  1 00:00:00 .
 41 sdrwr-  7 root     70 Jan  1 00:00:00 ..
106 lxrwr-  1 bin    5778 Jan  1 00:00:00 as2
105 sxrwr-  1 bin     446 Jan  1 00:00:00 getty
107 sxrwr-  1 sys    2662 Jan  1 00:00:00 glob
108 sxrwr-  1 sys    1192 Jan  1 00:00:00 init
109 sxrwr-  1 sys     186 Jan  1 00:00:00 msh
110 s-rw--  1 sys     272 Jan  1 00:00:00 passwd
111 s-rwr-  1 root    512 Jan  1 00:00:00 std0
112 s-rwr-  1 bin    2082 Jan  1 00:00:00 suftab
113 s-rwr-  1 sys      88 Jan  1 00:00:00 <strong>uids</strong>

"/etc/uids"でググると印刷した紙をスキャンしたPDFが出てくる。ベル研って今ノキア傘下なんですね。

"/etc/uids"でググった結果

これは最初期のUNIXのマニュアル。これがフラグ。
余談だけど、フラグフォーマットがTsukuCTF23{xxx}で指定されてるのにずっとxxxをSubmitしててIncorrectになって時間溶かしまくった。あほ。

Flag: TsukuCTF23{UNIX}

他に使えそうな情報

  • ファイル編集にedを使っている。昔はviemacsなんてなかったのだ。
  • cdではなくchdirを使っている。
  • /usr/sys/maki.s ググると同様にUNIXの情報が出てくる。
  • calで1971年(最初のUNIXがリリースされた年)のカレンダーを表示している。
  • kenケン・トンプソンdmrデニス・リッチー (Dennis MacAlistair Ritchie)

misc – build_error

配布ファイルを同じフォルダにおいてmakeすると以下のエラーが出る。

$ make
cc main.o one.o -no-pie
/usr/bin/ld: main.o: in function `main':
main.c:(.text+0x8b): undefined reference to `a'
/usr/bin/ld: main.c:(.text+0x92): undefined reference to `b'
collect2: error: ld returned 1 exit status
make: *** [Makefile:4: all] Error 1

main.oone.oをIDAに食わせて見てみると、main.oからはone_init, a, b, cを参照しているのにone.oのExportテーブルにはone_init, cしかない。

one.oのExportテーブル

main.oone.oのIDAでのデコンパイル結果は以下の通り。

int __fastcall main(int argc, const char **argv, const char **envp)
{
  int i; // [rsp+4h] [rbp-2Ch]
  __int64 v5; // [rsp+8h] [rbp-28h]
  __int64 v6; // [rsp+10h] [rbp-20h]
  __int64 v7; // [rsp+18h] [rbp-18h]
  __int64 v8; // [rsp+20h] [rbp-10h]

  v5 = 12LL;
  v6 = 11LL;
  v7 = 75LL;
  one_init(argc, argv, envp);
  for ( i = 0; v6 > i; ++i )
  {
    if ( v5 > i )
      ++v7;
    if ( v7 < i )
      ++v6;
    ++v5;
  }
  v8 = v6 + v5 + v7;
  if ( v8 == b + a + c )
    printf("flag is %ld\n", v8);
  else
    puts("please retry");
  return 0;
}
__int64 one_init()
{
  __int64 result; // rax
  int i; // [rsp+0h] [rbp-4h]

  a = 12LL;
  b = 11LL;
  c = 75LL;
  for ( i = 0; ; ++i )
  {
    result = b;
    if ( i >= (unsigned __int64)b )
      break;
    if ( i < (unsigned __int64)a )
      ++c;
    if ( c < (unsigned __int64)i )
      ++b;
    ++a;
  }
  return result;
}

mainの中でone_initの後にやっている処理はone_initとまったく同じ処理であることがわかる。
one_initの処理は引数もなく関数外の値に依存せず常に同じ結果になるので、この関数だけ切り出して実行してみればa, b, cの値がわかる。

a = 23
b = 11
c = 86

Flag: TsukuCTF23{120}

rev – title_screen

配布されたファイルは以下の3つ

  • character.bmp
  • main.asm
  • main.cfg

main.asm内の命令をググるとどうやら6502というCPUであることがわかる(冒頭に書いてあるのには気づかなかった!)
どうやらファミコンで使われていたものらしい。画像も見てみると8×8の画像が並んでいる感じで文字も含まれている。ということでこれはファミコンのプログラムだなと推測できる。

character.bmp

細かく処理を追っていきたかったが、時間がなかったのでCTFを解く思考に変えた。
どの画像をどういう順番で表示するかをどこかで指定しているはず。
→ざっと見てアセンブラコードにはなさそう
→下の方にdataというデータ列がある
→これがそうに違いない
→各バイトの上4bitをY軸のインデックス、下4ビットをX軸のインデックスと考えるとちょうど文字のところにあたってよさそう
→解読するとTsukushi_Questになる(一番最後は文字じゃない画像なので無視)

Flag: TsukuCTF23{Tsukushi_Quest}

最初、TsukuCTF23{xxx}の形で出てくると思っていたのでTsuまでうまくいった時点で勝利を確信したが、実際はちょっと違った。ゲームタイトルがTsuで始まってなかったらもうちょっと疑いながらやって時間かかったかもしれない。

感想

OSINT問は手を付けていなかったので難易度のほどはわからないけど、他の問題は易しめの難易度でよかった。でもWebは解けない。Writeupみて精進します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください