a

よろしくのキワミ

Reversing進捗4

Reversing進捗4

LSE CTF Crackme : Java

動作確認

jar形式のファイルがダウンロードされる。 javaのファイルを問題にするのは初めてのためとてもワクワクしている。

f:id:toDo:20190120084933p:plain

実行してみるが何も起こらず

Javaデコンパイルがほぼ完ぺきにできると聞いたことがあるので そんなに難しい問題ではないと思う

解いていく

まずはお馴染みのstringsから

f:id:toDo:20190120085254p:plain

jar形式のファイルにもstringsが効くんですね。よかった。

出力された結果を見てみるとすでに怪しそうな文字列がいくつかある。
だが今回はデコンパイラを使ってみたいという気持ちが強いため見送り。

このあとバイナリディタでも開いてみたが、初めてJavaの中身を見てみた感想としては

Main.classPK

などの文字列があるためファイルの内容がわかりやすそうではあると感じた。

それではJavaのデコンパイラを使ってみたいと思う。

f:id:toDo:20190120091300p:plain

ソースコードがまるまる見えてしまった。
これじゃあスマホアプリを開発している企業やユーザは複製品やチートなどの対策が大変ですね・・・

処理を見てみよう

f:id:toDo:20190120091919p:plain

ここでは複数の数値を2つの配列に入れている。
その下の変数iはおそらく繰り返し処理や条件分岐などで使用されるのだろう。

f:id:toDo:20190120092138p:plain

続きを見ていくとおそらくメインとなる処理の一部に入っていく。
二つの条件分岐では入力チェックを行っている。

つまり

./RE10.jar "引数"

のような感じで引数を受け取るのだろう。
そしてその長さが0なら

Usage: ./crackme password

arrayOfInt1の長さと同じでないなら

Wrong!

を出力するのだ

では長さが同じときの処理を見てみよう。

f:id:toDo:20190120093053p:plain

新しくint型の変数を宣言し、0を代入しており、
その後にarrayOfInt1の長さになるまで上記の変数をインクリメントしながら繰り返し処理をしている。

ループ処理の中ではコマンドライン引数のj文字目とarrayOfInt1のj文字目をxorしている
そしてその結果がarrayOfInt2のj番目と同じでなければ変数iに0を代入している

さらに繰り返し処理の下では変数iが0でなければ"Success!"0であれば"Wrong!"を出力している。

つまり変数iはフラグで、コマンドライン引数との処理が合わなければ1(True)ではなくなるのだろう。

xorで演算しているので復号は簡単だ

array1 = [ 229, 102, 166, 229, 227, 205, 80, 224, 122, 168, 56, 185, 1, 154, 43, 127, 139, 83, 211, 202, 240 ]
array2 = [ 212, 7, 249, 175, 162, 155, 49, 191, 62, 247, 90, 214, 108, 248, 116, 62, 255, 60, 190, 163, 155 ]

answer = ""

for i in range(len(array1)):
  answer += chr(array1[i] ^ array2[i])

print(answer)

というわけでFlagが入手できた。

感想

"している。"の多用をやめようと思いました。

プライバシーポリシー お問い合わせ