首页
论坛
课程
招聘
[原创]看雪.深信服 2021 KCTF 春季赛 第五题 华山论剑 WP
2021-5-17 01:48 5944

[原创]看雪.深信服 2021 KCTF 春季赛 第五题 华山论剑 WP

2021-5-17 01:48
5944

初识

这是一道不太会的安卓题,使用了规则二,即提供一组可用的用户名及对应注册码。安装后试运行了一下,有正确及错误提示。
按步就班地开始先看看java层的代码。JEB拖入APK后发现,JAVA层的代码比较少,也没什么业务功能,校验按钮的响应函数就是检查输入是否为空,并调用native层函数校验并显示结果,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public void Btn1_Click(View arg6) {
    String v2;
    String v0 = this.text.getText().toString();
    String v1 = this.text2.getText().toString();
    if(v0 == null || (v0.isEmpty())) {
        v2 = "name为空";
    }
    else {
        if(v1 != null) {
            if(v1.isEmpty()) {
            }
            else {
                System.loadLibrary("hello-jni");
                v2 = this.stringFromJNI(v0, v1);
                goto label_21;
            }
        }
 
        v2 = "serial为空";
    }
 
label_21:
    AlertDialog$Builder v3 = new AlertDialog$Builder(HelloJni.mContext);
    v3.setTitle("");
    v3.setMessage(((CharSequence)v2));
    v3.show();
}

于是接着静态看hello-jni这个native库的代码。结果发现没有JNI_OnLoad函数,stringFromJNI函数也好奇怪,如下图。

 

还有两个比较可疑的导出函数xxxxxxxxxx1xxxxxxxxxx2,这两个函数的奇怪情况和stringFromJNI是一样一样的,整个nativ库中就没有大段看起来比较“正常”的代码。这完全超出了我的认知,感觉大脑不够用了,心里好慌乱,不知道作者是用了什么黑科技或黑技术。

尝试

想不明白,直接上手干,默默掏出小米4C手机,动态调试。在stringFromJNI函数处断下后,尝试单步跟踪,结果没跟住,直接就跑飞了。又尝试了几次,不是跑飞,就是异常,而且最后结果还不对了,本来的恭喜成功变成了输入错误

 

似乎面临的一切都是未知的,未知中又会诱发出诸多猜想。我猜想,作者应该是通过黑科技隐藏了JNI_OnLoad函数,JNI_OnLoad函数会改写代码。于是开始尝试从libart.so着手,跟踪LoadNativeLibraryartFindNativeMethod函数。一切迹象表明,确实没有JNI_OnLoad函数,stringFromJNI函数的入口也是对的,似乎也没有SMC。

 

于是又回到想方设法跟踪stringFromJNI函数上来。经过坚持不懈地努力再努力,我终于发现这个native库中arm和thumb代码混得比较多,有些ida解析的不对,又加上可能有断点或单步的临时断点,这样会影响代码执行,轻则跑飞,次重则异常,app重启,再重就是手机黑屏无反应。

 

不管路途多么坎坷,至少已经上路了,现在至少能看到稍微比较“正常”一点的代码了。

小成

再经过我坚持不懈地努力,我大概能看出这可能是VM代码或者相类似的。找到了几个代码片断,功能有从堆栈读取或写入值,比较,异或操作,还有三个功能固定的函数,整理如下:

1
2
3
4
5
6
7
8
9
10
偏移          功能                  类型
0xDB0       内存复制                函数
0xDDA       unhex的一部分           函数
0xE04       生成hash,针对用户名     函数
0x72FC      读取byte               VM功能
0x730C      读取dword              VM功能
0x71F4      写入byte               VM功能
0x7204      写入dword              VM功能
0x75AC      比较                   VM功能
0x766c      字节异或               VM功能

还原代码,我是不可能做的了。也就只会体力劳动下,人肉代码跟踪。
经过我坚持不懈地努力,大致了解了业务流程。粗略的过程是:先取出name和serial,name生成20字节的hash,serial进行unhex,对hash进行RC4加密,最后与unhex的serial比较。

求解

求解是不用求了,一切都让app告诉我们。所以我又一次次人肉代码跟踪,在一次次的app崩溃到系统崩溃中终于迎来了曙光。经过我最后一次坚持不懈地努力,我终于找到了serial:17726331DA0FE737149C8202。


[2022冬季班]《安卓高级研修班(网课)》月薪三万班招生中~

最后于 2021-5-17 13:56 被kanxue编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (5)
雪    币: 204
活跃值: 活跃值 (551)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
AJISky 活跃值 7 2021-5-17 14:39
2
0
恭喜恭喜,其实直接暴露在外的就是代码本身,而且代码是很朴实的,没有加花,没有多余的运算,
指令模拟也很朴实,故意留了一个口子,就是不需要还原就可以跟踪到异或的地方,这个有待提高
雪    币: 2069
活跃值: 活跃值 (647)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
淡定小胖子 活跃值 2021-5-17 15:23
3
0
AJISky 恭喜恭喜,其实直接暴露在外的就是代码本身,而且代码是很朴实的,没有加花,没有多余的运算, 指令模拟也很朴实,故意留了一个口子,就是不需要还原就可以跟踪到异或的地方,这个有待提高
捕捉大佬。
雪    币: 13684
活跃值: 活跃值 (1983)
能力值: ( LV15,RANK:2613 )
在线值:
发帖
回帖
粉丝
poyoten 活跃值 22 2021-5-17 16:32
4
0
AJISky 恭喜恭喜,其实直接暴露在外的就是代码本身,而且代码是很朴实的,没有加花,没有多余的运算, 指令模拟也很朴实,故意留了一个口子,就是不需要还原就可以跟踪到异或的地方,这个有待提高
瞎蒙的,没太看懂
雪    币: 3607
活跃值: 活跃值 (4526)
能力值: ( LV10,RANK:177 )
在线值:
发帖
回帖
粉丝
YenKoc 活跃值 2 2021-5-17 17:08
5
0
po叔永远的神!
雪    币: 221
活跃值: 活跃值 (111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Jeango 活跃值 2021-5-17 19:45
6
0
到 Java_com_example_hellojni_HelloJni_stringFromJNI 这一步我就死机了!这种情况超出现有认知,感觉是花指令导致 IDA 反汇编失败,没有正确解析 ARM 和 THUMB 指令代码。
赶紧补课,读取 IDA Pro 权威教程,先过一遍再说。
游客
登录 | 注册 方可回帖
返回