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

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

2021-5-17 01:48
14901

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

于是接着静态看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代码或者相类似的。找到了几个代码片断,功能有从堆栈读取或写入值,比较,异或操作,还有三个功能固定的函数,整理如下:

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

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

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

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

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