本日、オンラインで昨年11月16日から開催されていた場阿忍愚CTFが終了しました。楽しかったです。
結果は20位で、四段:ド変態の称号(ヒドイw)をいただきました。すでにWriteupを書かれた方がいるので、取り急ぎそちらで記載されていないものだけ記載します。
Writeupリンク
123 二進術 Unity遊戯如何様
Unityで作成されたMacのアプリケーション。3Dゲームだったので、とりあえず普通にプレイしてみる。ホップ・ステップ・ジャンプといった調子でジャンプするとジャンプ力が上がるため、楽しくて本気で2時間ほどプレイしてみましたが、どうしても3枚目のコインを発見できません・・・(苦笑)
ヒントにあった Assembly-CSharp.dll をILSpyでデコンパイルしてソースコード(GUI Managerクラス)を確認すると、コインが3枚の時にフラグを表示することが判明します。というか、フラグ文字列「its_3D_Game_Tutorial」が普通に見えているので、それをサブミットするも不正解。スコアサーバの調子が悪いのかと思い、しつこく何回もサブミットしてしまいました。
ゲームのチートをする問題なので、ソースコードを読むだけじゃダメなのかなと諦めて、Windows環境にVisualStudio 2008 ExpressとUnity Editorをインストールして、ILSpyでデコンパイルした Assembly-CSharp.dll をプロジェクト形式で保管したものを読み込み、必ずフラグが表示されるようソースコードを修正してDLLをビルド。
DLLを入れ替えて、Macでゲームを実行したところ、フラグが全て大文字で表示されました。
フラグ: ITS_3D_GAME_TUTORIAL
142 攻撃術 Ninja no Aikotoba
問題サーバに接続すると、問いかけの文字列(例:Kawa)が表示され、合言葉の入力を求められる。ソースコード(aikotoba.c)を読み、合言葉の解読方法を考える問題でした。
1問目
サーバが表示する問いかけは、合言葉を特定のアルゴリズムで変換したもの。プログラムを読み、問いかけから合言葉を導きだします。
問いかけ:Kawa
問いかけ生成のアルゴリズム: 合言葉の文字列(4文字)を整数型に型変換し、0x001a0012でxorします。
合言葉:Yama
2問目
プログラムに合言葉が埋め込まれている。8進数、10進数、16進数で文字コードが記載されています。
合言葉:too
3問目
合言葉をencrypt関数で処理した結果が、12個の10進数として画面に表示されます。なお、画面に表示される数値は毎回同じ。 encrypt関数を読むと、合言葉[n]と合言葉[n+6]を処理した結果を、result[n]とresult[n+6]に格納していることが分かります。問題プログラムを読むと、合言葉はアルファベット(大文字、小文字)で構成されていることが分かるため、ブルートフォースするプログラムを書けば解けます。
合言葉:KansaiTanaka
4問目
MD4のハッシュ値が表示されるので、ハッシュ値の
クラックサービスでクラックします。
合言葉:Zach
5問目
この問題だけはソースコードを読んでも答えが分かりません。IDAで問題ファイル「aikotoba」、および呼び出しされる「libc.so.6」の関数を確認しても、脆弱性の存在を発見できませんでした。(aikotobaの逆アセンブリリストをじっくり読んでも脆弱性を発見できなかったので、libc.so.6のどこかで脆弱性のあるのだと思いますが・・・)
libc.so.6をチラ見したところ、setbuf関数のなかで、バッファサイズを約8KBに設定しているようだったので、なんとなく8KB程度の大量データを繰り返し送信していたら、たまにフラグが表示されることに気が付きました。
攻撃が成功した理由はよく分かっていません・・・(-_-;)
[攻撃ログ](ファイルinputは、1問目から4問目までの答え、および5問目への入力として8KB程度のASCIIテキストを記載してあります。)
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\WORK\CTF\Attack300>nc 210.146.64.35 31338 < input
Hi.
C:\WORK\CTF\Attack300>nc 210.146.64.35 31338 < input
C:\WORK\CTF\Attack300>nc 210.146.64.35 31338 < input
Hi.
C:\WORK\CTF\Attack300>nc 210.146.64.35 31338 < input
Hi.
Let me check if you are my ally.
Kawa? : Good.
So then next? : Good.
-9 0 0 18 -10 8 159 194 220 212 204 202? : Good.
aa1bf8cae599b19366a8bd4b87ddd327? : Good.
And the rest? : You aren't my ally!!!
[*] YOU DIED
C:\WORK\CTF\Attack300>nc 210.146.64.35 31338 < input
Hi.
Let me check if you are my ally.
Kawa? : Good.
So then next? : Good.
-9 0 0 18 -10 8 159 194 220 212 204 202? : Good.
aa1bf8cae599b19366a8bd4b87ddd327? : Good.
And the rest? : You aren't my ally!!!
[*] YOU DIED
C:\WORK\CTF\Attack300>nc 210.146.64.35 31338 < input
Hi.
Let me check if you are my ally.
Kawa? : Good.
So then next? : Good.
-9 0 0 18 -10 8 159 194 220 212 204 202? : Good.
aa1bf8cae599b19366a8bd4b87ddd327? : Good.
And the rest? : You aren't my ally!!!
[*] YOU DIED
C:\WORK\CTF\Attack300>nc 210.146.64.35 31338 < input
Hi.
Let me check if you are my ally.
Kawa? : Good.
So then next? : Good.
-9 0 0 18 -10 8 159 194 220 212 204 202? : Good.
aa1bf8cae599b19366a8bd4b87ddd327? : Good.
And the rest? : You aren't my ally!!!
[*] YOU DIED
C:\WORK\CTF\Attack300>nc 210.146.64.35 31338 < input
Hi.
Let me check if you are my ally.
Kawa? : Good.
So then next? : Good.
-9 0 0 18 -10 8 159 194 220 212 204 202? : Good.
aa1bf8cae599b19366a8bd4b87ddd327? : Good.
And the rest? : You aren't my ally!!!
[*] YOU DIED
C:\WORK\CTF\Attack300>nc 210.146.64.35 31338 < input
Hi.
Let me check if you are my ally.
Kawa? : Good.
So then next? : Good.
-9 0 0 18 -10 8 159 194 220 212 204 202? : Good.
aa1bf8cae599b19366a8bd4b87ddd327? : Good.
And the rest? : You aren't my ally!!!
[*] YOU DIED
C:\WORK\CTF\Attack300>nc 210.146.64.35 31338 < input
Hi.
Let me check if you are my ally.
Kawa? : Good.
So then next? : Good.
-9 0 0 18 -10 8 159 194 220 212 204 202? : Good.
aa1bf8cae599b19366a8bd4b87ddd327? : Good.
And the rest? : You aren't my ally!!!
[*] YOU DIED
C:\WORK\CTF\Attack300>nc 210.146.64.35 31338 < input
Hi.
C:\WORK\CTF\Attack300>nc 210.146.64.35 31338 < input
Hi.
C:\WORK\CTF\Attack300>nc 210.146.64.35 31338 < input
Hi.
Let me check if you are my ally.
Kawa? : Good.
So then next? : Good.
-9 0 0 18 -10 8 159 194 220 212 204 202? : Good.
aa1bf8cae599b19366a8bd4b87ddd327? : Good.
And the rest? : Well Done!
Flag: flag={GetsuFumaDen}
C:\WORK\CTF\Attack300>
フラグ:GetsuFumaDen
155 解析術 Encrypted Message
問題ファイル「155-secret」の内容をバイナリエディタで確認したところ、暗号化されたデータのように見えます。もう一つ問題ファイルとして配布されているメモリダンプのなかに復号のヒントがあると考え、Volatilityで解析を実施しました。
(1)imageinfo
Win8SP0x86またはWin8SP1x86のメモリイメージであることが判明
(2)pslist (profile=Win8SP1x86)
TrueCryptが起動していることが判明。「155-secret」はTrueCryptのコンテナファイルであると推測
(3)truecryptmaster / truecryptpassphrase (profile=Win8SP1x86)
何も抽出されない
(4)truecryptmaster / truecryptpassphrase (profile=Win8SP0x86)
プロファイルが間違っている可能性を考え、SP0で再度実行したところ、truecryptのMaster Keyを取得
Master KeyからTrueCryptコンテナを復号するため、Master Keyを埋め込んだTrueCryptをコンパイルします。
(1)Linux環境でTrueCrypt 7.0aのソースコードを準備
(2)VolumeHeader.cppにパッチを適用(詳細は参考リンクを参照)
パッチには、前述の手順で取得したMaster Keyを埋め込む
(3)TrueCryptをコンパイル
これだけではTrueCryptコンテナを復号できないため、「155-secret」のヘッダ情報を次の手順で書き換えます。
(1)Windows環境の通常版TrueCryptでコンテナファイル(テンプレートと呼ぶ)を作成
その際、暗号方式、サイズ(Disk Length)は「155-secret」を同じ設定とする
パスフレーズは任意のものを設定する。ここでは、「abc123」を設定した
(2)テンプレートのヘッダ(ファイルの先頭512バイト)を、「155-secret」に上書きする
$ dd if=template of=155-secret bs=512 count=1 conv=notrunc
ヘッダを書き換えた「155-secret」を上記3.で準備したパッチ適用済みTrueCryptでマウントします。
パスフレーズは、テンプレートで設定した「abc123」を指定します。この手順により、「155-secret」をマウントすることができます。
コンテナのなかに、「flag.txt」が格納されており、フラグが記載されていました。
フラグ: Already Ended In 5/2014
参考リンク
以上です。