丶诺熙 发表于 2020-1-11 20:08

攻防世界题解3-app3

# app3

> 附件地址:https://adworld.xctf.org.cn/media/task/attachments/12c5199c0b674da4be05747258218bbe.ab



[@windy_ll](https://www.52pojie.cn/home.php?mod=space&uid=1200926)师傅对这道题的题解已经很棒了。在这里我就再次参考[@windy_ll](https://www.52pojie.cn/home.php?mod=space&uid=1200926)师傅的(https://www.52pojie.cn/thread-1082706-1-1.html)复现一下。


### 复现

首先通过(https://github.com/nelenkov/android-backup-extractor)解开ab文件。可以得到以下内容。


![](http://img.5am3.com/5am3/img/20200111194101.png)

存在两个db文件,打开均需要密码。
此时开始对base.apk尝试逆向。

首先还是看MainActivity,我们可以看到onCreate后,调用了a函数。
![](http://img.5am3.com/5am3/img/20200111195842.png)

此时可以发现a函数为获取秘钥,解密数据库的关键点。

其首先创建了用户名与密码。然后通过tencentwelcome.a.a这个类对其进行加密,最终得到密码,传入b,解密数据库。
故我们需要解密传入到getWritableDatabase中的密码。

分析后,发现未调用so。所以我们可以直接提出关键的java代码。直接执行,即可获取密码。

以下为我们提出的tencentwelcome.a.a,并将MainActivity中的核心逻辑放到了main函数中。
```java
// Test.java
public class Test {

    private String a;

    public Test() {
      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 static void main(String args[]) {
      Test k = new Test();
      String v2 = k.a("Stranger", "123456");
      String ccc = k.a(v2 + k.b(v2, "123456")).substring(0, 7);
      System.out.println(ccc);
    }
}
```

此时分析我们发现还需要一个b的依赖,故也提出来。
```java
// b.java

import java.security.MessageDigest;

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;
            int v1_1 = 0;
            while(v0 < v4) {
                int v6 = v3_1;
                int v7 = v1_1 + 1;
                v5 = v2;
                v1_1 = v7 + 1;
                v5 = v2;
                ++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;
            int v1_1 = 0;
            while(v0 < v4) {
                int v6 = v3_1;
                int v7 = v1_1 + 1;
                v5 = v2;
                v1_1 = v7 + 1;
                v5 = v2;
                ++v0;
            }

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

      return v0_2;
    }
}

```

将上述两个文件保存,然后运行即可。

```bash
javac Test.java
java Test
```

![](http://img.5am3.com/5am3/img/20200111200400.png)

然后解密我们的数据库即可。

![](http://img.5am3.com/5am3/img/20200111200558.png)

最终得到flag

![](http://img.5am3.com/5am3/img/20200111200657.png)

Parker19 发表于 2020-1-11 20:27

学习了,感谢感谢~

2Burhero 发表于 2020-1-11 21:47

感谢分享

woai65662218 发表于 2020-1-11 22:01

学习了   飞创有用。。。

1575581092 发表于 2020-1-12 00:30

学习了,感谢感谢~

daymissed 发表于 2020-1-12 14:47

有点不懂,努力学习

4G小辣椒 发表于 2020-1-12 14:53

感谢分享,,,

nanshenlj 发表于 2020-1-13 03:36

谢大佬.感谢分享

whofly 发表于 2020-1-13 08:50

攻防世界黑客攻防

a1327831029 发表于 2020-1-13 11:52


学习了,感谢感谢{:1_927:}
页: [1] 2
查看完整版本: 攻防世界题解3-app3