2014年1月26日日曜日

SECCON CTF 2013 ONLINE wirteup

表題通り.
route 9として参加しました.

解いたのはMisc200「Encode me.」とBin300「RISC Processor」

たぶんけっこうの人が解いてるとおもうのでどちらかというと自分の備忘録です

Misc200

問題のファイル、encode_me_91は31byteのバイナリファイルで、
31byteというのをみてもしやアセンブラ短歌では…とか思いましたが全く見当違いでした.

ファイル名の91がヒントで、
ecoding 91とかでググるとbasE91というエンコーディングが出てくるので、
それをつかってencode_me_91をエンコードすると
PASSWORD/IS/WHICH+ENCODING+DO+YOU+LIKE
とでます.それだけでした.

Bin300

char main[] =" ....
とmainという配列にASCIIコードが詰まってて、これをバイナリとして解釈すると
マシン語になるというやつ. shell codeっぽい.
char main[]も函数として解釈されちゃうのはIOCCCで知りました.

とりあえず使ってたマシンがGentooだったので
$ crossdev -t <arch>で有名どこのRISCアーキテクチャのツールチェインを用意して、
コンパイル->objudmp -Dのコンボ.
なぜかshとsparcのemergeに失敗しました…

その逆アセンブル結果いまどっかいったのであとで見つければ載せる.
追記: みつけた

やってることはひたすらr0とr3にデータをロードして減算でASCIIコード作りだしては
スタックに載せてスタックポインタ(r1レジスタ)を一つ進める、を繰り返して、
r0に4、r3に1、r4にスタックポインタ、r5に10を格納してシステムコール.
r0をシステムコール番号、r3、r4、r5をarg1、arg2、arg3として解釈するので、
Linuxでシステムコール番号4番のsys_write( unsigned int fd, const char *str, size_t count )
を呼びだす.
sys_write( stdout, スタックポインタ, 10 );
なのでそれまでにスタックに積んだASCIIコードを吐き出してるだけ.
その後のコードはsys_exit( 0 )してるだけでした.

答えは
Hakkaisan
でしたがHakkaisanて八海山…?