アイジア

CTF, 情報セキュリティの学んだことメモ

Reversing.kr easy elf

Reversing.Krの「Easy ELF」にチャレンジ。以下、やったことのメモ。

実行

ターミナルから実行するといきなり入力を求められる。適当に入力したら「Wrong」と出て終了。

 

IDAで開く

f:id:favoritte15:20180503110800p:plain

 

Functionウィンドウを見てもmain関数らしきものは見当たらない。Stringウィンドウを見てみると「Correct!」と「Wrong」の文字列が見つかった。

「Correct!」はsub_80484F7、「Wrong」はsub_804851Bで使われている。

sub_80484F7には大したことが書かれていなかったのでsub_804851Bを探ってみる。

 

f:id:favoritte15:20180503111826p:plain

「Reversing.kr Easy ELF」と出力した後、

sub_8048434とsub_8048451を呼び出している。

sub_8048451の返り値はeaxに格納されている。

eaxと1を比べて、eaxが1なら「Correct!」それ以外なら「Wrong」と出力される。入力文字列の正誤判定はsub_8048451でされているようだ。

 

f:id:favoritte15:20180503125859p:plain

sub_8048434のscanf命令。入力をアドレス0x804A20に格納していると思われる。

 

 

f:id:favoritte15:20180503112859p:plain

 

 

 sub_8048451ではたくさんのjz命令が記述されている。jzは直後のcmp命令のオペランドの値が等しければジャンプするというもの。

ここではalレジスタと「0x31, 0x58,  0x7C, 0x78, 0xDD」との比較を行っている。

 

f:id:favoritte15:20180503130116p:plain

1回目の比較。2文字目と0x31(=1)を比べている。

2個目のウィンドウでは1文字目が0x34でXOR、3文字目が0x32でXOR、4文字目が0xFFFFFF88でXORされている。そして最後に5文字目と0x58(=X)とを比較。これで2文字目と5文字目が分かった。

 

f:id:favoritte15:20180503130632p:plain

3個目のウィンドウでは6文字目が0(null文字)かどうかを確かめている。つまり正しい入力数は5文字。

4個目のウィンドウでは3文字目と0x7Cを比べているが、これは先ほど0x32でXORされている。XORはもう一度演算すると元に戻るという性質があるので

3文字目は0x7C XOR 0x32 = 0x4E(=N)であることが分かった。

1文字目、4文字目も同様に

0x78 XOR 0x34 = 0x4C(=L)

0xDD XOR 0x88 = 0x55(=U)

と計算できる。

答えはL1NUX