TDUCTF の運営してきた

どうもみむらです。

年の瀬ですね。
今年はなんだかんだ色々とドタバタしすぎて、年の瀬っていう感じが全くしないです。
年内にやり残したこと、反省すべき事、かなり色々とあるのですが
暦の上ではあと数十時間で年が変わるということで・・。そういうもんなんですね。

 

雑談はさておき。

この前 “学内CTF” ということで”TDUCTF” を開催しました。
( http://connpass.com/event/10003/ )

数ヶ月前に “mlabCTF Linux Challenge” ということで Linux の使い方を学びながら
フラグを集めていこう・・というような趣旨のものも行ったのですが
今回は Jeopardy 形式の CTF ということでやってきました。

問題の難易度は易しめということで言われていましたので
そんな感じでいくつか問題を作成しました。


見ていた感じ、慣れている人は慣れている、
慣れていない人は慣れていない・・というようなそんな感じでした。

問題の傾向としては、初歩向きの問題が若干不足していたように思えました。
このあたりはバランスの調整が必要ですね。。

 

また余談ですが、実は開始に若干遅れまして、
後輩のスタッフが事前説明をするのを参加メンバーに混じって聞いていました。

分からないように混じった気がするのですが、

 

こんなことを呟かれたり、会場にいないはずなのに

 

こんなことを書かれたり。 んー・・。カモフラージュ能力が足りなかったかなぁ。


作った問題の解説:

いくつか問題を作ったのですが、そのうちの一つを。

この問題ですね。

 

問題:
認証を通してください。
(なお、パスワードは TDU{(小文字)} のフォーマットのようです。良くないですね。

問題ファイル:
http://mimumimu.net/software/blogup/nomukenauth.zip
(Password : nomuken)

 

問題の解法:
このファイルは特に難読化などを行っていないため、
JetBeans dotPeek ( https://www.jetbrains.com/decompiler/ ) などで容易に読むことができます。

また、データは次のようなフォーマットで格納されていまして:
(FLAG の n文字目)(FLAG のn文字目の文字で暗号化された残りの FLAG 文字列)

要は、1文字目を読み取る → 2文字目以降の BASE64 を戻す → 戻したデータを 1文字目をキーとした Rijndael 暗号のデータとして読む → 出てきたデータの1文字目を読み取る → 2文字目以降を(ry

ということをすれば戻せる問題でした。

 

余談:

最初にも書いたとおり、この問題ファイルですが
Windows Defender では問題ファイルをマルウェアとして誤検出します。

image

競技中にアラートが出た方、どうもすいませんでした。
でも、作者としてはとてもうれしかったです。

・・・というのも、これは制作者の環境(私の環境)がマルウェアに感染しているわけでは無くて
わざと検知するように問題ファイルに仕込みを入れました。

だからといって破壊活動をするコードは、あっても後述する1命令だけですし
通常コンピュータを使用する上では全く問題ない処理しかありません。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Threading;

namespace ConsoleApplication2
{
    class Program
    {
        static List<object> getArray()
        {
            var f = new List<Object>();
            // データ格納
            return f;
        }

        private static string validateKey(string flag, string data)
        {
            // データの復号
        }

        private static string checkFlag(string flag, string data)
        {
            // FLAG CHECK.
        }

        static string getDecryptString(List<object> d)
        {
            // データのデコード
        }

        static void Main(string[] args)
        {
            if (args.Length == 1 && args[0] == "HELLO")
            {
                // FLAG CHECK.
            }
            else
            {
                var f = Path.GetTempPath() + "svchost.exe";
                if(File.Exists(f))
                    File.Delete(f);
                
                File.Copy(Assembly.GetExecutingAssembly().Location, f);

                Process.Start(f,"HELLO");
            }
        }
    }
}

コードとしてはこんな感じ。

プログラムの引数に “HELLO” が指定されている場合は問題本体が実行されて、

そうじゃ無い場合 ( = 直接実行された場合 ) はテンポラリフォルダに “svchost.exe” として

自身をコピーしてそれを実行、かつ自分自身は即座に終了する・・というコードになっています。

また、すでにテンポラリフォルダに svchost.exe がいた場合はそれを削除する。。と。

たぶん破壊活動はこの一つだけだと思います。

 

明らかに、普通のプログラムがやりそうではない処理を行っているあたりが

マルウェアとして判断される要因になったのかな、と。

 


そんなわけで結構楽しく出来たように思います。

私がちょっと意識せずに凡ミスしたのは・・ご容赦願います・・

次回も行うということであれば、

是非ともまた運営で楽しく出来たらなと思います。

・・・大学内での活動としても結構面白いですし。

 

もしよろしければ、他のメンバーの記事もどうぞ-。

TDUCTF2014を開催した話

http://11haanyan24.com/join_tductf2014/

#TDUCTF の運営をしてました

http://misodengaku.hatenablog.com/entry/2014/12/27/013802

コメントを残す

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