7

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

 3 years ago
source link: https://bbs.pediy.com/thread-267638.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
[原创]看雪.深信服 2021 KCTF 春季赛 第五题 华山论剑 WP-CTF对抗-看雪论坛-安全社区|安全招聘|bbs.pediy.com

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

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

偏移          功能                  类型
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。

第五届安全开发者峰会(SDC 2021)议题征集正式开启!

最后于 5天前 被kanxue编辑 ,原因:

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK