描述

Some hashes, cats and strings generation.

目标

找到Flag

APK下载

https://yhxx.lanzoub.com/iwKDO0mj4kfg

题解

首先打开APP看一下,可以看到是输入密码点击SUBMIT来获取Flag

CrackMe 用Jadx-GUI打开APK看一下源码,在`MainActivity`中找到了`SUBMIT`按钮绑定的`onClick`函数。 在①中通过`FlagGuard().getFlag()`函数来根据获取文本框中输入的`password`得到`flag`。 ②中`Flag`不为空则展示`Congratulations!`和`Flag`。 CrackMe

进入FlagGuard().getFlag(),发现只要传入的str(即输入的password)与Data().isPasswordOk(context)相等就会返回②所计算出的flag,现在只需要看Data().isPasswordOk()就可以拿到密码。

CrackMe

Data().isPasswordOk()可以从①中看到密码长度是6,然后在②中将用户填入的password进行md5加密并与现有的md5字符串ac43bb53262e4edd82c0e82a93c84755作对比,相等则给出flag。

CrackMe

于是现在有两种解法: 1.找出md5字符串ac43bb53262e4edd82c0e82a93c84755的明文,即为密码。 2.让isPasswordOk()函数永远返回true,随便输入6位字符串即可拿到flag。

方法一

到md5撞库解密的网站输入ac43bb53262e4edd82c0e82a93c84755,得到明文为3#8H1J

CrackMe 输入密码`3#8H1J`,即可拿到flag。 CrackMe

方法二

使用frida对isPasswordOk()函数进行hook,使之永远返回true。 hook代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
function main() {
  Java.perform( function(){
    let Data = Java.use("net.persianov.crackme0x03.Data");
    Data["isPasswordOk"].implementation = function (str) {
      console.log('isPasswordOk is called' + ', ' + 'str: ' + str);
      let ret = true;
      console.log('isPasswordOk ret value is ' + ret);
      return ret;
    };
  })
}

setImmediate(main);

重启app注入js frida -U --no-pause -f net.persianov.crackme0x03 -l crack.js

CrackMe 随意输入字符串即可拿到flag。 CrackMe