首页
社区
课程
招聘
[原创]举杯邀Frida,对影成三题
发表于: 2020-7-8 13:07 14346

[原创]举杯邀Frida,对影成三题

2020-7-8 13:07
14346

0x00 序言

    在7月建党节之际做了几道作业,回想起学习中国共产党18年革命斗争的历史经验时书本中指出这样一句话:“统一战线武装斗争党的建设,是中国共产党在中国革命中战胜敌人的三大法宝”。

    其实,这句话到什么时刻都是具有一定的借鉴意义。那我们开门见山,接下来放的三道题的解题思路就是靠的三大法宝的“变形”。


0x01 第一题:统一“Frida和Objection”的战线

要求是使用Frida,或者新建工程跑,但我个人是选择了Frida。

如果成功,flag则会输出出来,看一下流程

首先str是username 和 password的转字符串的拼接

String str = MainActivity.this.username_et.getText().toString() + MainActivity.this.password_et.getText().toString();

经过VVVVV.VVVV判断为true之后就会告诉我们“恭喜您,成功了!flag is+str”

那关键的逻辑就在于这个VVVVV.VVVV里面我们去看一下

由于看到VVVV是静态函数,我们选择使用Java.use封装

可以看到成功hook住了我们的输入

接下来我们不要着急写Frida的代码(为什么?因为反编译的结果不能完全相信),既然统一了战线,那先让我们的战友Objection去探探敌情,开远程比较方便:

由于再看了一下前提条件,有个输入长度username+password必须长度为5,因此我们规定username:123 password:45

可以看到VVVV调用了eeeee,此时验证了Jadx反编译的内容确实没错,我们可以放心大胆地使用Frida。

然后输入是12345,返回值是object object

由于返回的是object不便于观察,因此我们使用陈总的r0gson,并用frida打印:

噢明白了,那就是需要这个返回值要和”6f452303f18605510aac694b0f5736beebf110bf“的getBytes结果相等才行~   

我们去Android Stutio新建一个工程后尝试一下打印getBytes()的结果

#结果是:

[54,102,52,53,50,51,48,51,102,49,56,54,48,53,53,49,48,97,97,99,54,57,52,98,48,102,53,55,51,54,98,101,101,98,102,49,49,48,98,102]

那么我们就可以重新写如下脚本爆破“敌方大本营”

可以发现打印了两次,那么这就是flag

当然,如果不想要flag,也可以这么玩

就是无论输入什么都会判断你是对的~


到了第二题,敌人发现了我们火力凶猛,想到使用动态加载Dex进行了初步的保护,别急,我们有第二法宝。


0x02 第二题:面对动态加载保护,我们使用枚举ClassLoader来武装“Frida”斗争

题目要求是“没有要求,做出来即可”。

那我们回到Jadx,我们可以看MainActivity里面存在着动态加载Dex的操作


str是username和password的字符串拼接result是最后拿到flag的关键

result刚开始赋值成false,经过try的处理,可以得知是调用了动态加载的classes.dex中的VVVVV类下的VVVV函数

#使用两步函数调用法

frida -U  com.kanxue.pediy1 -l homework2.js

hookDex()

main()

发现已经成功拿到动态加载的DexClassLoader,并替换我们Frida的Java.ClassFactory,最后成功走到VVVVV类中hook住eeeee函数


OK,敌方的小尾巴已经被我们抓住,开始爆破,主要修改hookDex()


OK,回过头去验证一下:


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-7-8 13:09 被一颗金柚子编辑 ,原因:
上传的附件:
收藏
免费 7
支持
分享
最新回复 (12)
雪    币: 4883
活跃值: (18890)
能力值: ( LV13,RANK:317 )
在线值:
发帖
回帖
粉丝
2
感谢分享~
2020-7-8 14:37
0
雪    币: 1385
活跃值: (5609)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
3
感谢分享~
2020-7-8 19:16
0
雪    币: 3358
活跃值: (3383)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
感谢分享~
2020-7-9 10:00
0
雪    币: 739
活跃值: (1865)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2020-7-9 13:27
0
雪    币: 3372
活跃值: (762)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
感谢分享~
2020-7-9 14:26
0
雪    币: 3032
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2020-7-9 17:42
0
雪    币: 419
活跃值: (845)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2020-7-9 18:26
0
雪    币: 499
活跃值: (2189)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
9
2020-7-9 18:27
0
雪    币: 1216
活跃值: (1632)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢分享
2020-7-10 08:06
0
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
666
2020-7-17 11:02
0
雪    币: 196
活跃值: (5906)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
12
这位学员的解题思路有几个亮点:
1. Frida内置的JSON其实功能非常有限,但是使用谷歌的gson效果就完全不同了,几乎可以打印所有java对象,点赞!
2. “反编译的结果不能完全相信”,使用objection去内存中枚举类并打印调用栈,进一步确认类的名称和执行流程,这样是比较严谨的。
3. Frida hook nativelibc strcmp 判断第二个参数为“REJECT”,体现了尽量不要改so,而且修改系统库的思想,非常优秀。
2020-7-21 10:59
0
雪    币: 225
活跃值: (140)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习大佬思路
2022-12-16 10:47
0
游客
登录 | 注册 方可回帖
返回
//