GeekPwn招待試合SecretCode Writeup
2106 ワード
Overview
問題はAPKを与えました。MISCタイプに属しています。APKを調べて、既存の暗号化アルゴリズムの分析を発見しました。JNIがなく、Proggerard混淆があります。混淆を通してJava層コードの真実な論理を分析する必要があります。
Analysis
プログラムのAndroidソースは三つの部分に分けられています。一枚の写真からkeyを読み込んで、keyを処理して、ユーザーを使って+keyを入力して結果を得ます。
Solution
問題はAPKを与えました。MISCタイプに属しています。APKを調べて、既存の暗号化アルゴリズムの分析を発見しました。JNIがなく、Proggerard混淆があります。混淆を通してJava層コードの真実な論理を分析する必要があります。
Analysis
プログラムのAndroidソースは三つの部分に分けられています。一枚の写真からkeyを読み込んで、keyを処理して、ユーザーを使って+keyを入力して結果を得ます。
InputStream v0_1 = this.getResources().openRawResource(R.raw.url);
int v1 = v0_1.available();
byte[] v2 = new byte[v1];
v0_1.read(v2, 0, v1);
byte[] v0_2 = new byte[16];
System.arraycopy(v2, 144, v0_2, 0, 16);
this.para = new String(v0_2, "utf-8");
画像の論理を読み取り、安い144から16文字を読み、this_を分析します。is_the_key. private String append(String arg4) {
String v0_2;
try {
arg4.getBytes("utf-8");
StringBuilder v1 = new StringBuilder();
int v0_1;
for(v0_1 = 0; v0_1 < arg4.length(); v0_1 += 2) {
v1.append(arg4.charAt(v0_1 + 1));
v1.append(arg4.charAt(v0_1));
}
v0_2 = v1.toString();
}
catch(UnsupportedEncodingException v0) {
v0.printStackTrace();
v0_2 = null;
}
return v0_2;
}
keyを処理するには、単純に2つの位置が入れ替わります。次に、コードの比較段階で予想される暗号文は何かが分かりました。暗号文に鍵を加えて、明文が得られます。Solution
import javax.crypto.spec.SecretKeySpec;
public class Solve {
public static void main(String[] args) throws Exception {
byte[] output = new byte[]{21, -93, -68, -94, 86, 117, -19, -68,
-92, 33, 50, 118, 16, 13, 1, -15, -13, 3, 4, 103, -18, 81, 30, 68, 54, -93, 44, -23,
93, 98, 5, 59};
String key_str = "this_is_the_key.";
String key_sft = "htsii__sht_eek.y";
SecretKeySpec secretKeySpec = new SecretKeySpec(key_sft.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
String s = new String(cipher.doFinal(output));
System.out.println(s);
}
}
**flag:LCTF{1t's_rea1ly_an_ea3y_ap4}**