表題通り.
route 9として参加しました.
解いたのはMisc200「Encode me.」とBin300「RISC Processor」
たぶんけっこうの人が解いてるとおもうのでどちらかというと自分の備忘録です
Misc200
問題のファイル、encode_me_91は31byteのバイナリファイルで、
31byteというのをみてもしやアセンブラ短歌では…とか思いましたが全く見当違いでした.
ファイル名の91がヒントで、
ecoding 91とかでググるとbasE91というエンコーディングが出てくるので、
それをつかってencode_me_91をエンコードすると
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 )してるだけでした.
答えは
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に失敗しました…
その逆アセンブル結果いまどっかいったのであとで見つければ載せる.
追記: みつけた
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
やってることはひたすら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て八海山…?