分析
題さ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