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)
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)
本選もがんばります.
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のコード
要点は
- 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を配置し、そこに飛ばしてやればいいことが分かります。
書いたコードがこちら。
本来なら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は簡易shellのようになっていて、入力を関数sub_8048A50でコマンド名、引数のリストにパースし、利用できるコマンドの情報が書かれている構造体のリストと入力したコマンド名を比較、入力したコマンド名と構造体のコマンド名が一致したら、構造体で定義されているcall backされる関数を呼び出すという処理をしています。
あまり詳しく見ていないので、予想ですが、関数sub_8048A50はパースして比較するだけの関数であるため、それ自体に何らかの脆弱性があっても、到底利用出来るものではないでしょう。 従って、callbackされる関数を見ていきます。
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を当てることが出来ます。
これによって探索すると、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コマンド内に存在しています。
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を構築することで、任意のコード実行を行うことが出来ます。
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を書く問題だと気づいた時にはつらい気持ちになった)
それにさえ気づいてしまえば、後はやるだけ、説明することなし。
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を使うことで求めました。
やるだけ。
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
直して
ダンプして書くだけ
The flag is:#RadicalSpaceOptimization!
Gynophaseの問題が非常に良問で良かったと思います。 以上。
@hiromu1996
進捗ダメでした
routardedというクソ問はいくらでもwriteupがあると思うので,他を参照してください
zombies
計算が面倒臭かった以外は,組むだけ
水平距離と高さが与えられて,そこを通るように仰角を計算するだけ.
ゾンビが距離x,高さyの点にいるとして, 仰角をθ,弾丸の初速をvとおくと,速度のx方向の成分は 及びy方向の成分は となる. 水平距離をこの速度で割ると,到達までの時間が計算できて, となる. あとは,重力加速度を考えて, という等式を満たすθを求めればよい.
適当に式変形をすると, として
で求まる.
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を遅延させている原因を突き止めてパッチを当てるタイプの問題だろうと推測できます。
gdbで実行すると強制終了されるので、まずDebuggerの検知をしている部分を突き止めましょう。 突き止めるのは面倒臭いですが、exitへの条件分岐に使われているFlag、0x6E01F0を0にしてしまえばいいようです。
次に、実行して適当なタイミングでSIGINTを送ってやり、backtraceを行うと、ある場所でずっと止まっているのがわかります。 0x23のsyscall、つまりnanosleepで止まっています。 ここをNOPにしてやりましょう。
後はdecodeルーチンを回すだけなのですが、ループを1周するのに1秒程度かかり、Streamの生成には0x7A69回ループを回す必要があるのでとても現実的ではない時間がかかります(といっても8時間ですが)。
ここで、decodeルーチン内にいつ呼び出しても結果が変わらない、あるいは戻り値が使用されておらず、影響をおよぼすようなグローバル変数への代入がなされていない関数の呼び出しが無駄であるということに注目します。 これら関数へのcallもNOPに書き換えてやり実行すると、15分程度でFlagが得られます。
Flag: eef1b732251bcdd4f085ce78300b252e
challenge.exe
この中では一番難しかったですね。
challenge.exe自体はただの.NETバイナリですが、ソースを読んでみると内部でDLLを復号化し、そのDLLを実行していることが分かります。 DLLはほとんどのメソッドが文字化けしており、逆コンパイルもできないため、可読性は全くと言っていいほどありません。 読んでいった結果、もう一つDLLが復号化されており、そちらはJSONを.NETでいじるためのライブラリのようでした。 どうにかしてJSON側をフックしてやることでFLAGを抜き出すのか、と考えていましたが、明らかに150ptに見合わない労力です。
そこで、内部でJSONを使っているのであれば、メモリ内にFLAG, ないしSerial Numberが存在しているのではないかと考えました。 つまり、動的にメモリをダンプすることで解けないかという考え方です。 ダンプにはうさみみハリケーンを使いました(便利)。
この問題の面白いところは、Usernameには自分のチーム名を入れなければ正解が出ないという点です。 どういう仕組になっているのか非常に興味深い(Download時にチームごとのバイナリを渡してるとは思えないので、バイナリ自体にチーム名などのデータが存在しているはず)ですね。
さて、UsernameにEpsilonDeltaと入力した状態で文字列検索してみます。
この周辺にSerial Number、あるいはFlagが落ちてないか探します。
お、お、お、それっぽいのがある。
やったー。
このWriteupを書いてる時にわかったのですが、Authが成功してから運営のサーバーにFlagを取得しに行ってるようです。 正しいチーム名を入れないとFlagがもらえない理由が納得出来ました。
僕からは以上です。
@hiromu1996
トリビアは割愛.
stega1.png
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
少し調べると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
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が渡されて,侵入者によって追加されたユーザーを見つけろというもの.
よく見ると,一部の行だけ改行がCRLFになっているので,その次の行のユーザーを全部見つけるだけ.
追加されたユーザーを上から順にカンマでつないでmd5にすると,Flag: 71284b9edd33e4141952b325a9c6acdaが得られる.
Forensics 2
vmem形式でメモリダンプが与えられるので,volatilityで開く.
vol.py pslist -f file.vmem --profile=WinXPSP2x86
怪しいdecryptpastebinのmemdumpを抽出して,眺める.
Pythonのプロセスっぽい文字列がたくさんあるなかに,以下のような文字列が.
Welcome to pastebin decryptor v0.1beta
さらに,チャットの痕跡を見つけ,そのなかに以下のような会話が.
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日目)
1日目(10/30)
スペインに到着し、Aerobusでバルセロナ市内まで移動し、ホテルにチェックインしました。
チェックインしたあとはホテル周辺を散策することに。
「Superdry 極度乾燥(しなさい)」ブランドの店を見つけて、 @potetisensei が服を購入していました。
その後、海に向かって歩いているとCatedral de Barcelona(サンタ・エウラリア大聖堂)があったため、中を見学しました。
予想以上の大きさに圧倒され、また海外に来たことが実感できる建物でした。
オススメと言われた海辺の店でイカスミパエリアを食べるなどして、この日は帰宅しました。
個人的には、スペインで販売されているZTE Openを発見することができたのが大きな収穫となりました。
EpsilonDelta、バルセロナに行く(0日目)
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/にアップロードされております。