首页
社区
课程
招聘
[原创]丛林的秘密WriteUp
发表于: 2019-6-22 09:36 3183

[原创]丛林的秘密WriteUp

2019-6-22 09:36
3183

将apk拖入jadx,查看MainActivity。

MainActivity十分简单,只有一个onCreate方法,该方法主要做了两件事——loadUrl(this.u)和响应按钮点击。

注意到System.loadLibrary("gogogo"),说明本程序使用了JNI,对应的so库需要解压apk然后在lib文件夹中找到。

用到了两个外部函数gogogoJNI.sayHello和gogogoJNI.check_key。很明显,关键就在这里,因此需要进一步查看so库。

本程序使用JNI引入了c生成的so库,该库名称为libgogogo.so。分析x86平台的libgogogo.so如下。

拖入ida,很容易就看到了两个关键函数Java_com_example_assemgogogo_gogogoJNI_check_key和Java_com_example_assemgogogo_gogogoJNI_sayHello。

查看函数时,发现两个函数都通过第一个参数a1动态调用了函数。经查询,该参数是java通过JNI调用c代码编写的库时传递给接口函数的JNIEnv结构体,该结构体定义在jni.h中。经查询,可知,x86版libgogogo.so中动态调用的JNIEnv中函数如下:

a1 + 676:GetStringUTFChars

a1 + 680:ReleaseStringUTFChars

a1 + 668:NewStringUTF

查看Java_com_example_assemgogogo_gogogoJNI_check_key函数。函数十分简单,就是用一个while循环遍历判断输入的字符串,如果都通过则返回1,但其循环条件十分古怪:*(_BYTE *)(v4 + v6) == (rand() % 128 != *v5),其中*v5是输入的字符,无论如何也不会是1或0,也就是说这个check永远不会通过,说明真正的check不在这里。

通过后续分析可知,这个函数只是用来迷惑破解者的。

查看Java_com_example_assemgogogo_gogogoJNI_sayHello函数,发现该函数计算了一个url地址并返回。该地址为127.0.0.1:8000。而apk的MainActivity中使用loadUrl加载了该地址。此时,猜测可能通过自己跟自己网络通信传递了其他数据进行check。

经查询可知,调用JNI会在loadlibrary时调用JNI_OnLoad函数。因此接下来重点查看JNI_OnLoad函数。

从JNI_OnLoad逐层深入,发现了inti_proc函数,该函数主要有以下行为:

解密了byte_3004,却没有在本函数用到,需要重点关注。

查看sub_A30函数,该函数负责接受来自客户端的socket请求,并send一组数据给客户端,这组数据正好就是byte_3004。

使用idapython脚本获取byte_3004的数据并解密,print解密结果后发现这是一个html文件。

脚本代码如下:

将获得的html文件运行一下,发现界面与apk运行界面一模一样,至此已经了解作者的思路——首先自身启动一个127.0.0.1的socket服务器并准备好html数据,然后使用loadUrl打开html,接收用户key并check。启动的功能在JNI_Onload函数中完成,连接的功能在MainActivity中完成。

至于apk中的按键处理实则与整个程序无关,如果细看的话可能apk中根本就没有整个按钮资源。(后来猜的,没有验证)

查看html代码,关键如下

其中instance.exports.check_key()是通过WebAssembly.compile根据二进制代码动态获得的函数,因此这里的大片二进制数据即为一个WASM文件。

所以html中的check是通过wasm中的代码来完成的。

将html中的wasm文件提取出来(即check.wasm文件),使用wasm2c反编译为c代码(即check.c),再使用gcc编译check.c获得中间文件check.o。

将check.o拖入ida,在函数列表中就可以找到check_key函数,反编译结果如下

查看o函数,发现其关键代码如下:

也就是o函数负责对memory中第1024, 1025, 1026, 1027的数据进行异或。

其余oo、ooo等函数也是这个功能。

查看xxx函数,该函数对memory中1024-1055的数据进行了线性计算,如果通过计算则check通过。因此要获得flag只需要解一个线性方程组,然后异或一下。

编写脚本获得flag:


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-6-24 18:03 被kanxue编辑 ,原因:
上传的附件:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//