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に失敗しました…

その逆アセンブル結果いまどっかいったのであとで見つければ載せる.
追記: みつけた
addi r1,r1,-16
li r0,24673
li r3,24672
subf r3,r3,r0
li r2,10
stb r2,0(r1)
mr r4,r1
subf r1,r3,r4
li r2,78
addi r2,r2,32
stb r2,0(r1)
mr r4,r1
subf r1,r3,r4
li r2,49
addi r2,r2,48
stb r2,0(r1)
mr r4,r1
subf r1,r3,r4
li r2,64
addi r2,r2,51
stb r2,0(r1)
mr r4,r1
subf r1,r3,r4
li r2,64
addi r2,r2,41
stb r2,0(r1)
mr r4,r1
subf r1,r3,r4
li r2,33
addi r2,r2,64
stb r2,0(r1)
mr r4,r1
subf r1,r3,r4
li r2,59
addi r2,r2,48
stb r2,0(r1)
mr r4,r1
subf r1,r3,r4
li r2,48
addi r2,r2,59
stb r2,0(r1)
mr r4,r1
subf r1,r3,r4
li r2,64
addi r2,r2,33
stb r2,0(r1)
mr r4,r1
subf r1,r3,r4
li r2,36
addi r2,r2,36
stb r2,0(r1)
li r0,24676
li r3,24672
subf r3,r3,r0
ori r2,r3,0
li r0,24682
li r3,24672
subf r3,r3,r0
ori r5,r3,0
li r0,24673
li r3,24672
subf r3,r3,r0
ori r4,r1,0
ori r0,r2,0
sc
li r0,24673
li r3,24672
subf r3,r3,r0
ori r0,r3,0
li r3,0
sc
view raw seccon_risc.asm hosted with ❤ by GitHub

やってることはひたすら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て八海山…?