iwasiblog

イワシブログ - Activity log of an iwasi -

TDU CTF:運営として参加しました

2014年12月25日にTDUCTFなるイベントを開催しました。
初心者向けCTFということで、Linuxの勉強を兼ねていた前回とは打って変わってCTFらしい問題を取り揃えました。

やったこと

前回に引き続きPHPでスコアサーバ作ってました。毎度、PHPやらデータベースやらの勉強になります。
前回も然ることながら、今回も開催間近に急ピッチの作業となり、やはりイベントを運営するのは大変だということをひしと感じました(そんな事言えるほど働けていませんごめんなさい)。
また、今回私は問題製作者としても参加させていただいたので、私が作成した問題について紹介&簡単なWriteUpを行います。順番は特に意味はありません。

1.View it

バイナリエディタを使う、マジックナンバーの存在、ググるといった、
CTFを行ううえでよく使うと思われる技術を問う、初歩的な問題として作成しました。

問題文

View this data.

解法

およそ3KBある謎のファイルを渡されます。
fileコマンドに渡しても詳細は判らなかったはずです。
そこで、バイナリエディタなどでデータを文字列表示すると以下のような表示がされます。

f:id:kuroiwasi:20150106200100j:plain

画像右側のアスキー表示の先頭に、大文字で「BPG」の文字があります。
ファイルヘッダの知識があるならば、よもやマジックナンバーではと勘付くことができると思います。
「BPG」で検索すると、画像フォーマットに関する記事がトップに表示されます(当時)。
BPGとは昨年末に発表された画像フォーマットのひとつで、作者のWebサイトからコンバータをダウンロードすることができます。

ダウンロードしたコンバータででpng画像に変換してみると、画像内にFLAGが書かれていることが分かります。

FLAG

TDU{kitai_no_sinjin}

2.Intro Movie

この問題は難易度を比較的高めに設定したものです。
プログラミングしない解法もありますが、プログラミング技術を問う問題でした。
また、問題文で目標を述べていないため、どういう趣旨の問題なのかを推測する問題でもありました。

問題文

Thank you for your participation!
This is introductory movie of TDUCTF.

解法

当日はaviとmp4で動画を配布。
再生してみると、キラキラとTDUCTFのロゴが描かれる動画が流れます。

しかし、ロゴが出現する前のキラキラ部分(32~101F)をよく見てみると、光の現れる部分が正方形の領域に限られています。
また、競技中に行われた運営側のトークでちょろっと出たヒントを考えると、この光を全て同時に見るとQRコードになるだろうと推測できます。

動画編集や画像編集のツールがあれば、フレームごとに書き出した後に比較(明)で重ね、最後にネガポジ反転することでもQRコードを作ることができます。

プログラムを書いて解く場合は、QRコード部分の全フレームを通して1度でも一定の輝度を超えたピクセルを黒、それ以外を白に塗るなどすることで解けます.
以下はprocessingで解く例です。

import processing.video.*;
Movie movie;
PImage img;
int count = 0;

void setup() {
  size(320, 240);
  img = createImage(320, 240, RGB);
  movie = new Movie(this, "movie.mp4");
  frameRate(30);
  movie.play();
}

void draw() {
  image(movie, 0, 0);
  if (count++ >= 110) {
    for (int x=0; x<320; x++) {
      for (int y=0; y<240; y++) {
        if (red(img.get(x, y)) > 220) {
          img.set(x, y, color(0));
        } 
        else {
          img.set(x, y, color(255));
        }
      }
    }
    image(img, 0, 0);
    save("result.png");
    noLoop();
  }
}

void movieEvent(Movie m) {
  m.read();
  for (int x=0; x<320; x++)
    for (int y=0; y<240; y++)
      if (red(img.get(x, y)) < red(movie.get(x, y)))
        img.set(x, y, movie.get(x, y));
}

QRコードができたら、任意の方法で読むことでFLAGが手に入ります。
f:id:kuroiwasi:20150209214526p:plain

FLAG

TDU{QR_C0DE_W45_b0RN_1N_J4P4N}

3.Win the battle

メモリを書き換えてチートする問題。
使用するツールは競技直前LTでも紹介した「スペシャねこまんま57号」を想定していました。

問題文

話題の新作RPGが手に入った。
ぜひ強敵Evil Foxを倒しFLAGを手に入れてほしい。

解法

MakeIkusa.exeという実行ファイルが渡され、実行するとRPGの戦闘風のプログラムが始まります。
が、コマンドはAttackのみで、毎ターン素直に戦っていると3ターン目で確実に負けます。

そこで「スペシャねこまんま57号」を利用して
メモリ検索で敵のHPを保存している場所を検索し、0に書き換えてしまいます。
そのままターンを進めることで見事勝利、FLAGを入手できます。

FLAG

TDU{Cheat_the_machine}

おわりに

イベントの運営などの経験が皆無な私にとって、mlabCTFや今回のTDUCTFはとても貴重な経験で学べることが多かったです。
運営として協力していただいた方々、そして参加していただいた皆様にはこの場を借りて御礼を申し上げます。
どうもありがとうございまいた。
次回があるといいな、と思っております。
(TDUCTFのロゴに勝手に2014と書いたのはそんな期待が込められているとか…)