GeekPwn招待試合SecretCode Writeup

2106 ワード

Overview
問題は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}**