どうもみむらです。
年の瀬ですね。
今年はなんだかんだ色々とドタバタしすぎて、年の瀬っていう感じが全くしないです。
年内にやり残したこと、反省すべき事、かなり色々とあるのですが
暦の上ではあと数十時間で年が変わるということで・・。そういうもんなんですね。
雑談はさておき。
この前 “学内CTF” ということで”TDUCTF” を開催しました。
( http://connpass.com/event/10003/ )
数ヶ月前に “mlabCTF Linux Challenge” ということで Linux の使い方を学びながら
フラグを集めていこう・・というような趣旨のものも行ったのですが
今回は Jeopardy 形式の CTF ということでやってきました。
問題の難易度は易しめということで言われていましたので
そんな感じでいくつか問題を作成しました。
見ていた感じ、慣れている人は慣れている、
慣れていない人は慣れていない・・というようなそんな感じでした。
問題の傾向としては、初歩向きの問題が若干不足していたように思えました。
このあたりはバランスの調整が必要ですね。。
また余談ですが、実は開始に若干遅れまして、
後輩のスタッフが事前説明をするのを参加メンバーに混じって聞いていました。
分からないように混じった気がするのですが、
親方の圧力を感じる #tductf
— あると (@twinkfrag) 2014, 12月 25
こんなことを呟かれたり、会場にいないはずなのに
リモートで親方の圧力を感じる
— ほよたか (@takahoyo) 2014, 12月 25
こんなことを書かれたり。 んー・・。カモフラージュ能力が足りなかったかなぁ。
作った問題の解説:
いくつか問題を作ったのですが、そのうちの一つを。
tductf、みむらさんの書いたわざわざマルウェアっぽい挙動をしてWindows Defenderが誤検知して勝手に削除するって問題が傑作だと思った
— 実質皇族 (@misodengaku) 2014, 12月 26
この問題ですね。
問題:
認証を通してください。
(なお、パスワードは 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 では問題ファイルをマルウェアとして誤検出します。
競技中にアラートが出た方、どうもすいませんでした。
でも、作者としてはとてもうれしかったです。
・・・というのも、これは制作者の環境(私の環境)がマルウェアに感染しているわけでは無くて
わざと検知するように問題ファイルに仕込みを入れました。
だからといって破壊活動をするコードは、あっても後述する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 がいた場合はそれを削除する。。と。
たぶん破壊活動はこの一つだけだと思います。
明らかに、普通のプログラムがやりそうではない処理を行っているあたりが
マルウェアとして判断される要因になったのかな、と。
そんなわけで結構楽しく出来たように思います。
私がちょっと意識せずに凡ミスしたのは・・ご容赦願います・・
次回も行うということであれば、
是非ともまた運営で楽しく出来たらなと思います。
・・・大学内での活動としても結構面白いですし。
もしよろしければ、他のメンバーの記事もどうぞ-。