玩玩B站的安全节破解

code · 2021-10-27

近日,闲来无事,开始研究Android安全攻防,恰巧赶上Bililibi在1024的时候发布了一套安全攻防的题目

其中,有一道关于破解的.

题目地址:https://security.bilibili.com/sec1024/q/r5.html
样本(密码:6rhu):https://zhyw90.lanzouw.com/izkW2vug2gf

直接把apk拖进jadx里面,看下反编译的结果,发现写的比较简单,只有一个有效的Activity。
其中大概的逻辑就是经过加密,验证一个用户名 & 密码。

crack_bilibili_1.jpg

随手撸一个解密出来:
byte[] result = new byte[]{78, 106, 73, 49, 79, 122, 65, 51, 89, 71, 65, 117, 78, 106, 78, 109, 78, 122, 99, 55, 89, 109, 85, 61};
byte[] decode = Base64.decode(result, 2);
Log.e("zhyw", "account = > " + new String(enc(decode, 3)));
result = new byte[]{89, 87, 66, 108, 79, 109, 90, 110, 78, 106, 65, 117, 79, 109, 74, 109, 78, 122, 65, 120, 79, 50, 89, 61};
decode = Base64.decode(result, 2);
Log.e("zhyw", "pwd = > " + new String(enc(decode, 3)));
解密结果:
021-10-26 14:52:52.812 16063-16063/io.zyw.test.myapplication E/zhyw: account = > 516834cc-50e448af
2021-10-26 14:52:52.812 16063-16063/io.zyw.test.myapplication E/zhyw: pwd = > bcf9ed53-9ae4328e
真的这么简单吗?

注意到上面有一个MyLib.so,我就知道没那么简单。
首先,试着调用下这个 MyLib.so下面的i() 方法。

直接crash掉了。

crack_bilibili_2.jpg

打开Ghidra,拖进去看看这个东西究竟是啥。
先看JNI_OnLoad方法:
大体的意思是注册了一个jni方法给MainActivity,这个方法指针图里面标出来了。
接下来就是跟进去看看 i() 方法干了啥。

crack_bilibili_3.jpg

i()调用了all()方法,再进去看看。

crack_bilibili_4.jpg

这段代码就有意思了,刚才crash的地方应该也在这里.

crack_bilibili_5.jpg

这里一共三个条件限制:

  • 判断ro.product.cpu.abi
  • 判断ro.build.version.release
  • 判断/data/2333文件是否可写

然后分支内部还有一大堆逻辑,外面基本没啥,所以首要目标就是让代码想办法进到分支里面。
很简单,把这些条件都NOP掉就好.
随便找一个hex编辑器。把MyLib.so拖进去。

crack_bilibili_6.jpg

爆破点就是这里,把其中代码nop掉即可

第一个爆破点,搜索:
1f 01 09 6b 
81 0f 00 54
替换为:
1F 20 03 D5
1F 20 03 D5
第二个,搜索:
1f e5 00 71
21 0f 00 54
替换为:
1F 20 03 D5
1F 20 03 D5

第三个:
/data/2333 肯定是不可写的,直接在hex编辑器里面重定向到sd卡上:
搜索
/data/2333
替换为
/sdcard/11


再次运行,程序成功跑起来了,不过这个返回值没啥用,是个null。

crack_bilibili_7.jpg

不过,有意思的是,在sd卡下面,我们刚刚重定向过的文件,生成出来了一些内容:

crack_bilibili_8.jpg

这个文件的内容,应该就是这次挑战的秘密了。
不过这究竟是个啥,还没解密出来。

附上修复版的so文件:

https://zhyw90.lanzouw.com/iRCyYvug2hg

Ghidra Android crack
Theme Jasmine by Kent Liao