リバースアプリ - Androidは、データベースのバックアップファイルを暗号化し、sqliteCipher

 

 

分析

題さXCTFのAPP3、拡張子ABのファイルをダウンロード

.Abファイル拡張子暗号化の二つのタイプに分け、暗号化されていないバックアップファイル形式Androidシステム、です

Abは最初のファイルヘッダの24バイトに似ている暗号化されていない場合、それは暗号化されている場合、AES-256の最初の24のバイトは符号を持つことになり、その後、最初の24のバイトはどれもないであろうロゴ

 

winHexのロード、BACKUP 2アンドロイドた  1つの  どれも暗号化されていないノーノの代わりにし、

 

 

 

ABファイルはzipファイルに転送されます

オープンソースプロジェクトはgithubの上でありAndroid backup extractorます。https://github.com/nelenkov/android-backup-extractor圧縮ファイル、プロジェクトのアドレスにファイルを.abすることができます

E:\デスクトップ >のjava -jar ade.jarアンパック1.ab ./1 .zipの
 0%、1%、2%、3%、4%、5%、6%、7%、8%、9%10%11%12%13%14% 15%16%17%18%19 20%21%%22 
%が23%24%25%26%が27%28%29%30%が31%32%33%34%が35%36%37%38%39% 40%41%42 
43%%は44%45%46%47%が48%49%50%51%52%53%54%55%56%57%58%59%60 61%62%
%63%64% 65%66%67%68%69%70%71%72%73%74%75%76%77%78%79%80%81 82%
83%84%%は85%86%87%88%89% 90%91%92%93%94%95%96%97%98%99%100%
9097216バイト./1.zipに書き込まれます。

 

使用JEBは、アプリをロード

解凍.ab変換圧縮されたファイルは、開いて、憶測が暗号化されていませんAPKファイルとDBファイルのdbファイルを見つけました

 

 

 

ロードAPK、解析結果MainActivityファイルは、アルゴリズムのDBデータベースが含まれています

 

復号化機能に基づいてスクリプトを書きます

class a {
    private String a;

    public a() {
        super();
        this.a = "yaphetshan";
    }

    public String a(String arg4, String arg5) {
        return arg4.substring(0, 4) + arg5.substring(0, 4);
    }

    public String a(String arg3) {
        new b();
        return b.b(arg3 + this.a);
    }

    public String b(String arg2, String arg3) {
        new b();
        return b.a(arg2);
    }
}





public class b {
    public b() {
        super();
    }

    public static final String a(String arg9) {
        String v0_2;
        int v0 = 0;
        char[] v2 = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        try {
            byte[] v1 = arg9.getBytes();
            MessageDigest v3 = MessageDigest.getInstance("MD5");
            v3.update(v1);
            byte[] v3_1 = v3.digest();
            int v4 = v3_1.length;
            char[] v5 = new char[v4 * 2];
            int v1_1 = 0;
            while(v0 < v4) {
                int v6 = v3_1[v0];
                int v7 = v1_1 + 1;
                v5[v1_1] = v2[v6 >>> 4 & 15];
                v1_1 = v7 + 1;
                v5[v7] = v2[v6 & 15];
                ++v0;
            }

            v0_2 = new String(v5);
        }
        catch(Exception v0_1) {
            v0_2 = null;
        }

        return v0_2;
    }

    public static final String b(String arg9) {
        String v0_2;
        int v0 = 0;
        char[] v2 = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        try {
            byte[] v1 = arg9.getBytes();
            MessageDigest v3 = MessageDigest.getInstance("SHA-1");
            v3.update(v1);
            byte[] v3_1 = v3.digest();
            int v4 = v3_1.length;
            char[] v5 = new char[v4 * 2];
            int v1_1 = 0;
            while(v0 < v4) {
                int v6 = v3_1[v0];
                int v7 = v1_1 + 1;
                v5[v1_1] = v2[v6 >>> 4 & 15];
                v1_1 = v7 + 1;
                v5[v7] = v2[v6 & 15];
                ++v0;
            }

            v0_2 = new String(v5);
        }
        catch(Exception v0_1) {
            v0_2 = null;
        }

        return v0_2;
    }


    public static void main(String[] args) {
        a v1=new a();
        String v2=v1.a("Stranger","123456");//123456是1E240的10进制
        System.out.println(v1.a(v2 + v1.b(v2, "password")).substring(0, 7));
    }
}

运行脚本得出db文件密码为ae56f99

 

 

使用DB Browser for SQLCipher打开加密的db,得到base64加密的字符串

解码后得出flag

 

参考:https://www.52pojie.cn/thread-1082706-1-1.html

おすすめ

転載: www.cnblogs.com/luocodes/p/12130619.html