[原创]看雪.深信服 2021 KCTF 春季赛 第五题 华山论剑 WP
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.
这是一道不太会的安卓题,使用了规则二,即提供一组可用的用户名及对应注册码。安装后试运行了一下,有正确及错误提示。
按步就班地开始先看看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
函数也好奇怪,如下图。
还有两个比较可疑的导出函数xxxxxxxxxx1
和 xxxxxxxxxx2
,这两个函数的奇怪情况和stringFromJNI
是一样一样的,整个nativ库中就没有大段看起来比较“正常”的代码。这完全超出了我的认知,感觉大脑不够用了,心里好慌乱,不知道作者是用了什么黑科技或黑技术。
想不明白,直接上手干,默默掏出小米4C手机,动态调试。在stringFromJNI
函数处断下后,尝试单步跟踪,结果没跟住,直接就跑飞了。又尝试了几次,不是跑飞,就是异常,而且最后结果还不对了,本来的恭喜成功
变成了输入错误
。
似乎面临的一切都是未知的,未知中又会诱发出诸多猜想。我猜想,作者应该是通过黑科技隐藏了JNI_OnLoad
函数,JNI_OnLoad
函数会改写代码。于是开始尝试从libart.so
着手,跟踪LoadNativeLibrary
、artFindNativeMethod
函数。一切迹象表明,确实没有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。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK