描述
Some hashes, cats and strings generation.
目标
找到Flag
APK下载
https://yhxx.lanzoub.com/iwKDO0mj4kfg
题解
首先打开APP看一下,可以看到是输入密码点击SUBMIT来获取Flag
用Jadx-GUI打开APK看一下源码,在
MainActivity
中找到了SUBMIT
按钮绑定的onClick
函数。
在①中通过FlagGuard().getFlag()
函数来根据获取文本框中输入的password
得到flag
。
②中Flag
不为空则展示Congratulations!
和Flag
。
进入FlagGuard().getFlag()
,发现只要传入的str
(即输入的password
)与Data().isPasswordOk(context)
相等就会返回②所计算出的flag,现在只需要看Data().isPasswordOk()
就可以拿到密码。
在Data().isPasswordOk()
可以从①中看到密码长度是6,然后在②中将用户填入的password
进行md5加密并与现有的md5字符串ac43bb53262e4edd82c0e82a93c84755
作对比,相等则给出flag。
于是现在有两种解法:
1.找出md5字符串ac43bb53262e4edd82c0e82a93c84755
的明文,即为密码。
2.让isPasswordOk()
函数永远返回true,随便输入6位字符串即可拿到flag。
方法一
到md5撞库解密的网站输入ac43bb53262e4edd82c0e82a93c84755
,得到明文为3#8H1J
输入密码
3#8H1J
,即可拿到flag。
方法二
使用frida对isPasswordOk()
函数进行hook,使之永远返回true。
hook代码如下:
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
随意输入字符串即可拿到flag。