首页
社区
课程
招聘
[原创] Android逆向CrackMe基础三连题
2023-2-11 15:43 22453

[原创] Android逆向CrackMe基础三连题

2023-2-11 15:43
22453

闲来无事,去找一些CrackMe练练手,偶然发现一个网站有三个CrackMe,但都比较简单,只用到了Jadx-gui和Frida,现在把这三道题解法贴出来。
原站地址:https://persianov.net/crackme-challenges-for-android

CrackMe0x01

这道题的介绍是: The very basic crackme challenge. Gives you chance to get familiar with all Android RE tools.
翻译过来就是这个题很简单,让你练练手熟悉一下。
我们先安装App看看(文末上传三个APP)

可以看到只有一个密码的提交键
于是我们打开Jadx-gui来观赏一下。

打开Jdax-gui后先找到按键的onClick函数,然后便看到了明晃晃的大字“Congratulations!”
成功的入口就是flag不为空,所以我们从getFlag继续点进去

点进去之后发现getFlag里面嵌套了一个equals判断,为true的话就成功了,我们进去看一下有没有密码。

点开时候发现果然是练手题,明文密码就直接出现了,我们直接输入密码就可以进入程序了。

CrackMe0x02

这道题的介绍是: What if JD-GUI doesn’t show you the password?
翻译过来就是,这次Jadx-gui可就不显示密码了。
我们先安装App看看(文末上传三个APP)

赫赫,如出一辙,那就继续用Jadx-gui看看


可以看到前面的函数都是一样的操作,但题目说没有明文,那我们继续看getData里面是什么。

我们可以看到,这次的密码实在资源文件中,但资源文件中的secret是不可见明文的,那这时我们就要用到Frida来hook一下看看了。
新版Jadx-gui可以直接右键复制Frida代码,以下就是Frida代码了。

1
2
3
4
5
6
7
8
9
10
11
12
13
function main() {
  Java.perform( function(){
    let Data = Java.use("com.entebra.crackme0x02.Data");
    Data["getData"].implementation = function (context) {
      console.log('getData is called' + ', ' + 'context: ' + context);
      let ret = this.getData(context);
      console.log('getData ret value is ' + ret);
      return ret;
    };
  })
}
 
setImmediate(main);

然后我我们启动hook,再随便输入一个字符串,触发一下getData函数

这下我们就看到密码了,输入密码后就成功进去了。

CrackMe0x03

这道题的介绍是: Some hashes, cats and strings generation.
翻译过来就是,这次Jadx-gui不仅不显示密码了,还用到了哈希。
我们先安装App看看(文末上传三个APP)

赫赫,我就猜到还是一样的,老样子Jadx-gui

开局还是一样的操作,我们再进去看看

这次的getFlag中增加了一个isPassWorkOk函数,当这个函数返回true后,就会进入程序显示flag。

我们可以看到在isPassWorkOk里面是直接通过hash来进行比较了,被比较的hash值是:

ac43bb53262e4edd82c0e82a93c84755

 

我去了各个md5网站都没有找到这个值的明文,但我们可以看出来,这次的密码长度为6,所以如果暴力遍历的话有成百上千亿种方案,我先是把数字和小写字母的组合遍历一遍后没有结果,于是就想着只要拿到flag就可以了。
接着就开始写Frida代码,只要把isPassWork返回true就可以得到flag进入程序了,代码如下:

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);

hook之后随便输入一个6位数的字符串

然后我们就得到flag进去了

 

三道基础题这就解完了,下次再找找有没有稍微提升一些的再分享给大家。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (2)
雪    币: 539
活跃值: (92)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dp_grost 2023-2-22 00:08
2
0
能请教一下,楼主是如何判断是6位的
雪    币: 185
活跃值: (405)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fireworld 2023-2-22 09:37
3
1
dp_grost 能请教一下,楼主是如何判断是6位的
代码里面有
this.password_length = 6;
this.password_hash = "ac43bb53262e4edd82c0e82a93c84755";
游客
登录 | 注册 方可回帖
返回