android-app-100 攻防世界

工具

JEB+IDA+夜神模擬器

思路展開
1.安裝應用,觀察驗證

輸入一段字符,點擊Login,錯誤提示just keep trying,有點擊事件,故從點擊事件入手

1

2.JEB打開,觀察函數,分析算法
public void onClick(View arg8) {
        new String(" ");
        String v0 = this.a.b.getText().toString();      //v0是輸入字符
        Log.v("EditText", this.a.b.getText().toString());
        new String("");
        int v1 = this.a.processObjectArrayFromNative(v0);  //兩個函數對輸入字符處理,但當我們點進去,發現函數爲空
        int v2 = this.a.IsCorrect(v0);
        v0 = String.valueOf(this.a.d + v1) + " "; //處理過的v1+this.a.d,函數不知道,所以v1不知道,this.a.d=0x1BEBE
        try {
            MessageDigest v1_1 = MessageDigest.getInstance("MD5");//對每個字符md5加密
            v1_1.update(v0.getBytes());
            byte[] v1_2 = v1_1.digest();
            StringBuffer v3 = new StringBuffer();
            int v0_2;
            for(v0_2 = 0; v0_2 < v1_2.length; ++v0_2) {
                v3.append(Integer.toString((v1_2[v0_2] & 0xFF) + 0x100, 16).substring(1)); //對每個字符先取低八位,再加0x100,接着字符轉成16進制,再從索引爲1開始取,其實我們對字符沒有操作,只是轉成16進制
            }

            if(v2 == 1 && this.a.e != "unknown") {
                this.a.c.setText("Sharif_CTF(" + v3.toString() + ")");//關鍵比較,將16進制形式作爲flag輸出
            }

            if(v2 == 1 && this.a.e == "unknown") {
                this.a.c.setText("Just keep Trying :-)");
            }

            if(v2 == 0) {
                this.a.c.setText("Just keep Trying :-)");
            }

            return;
        }
        catch(NoSuchAlgorithmException v0_1) {
            v0_1.printStackTrace();
            return;
        }
    }

分析了一圈,發現是將我們的輸入先經過IsCorrect判斷,再經過processObjectArrayFromNative處理的值,md5加密,再以16進制輸出

3.改apk後綴爲zip,解壓打開,找到so文件,IDA分析兩個關鍵函數

發現兩個函數
2
點開IsCorrect函數(這個函數在上面分析過,是用來判斷輸入是否正確)發現關鍵比較,按r轉字符串3
輸入 ef57f3fe3cf603c03890ee588878c0ec4
得到flag
Sharif_CTF(833489ef285e6fa80690099efc5d9c9d)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章