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)

发布了42 篇原创文章 · 获赞 17 · 访问量 4990

猜你喜欢

转载自blog.csdn.net/weixin_45055269/article/details/105430552