読者です 読者をやめる 読者になる 読者になる

CTFその2

ksnctf

CTFに挑戦してみました。
挑戦したのはこの問題
ksnctf - 15 Jewel
今回は250ポイント。
まずはapkをダウンロードしました。

セキュリティについての知識が問われているのによくわからないアプリを実機に入れるのってどうなんだろうか……とセルフツッコミをいれながらとりあえず実機にインストール。

なんかエラー出てきた……

調べてみるとapkからJavaのソースファイルを得ることができるというのでやってみることにしました。

その結果得たのが
3つのファイル、JewelActivity.java,a.java,b.java
このうちa.javaとb.javaには大したことが書いてありませんでした。
主な処理はJewelActivity.javaで行われていました。
バイスIDを秘密鍵としたAESで何らかのファイルの復号を行っているようです。
要は適切なデバイスIDを発見しさえすればよいのですね。

さて、デバイスIDは15桁の数字(0~9)で表されますが、そのうち上位8桁はソースコードを参照することで把握出来ているので、あとは残りの七桁を特定すればよいはずです



候補となるデバイスIDをsha256にかけ、出てきたハッシュがソースコードにある値と一致したならば、それが求めるべきデバイスIDです。
以下のような簡単なスクリプトを書くと……

import hashlib

for i in range(0,10000000):
    tmp="99999991%07d" % i    
    hash=hashlib.sha256(tmp).hexdigest()
    if hash=="356280a58d3c437a45268a0b226d8cccad7b5dd28f5d1b37abf1873cc426a8a5":
        print tmp

で、表示された値を用いて、復号します。

from Crypto.Cipher import AES

srcimg="jewel_c.png"
dstimg="flag.png"
inf=open(srcimg,'r')
data=inf.read()
cipher=AES.new("!999999913371337",AES.MODE_CBC,"kLwC29iMc4nRMuE5")
ans=cipher.decrypt(data)
outf=open(dstimg,"w")
outf.write(ans)
inf.close()
outf.close()

フラグは画像のコメント欄に。

クリア。