SECUINSIDE CTF 2014 Writeup

5/30-6/1 sutegoma2 + katagaitai + EpsilonDelta でbinjaというチームを結成し,SECUINSIDE CTFに参加しました. 始まるまでは,この3チームが集まれば本選枠の10位に入るくらいは余裕だろうと思っていたのですが,終わってみるとぎりぎり10位という結果でした.

http://ctf.secuinside.com/ (penthackathonと0x51BB6A00がチートで落ちていて面白い)

運営に提出したwriteupを公開します.

Javascript Jail (Misc 200pt)

https://www.dropbox.com/sh/ytfak01xhkjkiwp/AAA06wPsZMQAbWdwcpDgfG37a/writeup-Javascriptjail.pdf

Pillow (Crypto 200pt)

https://www.dropbox.com/sh/ytfak01xhkjkiwp/AADhpnghprgulAAneBLdAZbSa/writeup-pillow.pdf

Speed Game (MICCHECK 7pt)

https://www.dropbox.com/sh/ytfak01xhkjkiwp/AABcoW-29SN9M4HZ_U7PNsDma/writeup-SpeedGame.pdf

the greatest physicists (Web 100pt)

https://www.dropbox.com/sh/ytfak01xhkjkiwp/AABOANajMia9WSMxbPmHil0da/writeup-thegreatestphysicists.pdf

This is not bad (Shellcode 100pt)

https://www.dropbox.com/sh/ytfak01xhkjkiwp/AABRPW0wJ5wHGDRkr3t7MZ-xa/writeup-Thisisnotbad.pdf

Web200 (Web 200pt)

https://www.dropbox.com/sh/ytfak01xhkjkiwp/AADwArQHT-0AdBcT3q4rSprXa/writeup-web200.pdf

yayaya (Reverse 100pt)

https://www.dropbox.com/sh/ytfak01xhkjkiwp/AACLCp4qmRS4dR1f6Yx4Z1sja/writeup-yayaya.pdf

Yet another Javascript Jail (Pwn 300pt)

https://www.dropbox.com/sh/ytfak01xhkjkiwp/AAB6gZA1ACqDKfsS_qj5L6_ka/writeup-YetanotherJavascriptjail.pdf

本選もがんばります.

DEFCON 2014 writeup

5/17 ~ 5/19にかけて、DEFCON CTF 2014に出場していました。

結果は、獲得ポイント19ptで、1061チーム中31位と本戦出場には及びませんでしたが、目標としていたsutegoma2と同じ得点なので、ある程度満足する結果を残せたのではないかと思います。

それでは、メンバーごとのWriteupをどうぞ。

@potetisensei

こんにちわ、14pt入れたpotetisenseiです。

他のメンバーはもうダメです。

僕一人がEpsilonDeltaみたいなもんです。

僕がEpsilonDeltaです。

Baby's First1 heap

Heap feng shui not required

http://services.2014.shallweplayaga.me/babyfirst-heap_33ecf0ad56efc1b322088f95dd98827c

babyfirst-heap_33ecf0ad56efc1b322088f95dd98827c.2014.shallweplayaga.me:4088

メンバーが直したCのコード

Written by @nk0t

要点は

  • NX bitが有効、Partial RELROなのでGOTの書き換えが可能。
  • 112行目のget_my_line(buff, 0x1000)でバッファーオーバーフローが発生する。
  • 114行目のmemcpy(loc_table[0xa], buff, count)によって、同時にヒープオーバーフローが発生する。
  • 122行目のexit_func(1)の呼び出しによって、main関数からreturnせずに終了してしまうため、そのままではバッファーオーバーフローを利用したROPを書くことが出来ない。
  • 自前のheap allocatorを利用している。

の5つぐらいでしょうか。

これらの要点から考察すると、ヒープオーバーフローによって、free関数内のmalloc_chunkの繋ぎ直し処理を利用した任意のアドレス書き換えが必要になるのではないかと考えられます。

今年の文化祭の部誌の記事で、glibcのfree関数を調べていたので、ここまではすぐに気がつくことが出来ました。

では、実際に何を書き換えればいいのでしょうか?

malloc_chunkのunlink処理での任意のアドレス書き換えの制約として、

書き込まれるアドレスも、書き込むアドレスも、writableなメモリ領域でなければならない

というものがあります。 非常に古い記事ですが、Hackers Hut: Exploiting the heapを読めば何故なのかは理解できると思います。

さて、今、書き換えたいアドレスの候補としては、printfのGOTや、関数ポインタであるexit_func変数が上げられます。 しかし、書き込むアドレスは、writableでかつexecutableな領域でなければなりません。 通常、このようなメモリ領域は存在しません。

私もここでかなりの時間悩んだのですが、よくよく考えてみれば、この問題は1ptの問題で、そこまで難しいわけがないのです。 更に、12行目のputs("Did you forget to read the flag with your shellcode?")という不自然な書き込みが非常に気になりました。

まさか、と思い、調べてみると、malloc関数内で、mprotectを呼び出し、heapをPROT_READ | PROT_WRITE | PROT_EXECに設定している事が分かりました。

.text:08048BAF loc_8048BAF: ; CODE XREF: malloc_extend_top+58j

.text:08048BAF mov dword ptr [esp+8], 7 ; prot

.text:08048BB7 mov eax, [ebp+sbrk_size]

.text:08048BBA mov [esp+4], eax ; len

.text:08048BBE mov eax, [ebp+cp]

.text:08048BC1 mov [esp], eax ; addr

.text:08048BC4 call _mprotect

従って、heapはwritableでかつexecutableなメモリ領域になっているため、shellcodeを配置し、そこに飛ばしてやればいいことが分かります。

書いたコードがこちら。

DEFCON 2014 Writeup heap

本来ならexit_funcを書き換える問題なのでしょうが、何故かfreeでクラッシュしてしまうのでprintfのGOTを書き換えました。

こんなmprotectに気づかないと解けないような悪問のどこが初心者向けなのかさっぱり分からないし、僕はこの問題が嫌いです。

The flag is: Good job on that doubly linked list. Why don't you try something harder!!OMG!!

Gynophage2 shitsco

http://services.2014.shallweplayaga.me/shitsco_c8b1aa31679e945ee64bde1bdb19d035 is running at: shitsco_c8b1aa31679e945ee64bde1bdb19d035.2014.shallweplayaga.me:31337

Capture the flag.

中途半端に書きなおしたCのコード。

shitsco incomplete

shitscoは簡易shellのようになっていて、入力を関数sub_8048A50でコマンド名、引数のリストにパースし、利用できるコマンドの情報が書かれている構造体のリストと入力したコマンド名を比較、入力したコマンド名と構造体のコマンド名が一致したら、構造体で定義されているcall backされる関数を呼び出すという処理をしています。

あまり詳しく見ていないので、予想ですが、関数sub_8048A50はパースして比較するだけの関数であるため、それ自体に何らかの脆弱性があっても、到底利用出来るものではないでしょう。 従って、callbackされる関数を見ていきます。

sub_8049230

enableというコマンドを入力すると呼び出される関数です。 sub_8048A50から呼び出される時、argsのリストが引数に渡されます。 引数がある時、argv[1]を、引数が無い時、標準入力から入力を読み込み、passwordと比較します。 passwordと一致しない場合には、入力が出力されます。 passwordが一致した場合には、memo.c内のglobal_permissionという変数に1が代入され、flagというコマンドによってflagを出力出来るようになります。

少し見ただけでは、入力を読み込む配列、[esp+18h]のサイズは0x20byteであり、入力される文字列の最大長は0x20byteであるため、オーバーフローはなく、全く問題ないように思えます。 しかし、配列としては問題無くとも、文字列として、この状態で[esp+18h]を出力することには、問題があります。 本来、文字列には、NULL文字という文字列の終端を表す文字(デファクトは0x00)が付属するわけですが、0x20byteのchar配列に対して0x20byteの入力を行うことは、このNULL文字を消去してしまうということです。 従って、最大長を書き込んだ場合、俗にいう「stack leak」が発生します。

では、stack leakによってleakされる情報は何でしょうか? 出力する時点で、[esp+18h+20h]、すなわち[esp+38h]には、strcmpの戻り値が格納されています。 strcmpの戻り値は、引数の文字列s1, s2を辞書順で比較した場合の大小です。 すなわち、自分が入力した文字列と、passwordの辞書順での大小がleakされるわけです。 よって、これを元にpasswordを当てることが出来ます。

DEFCON 2014 Writeup shitsco

これによって探索すると、passwordが確かbruT3m3hartとなり、それをenableコマンドで入力し、flagコマンドを打てばflagが出力されます。

The flag is: Dinosaur vaginas

Gynophage3 sftp

Such a simple daemon.

http://services.2014.shallweplayaga.me/sftp_bf28442aa4ab1a4089ddca16729b29ac

sftp_bf28442aa4ab1a4089ddca16729b29ac.2014.shallweplayaga.me:115

sftp(SSH File Transfer Protocol)クライアントを模したソフトウェア。 まともに利用できるコマンドは、USER, PASS, LIST, RETR, STORぐらいで、LISTは与えられたディレクトリの中身を表示、RETRは与えられたファイルのサイズ、中身を表示、STORは与えられたファイルを作成、書き込みを行うコマンドです。

要点は

  • NX bit, Stack canaryが有効
  • libcはRETRによって読み出し可能

という2点だけでしょうか。

見つけた脆弱性は3つで、1つ目はLISTコマンドに"//////////////////////////////////"のような引数を渡してやり、そのディレクトリの中に、かなり長いファイル名を置いておけば、sprintf(buf, "%s/%s", directory_path, filename)のような処理でバッファーオーバーフローする、というものです。 これは、filenameには、途中にNULL文字を含めることが出来ないため、stack canaryが突破できず、利用できるものではありません。

2つめと3つめは、RETRコマンド内に存在しています。

DEFCON 2014 Writeup sftp

RETRコマンドでは、まず読み出すファイルに"flag"という文字列がないか確認します。 この処理をbypassすることは不可能だと思われるので、RETRを用いてflagを頑張って読みだす、ということは出来ません。 次に、読み出すファイルのpathのbasenameの先頭文字が"."かどうかを確認します。 これは、特に何の問題はありません。 そして、xstatを呼び出し、ファイルが存在しているかを確認し、存在していればファイルサイズを出力します。 その後、stdinから入力を受けつけて、入力が"SEND"であればファイルを読みだして出力、そうでなければそのままreturnする、という処理を行っています。

2つめの脆弱性は、SENDを行わず、STOPも入力しなかった場合、stack leakが起こるというものです。 ただし、そこまでleakして有効なものは存在していないので、これも利用できるものではありません。

3つめの脆弱性が本命で、SENDでファイルを読み出しバッファに格納する際、バッファは、可変長配列を利用しています。 この時、可変長配列のサイズは、xstatで読み込んだファイルサイズを元に計算しているわけですが、SENDの入力待ちをしている間に、ファイルが書き換えられ、ファイルサイズがより大きくなっていた場合、想定しているファイルサイズと、実際に読み出されるファイルサイズが異なるため、バッファーオーバーフローが起こります。 競合という感じはしませんが、一種のrace conditionと言うことも出来るでしょう。

これを利用すると、最後にwriteによって出力される文字列サイズは、ローカル変数iで記憶されているため、書き換えることでstackの中身を全て見ることが出来、stack canaryをleakさせることが出来ます。 後は、leakさせたstackとRETRで読みだしたlibcを用いて、ROPを構築することで、任意のコード実行を行うことが出来ます。

DEFCON 2014 Writeup sftp

DEFCON 2014 Writeup sftp

DEFCON 2014 Writeup sftp

The flag is: z0mgs0fuckings1mpl3

Gynophage4 polyglot

Just open /flag, and write it to stdout. How hard could it be?

polyglot_9d64fa98df6ee55e1a5baf0a170d3367.2014.2014.shallweplayaga.me 30000

Give me shellcode. You have up to 0x1000 bytes. All GPRs are 0. PC is 0x41000000. SP is 0x42000000.

Throwing shellcode against linux26-x86.(http://services.2014.shallweplayaga.me/polyglot_9d64fa98df6ee55e1a5baf0a170d3367)

Throwing shellcode against linux26-armel.(http://services.2014.shallweplayaga.me/polyglot_6a3875ce36a55889427542903cd43893)

Throwing shellcode against linux26-armeb.(http://services.2014.shallweplayaga.me/polyglot_c0e7a26d7ce539efbecc970c154de844)

Throwing shellcode against linux26-ppc.(http://services.2014.shallweplayaga.me/polyglot_5b78585342a3c116aebb5a9b45e88836)

題名の通り、x86 Linux, ARMel Linux, ARMeb Linux, PowerPCeb Linuxの4アーキテクチャーで/flagの中身を出力するpolyglot shellcodeを書く問題。(初め、それぞれのアーキテクチャに対してshellcodeを書くだけの問題だと思っていたので、4アーキテクチャ上で同じように動く一つのshellcodeを書く問題だと気づいた時にはつらい気持ちになった)

それにさえ気づいてしまえば、後はやるだけ、説明することなし。

DEFCON 2014 Writeup polyglot

The flag is: I can tie a knot in a cherry stem

HJ2 byhd

Who hath lived like hacker's life and refused the normalness must be rewarded with straw, sticks and bricks.

http://services.2014.shallweplayaga.me/byhd_147e0accdae13428910e909704b21b11

byhd_147e0accdae13428910e909704b21b11.2014.shallweplayaga.me:9730

ハフマン符号化したshellcodeを送ると、復号化して実行するバイナリ。 ほとんど読んでないのでそれ以上の詳細はよく知りません。 符号の対応表は定数であるため、gdbでheapメモリをダンプし、search.pyを使うことで求めました。

DEFCON 2014 Writeup byhd

DEFCON 2014 Writeup byhd

やるだけ。

The flag is: What a cold ass gershnoskel.

Jymbolia2 100lines

It's not broken, you just need more RAM.

http://services.2014.shallweplayaga.me/100lines_53ac15fc7aa93da92629d37a669e106c

100lines_53ac15fc7aa93da92629d37a669e106c.2014.shallweplayaga.me:20689

DEFCON 2014 Writeup 100lines

直して

DEFCON 2014 Writeup 100lines

ダンプして書くだけ

The flag is:#RadicalSpaceOptimization!

Gynophaseの問題が非常に良問で良かったと思います。 以上。

@hiromu1996

進捗ダメでした

routardedというクソ問はいくらでもwriteupがあると思うので,他を参照してください

zombies

計算が面倒臭かった以外は,組むだけ

水平距離と高さが与えられて,そこを通るように仰角を計算するだけ.

ゾンビが距離x,高さyの点にいるとして, 仰角をθ,弾丸の初速をvとおくと,速度のx方向の成分は  { \displaystyle
v_x = v \cos \theta
} 及びy方向の成分は  { \displaystyle
v_y = v \sin \theta
} となる. 水平距離をこの速度で割ると,到達までの時間が計算できて,  { \displaystyle
t = \frac {x}{v_x}
} となる. あとは,重力加速度を考えて,  { \displaystyle
y = v_y t - \frac {g t ^ 2}{2}
} という等式を満たすθを求めればよい.

適当に式変形をすると,  { \displaystyle
a = \frac {y}{x}, b = \frac {x g}{2 v ^ 2}
} として

{ \displaystyle
\theta = \arctan { \frac { \sqrt { ( \sqrt { \frac {1}{(a + b) ^ 2} - \frac {4b}{a + b} } + \frac{1}{a + b} ) ^ 2 + 4 } - (\sqrt { \frac {1}{(a + b) ^ 2} - \frac {4b}{a + b} } + \frac{1}{a + b}) }{2} }
}

で求まる.

Level 1-10はこれでいけて,Level 11-100は,更にゾンビと子犬の座標が与えられて そこへtr秒間で動くというものになる. どうやらチェックが適当らしく,出力で返す(x, y)を仰角θ及び初速vで通り, さらに,その(x, y)がゾンビと子犬を結ぶ直線上にあれば正解と扱われるみたいだったので, tr - 2秒で届く場所に投げるように出力した.

ソースはこちら.

CSCamp CTF Writeup

CSCamp CTFに出場し、一応全問題を解きました。 始めるのが遅かったので、ボーナス点のせいで全体では6位でした(CTFTime順位反映してくれ...)。

少し前からEpsilonDeltaとしてWriteupを書くようにはなったのですが、個人個人でwirteupを書いたほうがいいんじゃないかという話になったので、メンバーごとに段落分けして書く方式を採用したいと思います。 非同期になることをお許し下さい。

@potetisensei

皆さん、こんにちわ。

僕は基本的にはバイナリ担当なのですが、CSCampのバイナリは全て簡単で骨がなかったですね。 ということで、僕はバイナリのWriteupを書こうと思います。

crackme1.exe

何の変哲も無い.NETバイナリですね。 適当に読んでやると、環境変数からUSERNAMEを取得し、saltをつけた状態でMD5を取り、3byteおきに値をチェックしているようです。 passwordなどはResource内に平文で保存されているので、USERNAMEさえ分かればFlagは手に入りそうですね。

Flag: e6169c0c7b8841649ca0e22cba82353a

crackme2.elf

CTFにおいてバイナリの関数を全て読む必要はないタイプの典型的な例ですね。 見たところ、実行するたびに関数sub_400FB0からランダムな数値が返ってきて、 それによってXORされるデータが変化し、表示される文字列が変わるようです。

実行する限り、sub_400FB0から帰ってくるのは0~6までの値ですが、実際にはXORされて保存されているデータは8つあり、おそらく7が帰ってきた時、Flagが表示されるのでしょう。

Flag: c816a8eab33a67947cd647a7fc9fb254

kaizen.elf

これは中々面白い問題でしたね。 まず、UPXでpackされているのでunpackします。

実行すると「Flagのdecodeには数年かかるだろう」と表示されるので、 decodeを遅延させている原因を突き止めてパッチを当てるタイプの問題だろうと推測できます。

f:id:Epsilon-Delta:20131121224910p:plain

gdbで実行すると強制終了されるので、まずDebuggerの検知をしている部分を突き止めましょう。 突き止めるのは面倒臭いですが、exitへの条件分岐に使われているFlag、0x6E01F0を0にしてしまえばいいようです。

f:id:Epsilon-Delta:20131121224915p:plain

次に、実行して適当なタイミングでSIGINTを送ってやり、backtraceを行うと、ある場所でずっと止まっているのがわかります。 0x23のsyscall、つまりnanosleepで止まっています。 ここをNOPにしてやりましょう。

f:id:Epsilon-Delta:20131121224927p:plain

後はdecodeルーチンを回すだけなのですが、ループを1周するのに1秒程度かかり、Streamの生成には0x7A69回ループを回す必要があるのでとても現実的ではない時間がかかります(といっても8時間ですが)。

ここで、decodeルーチン内にいつ呼び出しても結果が変わらない、あるいは戻り値が使用されておらず、影響をおよぼすようなグローバル変数への代入がなされていない関数の呼び出しが無駄であるということに注目します。 これら関数へのcallもNOPに書き換えてやり実行すると、15分程度でFlagが得られます。

f:id:Epsilon-Delta:20131122014143p:plain

Flag: eef1b732251bcdd4f085ce78300b252e

challenge.exe

この中では一番難しかったですね。

challenge.exe自体はただの.NETバイナリですが、ソースを読んでみると内部でDLLを復号化し、そのDLLを実行していることが分かります。 DLLはほとんどのメソッドが文字化けしており、逆コンパイルもできないため、可読性は全くと言っていいほどありません。 読んでいった結果、もう一つDLLが復号化されており、そちらはJSONを.NETでいじるためのライブラリのようでした。 どうにかしてJSON側をフックしてやることでFLAGを抜き出すのか、と考えていましたが、明らかに150ptに見合わない労力です。

そこで、内部でJSONを使っているのであれば、メモリ内にFLAG, ないしSerial Numberが存在しているのではないかと考えました。 つまり、動的にメモリをダンプすることで解けないかという考え方です。 ダンプにはうさみみハリケーンを使いました(便利)。

この問題の面白いところは、Usernameには自分のチーム名を入れなければ正解が出ないという点です。 どういう仕組になっているのか非常に興味深い(Download時にチームごとのバイナリを渡してるとは思えないので、バイナリ自体にチーム名などのデータが存在しているはず)ですね。

さて、UsernameにEpsilonDeltaと入力した状態で文字列検索してみます。

f:id:Epsilon-Delta:20131122002114p:plain

この周辺にSerial Number、あるいはFlagが落ちてないか探します。

お、お、お、それっぽいのがある。

f:id:Epsilon-Delta:20131122002234p:plain

やったー。

f:id:Epsilon-Delta:20131122002727p:plain

このWriteupを書いてる時にわかったのですが、Authが成功してから運営のサーバーにFlagを取得しに行ってるようです。 正しいチーム名を入れないとFlagがもらえない理由が納得出来ました。

僕からは以上です。

@hiromu1996

トリビアは割愛.

stega1.png

f:id:Epsilon-Delta:20131123210145p:plain

RGBのRだけ見てやると以下の文字列が.やるだけ.

The Flag is {Are_you_color_blind}

stega2.txt

以下の文章が与えられる.

The kangaroo it a marsupial from the famihy Macrepodidae (macropods, meaning 'large foot'). In common use fhe term is used to descrlbe the largest species from this family, especially those of the ganus Macropus, rgd kangaroo, antilopine kangaroo, iastern grey kangaroo and western grey kangaroo. Kangaroos are endemic to Australia. The smaller macrodods are found in Australia and New Guinoa.

Kangaroos have large, powerful hind legs, large feet adapted for leaping, a long muscular tail for balance, and a small head. Like most narsupials, femate kangaroos have a pouch called a marsupium in which joeys complete postnatal Bevelopment.

Larger kengaroos aave adapted much better[which?] to changes brought to the Australian landscape by humans and fhough many of their smallor cousins are endangered, they are plentifol. They are not farmed to any extent, but wild langaroos are shot for meat, leather hides, and to protect grazing land for sheep and cattle. Although there is some controversy, harvesting kangaroo meat has many environmental and health benefits over traditional meats.

The kangaroo is an unofficial symbol of Australia, and appears as an emblem on the Australian coat of arms, on some of its currency, and is used by some of Australia's well known organisations, including Qantas and the Royal Australian Air Force. The kangaroo is important to both Australian culture and the national image, and consequently there are numerous popular culture references.

Wikipediaのカンガルーの記事とdiffを取ると以下の文字がでてくる.

dontBeafool

これで通らなかったが,Hintのaを取り除けというのをみて,dontBefoolで正解. どうやら作問ミス?

stega3.txt

gist7613922

少し調べるとSams Big Play Makerというステガノグラフィツールのものと分かる. Webサイトがなくなっていたので,Web Archiveからバイナリを落とした. デコードすると,以下のURLが.

http://www.mediafire.com/download/5fppbkaujddijuk/bruteme.rar

ファイル名の通りブルートフォースするとFlag.txtがでてくる.

The Flag is {fb7df6e9ea6a5eb47263734fc158aceb}

stega4.wav

Nyan Catの10秒動画が渡される. Youtubeで元動画を見つけ,データを比べてみると高周波数のデータが増えているという事がわかったが,糸口がつかめなかった.

あとで,運営のアーカイブを抽出しろみたいなヒントをみて,いろいろ試してみるとsteghideだということがわかった. ブルートフォースで"flag"というパスフレーズが正しいと知り,flag.zipを抽出. あとは,もう一度ブルートフォースで5文字のパスワードを探しだすと以下のFlagが.

The Flag is {a57085396f9200c6d38ff66ffa1d3c71}

Crypto 400

message.encとpublic.pemが渡される.

openssl rsa -pubin -in public.pem -text -noout

とすると,RSA 768bitであることがわかる. RSA-768は素因数分解できることで有名なので,あとは対応した秘密鍵を作るだけ. なお,類似のRSA-768を利用した問題がCodegate 2010にSSL通信を見る問題として出題されているので,詳しくはそちらを参照されたい.

デコードすると以下の文字列が出てくる.

F4ct0r!zaTi0N

Crypto

以下のテキストが渡される.

Cipher:3521344454511323 141523 5542233521432351543442 242155 15 132342241334 53212134 5143 53423442525515353344 53331553 15343421144222 34425353425523 5321 5442 421523513444 2351524315344222 1323514352 15 431345425551321534 234423534245 53335123 51224215 15342321 3442432223 515323423424 5321 32554435532152551535335132 451543513513341553512143 154322 2353 4252154321525515353344

一目で「ポリュビオスの暗号表」だと分かる.このままでデコードしてくれるいいツールが見つからなかったので,隣接する2つの数字に応じて一意な文字に置換して,換字式暗号のソルバーに流した.やるだけ.

polybius was responsible for a useful tool in telegraphy that allowed letters to be easily signaled using a numerical system this idea also lends itself to cryptographic manipulation and steganography

あとはこれをmd5とって

dc7100ae6c0e1292908411c2db67decb

Crypto

gist7614059

One Time Padと呼ばれる形式.この記事を読めばあとは実装して,地道に解読するだけだった.

簡単に説明しておくと,同じキーでXORした暗号文同士をXORすると,それは平文同士をXORしたものと同じになるという仕組みを利用したもの. あとは,ある平文の1文字を特定すると,他の平文の同じ位置の文字を特定できることから地道に解読する. 今回は,一番最後の文のいずれかにkeyという単語が入ってそうという事がわかるので,場所を全探索して,他の平文も英語らしくなる場所を見つけてやるというようなことを繰り返した.

解読するとこんな感じ.

And God saw the light that it was good an

So God created man in his own image in th

But we are sure that the judgment of God

And God called the dry land Earth and the

For there is no respect of persons with G

His head and his hairs were white like wo

And the evening and the morning were the

Let fall also some of the handfuls of pur

The LORD heard the voice of your words an

The LORD your God which goes before you h

But as for you turn you and take your jou

Maybe youjustfoundmanykeys is the answer

答えは,youjustfoundmanykeys

Crypto

Zc duwcievvohpxqv uf bue xw iuzmgwtpthshon. Xpby wg tzx bak eikdxqht; wh'y sse rui ru tx bagh agexmky. Hvk qpiz og hnp pwpkfqgdi mfs rsk qmdx nogn zj bak yse tr thcsfilwm.

換字式暗号だと思いこんだので,かなり悩まされた.sseとかeelしかないだろとか思っていたが,調べるとヴィジュネル暗号だとわかった.あとはオンラインの解読ツールに投げるだけ.

解読すると,googleitというkeyで以下の文字列がでてきた.

to polyalphabetic or not to polyalphabetic. this is not the question; it's how you do it that matters. the flag is the lowercase emm dee five hash of the key in lowercase.

Flagは,36a2b79e4c40eabc3824b2bb433978f4

Crypto

Dhvgr n irel fvzcyr bar gb qrpbqr, unfu gur bevtvany grkg gb trg lbhe synt. Gnxr vagb pbafvqrengvba gur chapghngvba naq pnfvat.

換字式暗号.

Quite a very simple one to decode, hash the original text to get your flag. Take into consideration the punctuation and casing.

Flagは,e75b63e0332049ec5f9df4e5e3d1295d

Crypto

MD5 the original plaintext, no spaces, lowercase.

Hint: generate keys

14324425224113142433434443214155311452242534424432141454

いろいろ悩んだ末に,Bifid Cipherというものを見つける. Hintの7文字づつというのにしたがって並び替え,もうひとつのHintによって与えられたi, a, t, g, eを当てはめると以下の通りに.

1432442 1424334 4155311 3442443

5224113 3444321 4522425 2141454

i_a_t__ ge_____ _______ _______

地道に解読すると,以下の通りに.

1432442 1424334 4155311 3442443

5224113 3444321 4522425 2141454

iwantto generat ei__s_i atekeys

残りの部分に当てはまる単語はないので,困っていたが,試しに入れてみたiwanttogenerateimmediatekeysのmd5で正解になった.作問ミス.

Flagは,d2cfdb800d3243aa91299b7218b410c0

Web 400

Webなので簡潔に.

WAFが使われていると書かれていて,クオートとか全く使えなかったので困っていたが,調べてみると.ASCIIコードで変な文字に動かしているだけという事が分かる. Pythonで書くと以下のような感じ

waf = ''
for i in query:
    waf += chr(ord(i) + 32)

あとは,SQLインジェクションするだけ. Flagは,91114d86ac92d7f074295c6258bdf5df

Forensics 1

以下のSQL Dumpが渡されて,侵入者によって追加されたユーザーを見つけろというもの.

gist7614235

よく見ると,一部の行だけ改行がCRLFになっているので,その次の行のユーザーを全部見つけるだけ.

追加されたユーザーを上から順にカンマでつないでmd5にすると,Flag: 71284b9edd33e4141952b325a9c6acdaが得られる.

Forensics 2

vmem形式でメモリダンプが与えられるので,volatilityで開く.

vol.py pslist -f file.vmem --profile=WinXPSP2x86

gist7614334

怪しいdecryptpastebinのmemdumpを抽出して,眺める.

Pythonのプロセスっぽい文字列がたくさんあるなかに,以下のような文字列が.

Welcome to pastebin decryptor v0.1beta


id:KEY=


さらに,チャットの痕跡を見つけ,そのなかに以下のような会話が.

PRIVMSG [DDS]ahmed :yeaah, finally we got the correct flag

PRIVMSG [DDS]ahmed :take this enc-bin dpAtnvCB:looool

PRIVMSG [DDS]ahmed :oupsss

PRIVMSG [DDS]ahmed :sorry

PRIVMSG [DDS]ahmed :this one V5BvcN64:LtqK_tRU7YlF

つまり,decryptorでV5BvcN64:LtqK_tRU7YlFをdecryptするとFlagが出てくるようだ.

適当にdumpを眺めていると,プロセスがhttp://pastebin.com/raw.php?i=V5BvcN64にアクセスして,RSAでLtqK_tRU7YlFという文字列を使って復号化していることがわかる. 出てきた変数名などで検索すると,これをそのまま流用していることがわかったので,後は復号化するだけ.

Flagは,d99cbe01e4b0c0da0e4711e7c0114e79

EpsilonDelta、バルセロナに行く(1日目)

EpsilonDelta、バルセロナに行く

1日目(10/30)

スペインに到着し、Aerobusでバルセロナ市内まで移動し、ホテルにチェックインしました。
チェックインしたあとはホテル周辺を散策することに。
「Superdry 極度乾燥(しなさい)」ブランドの店を見つけて、 @potetisensei が服を購入していました。
その後、海に向かって歩いているとCatedral de Barcelona(サンタ・エウラリア大聖堂)があったため、中を見学しました。
予想以上の大きさに圧倒され、また海外に来たことが実感できる建物でした。
オススメと言われた海辺の店でイカスミパエリアを食べるなどして、この日は帰宅しました。
個人的には、スペインで販売されているZTE Openを発見することができたのが大きな収穫となりました。

EpsilonDelta、バルセロナに行く(0日目)

EpsilonDelta、バルセロナに行く

0日目(10/29)

18:00ごろに関西国際空港にメンバー全員が集合しました。
この時、新潟から参加した @nk0t は他のメンバーとの初顔合わせとなりました。
出発までに必要物資を揃えたり、551の肉まんを食べて英気を養いつつ、22:40に日本を出発しました。
スペインへの直通便はないのでドーハで乗り換えをし、飛行機内で日付が変わり1日目になります。

EpsilonDelta、バルセロナに行く

現在私達は、スペイン・バルセロナに居ます。

短く経緯を説明すると、NoConName Facebook CTFの予選を通過し、バルセロナで行われる本選に出場できるようになったためです。
初めは、CTF参加者に対する交通費補助等が一切ないことから、出場を辞退することも検討に含めてたのですが、そのことをTwitterで発言したところ @syuu1228 さんがカンパページを作成して下さり、なんとか出場することができました。
カンパページを作ってくださった @syuu1228 先生、カンパに協力・拡散してくださった多くの方々に改めて感謝いたします。

目的であるCTF自体は1日、NoConNameカンファレンスは2日しか行われないのですが、せっかく海外に行くのだからと1週間ほど(移動時間を除けば5日間)予定を取ってバルセロナに行くことになりました。
10/29日に出発し、11/5に帰国するという予定になっています。

写真は全てhttp://www.flickr.com/photos/tyage/sets/72157637147617233/にアップロードされております。