吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1096|回复: 6
收起左侧

[Android CTF] illusion题解

[复制链接]
wangxiaobai123 发表于 2024-9-29 16:12

题目特征

image-20240926172859815

查看是否存在壳

image-20240926172944711

Jeb反编译查看oncreate(),观察到一个点击事件监听

image-20240929105409995

在事件监听上观察到先从assets文件下读取Flag文件内容再和用户输入字符串作为参数传给CheckFlag()函数,而CheckFlag方法有native修饰,说明是由so库加载的

image-20240926174039864

IDA找到lib文件夹下的libnative-lib.so并加载,老方法直接搜java_包名,F5后,可以看到逻辑很简单:将用户输入的每个字符,加上内置data字符串对应的下标的字符,然后再减去64。在和93一起作为参数传给sub_C40290C0(),运行后结果同Flag中的字符串进行比较得出。

image-20240929111130135

其中内置data字符串为

image-20240929112721969

进入sub_C40290C0(),可以看到恒跳转到sub_C4029028()处,继续跟进

image-20240929111722461

可以看到这里的逻辑也很简单,通过位运算和循环逻辑来模拟除法

  1. 位移操作:使用右移(>>)将 a2 缩小,等价于除以2的幂,这样可以快速找到 a1a2 的比值。
  2. 逐步减法:通过不断从 a1 中减去 a2 的不同倍数(如 a2a2 >> 1a2 >> 2 等),积累结果到 v4,这实际上是实现了除法的过程。
  3. 乘法扩展:通过不断乘以16和2来扩展 a2,实现了找到合适的倍数以提高计算效率。

综合这些步骤,最终可以得到 a1 除以 a2 的结果,反映了除法的本质。

image-20240929112433027

综上所诉,该题是通过将用户输入的每个字符,加上内置data字符串对应的下标的字符,然后再减去64; 得到的结果,取余93后,进行比较

可以写逆向脚本来破解:

image-20240929115606754

结果如下,明显不符合flag的格式

image-20240929114137400

考虑是动态注册,函数处搜索JNI_Load(),看到RegisterNatives函数果然存在

image-20240929113552397

跟进后发现其CheckFlag()同上面的代码逻辑一摸一样,不同的是内置data字符串发生改变

image-20240929113957349

动态注册的内置data字符串:

image-20240929113650889

只需更改上面脚本的data字符串即可,运行结果如下:

image-20240929114358608


补充知识:

在 Android NDK 开发中,如果静态注册和动态注册的函数命名相同,Java 层会优先调用动态注册的函数。这是因为动态注册函数是在运行时通过 JNI_OnLoad 函数注册的,而静态注册函数在编译时被固化。具体来说,动态注册的函数会覆盖静态注册的同名函数,因此 Java 调用的会是动态注册的实现。

bb18704f-b819-45e4-adcd-783dde1876de

特性 静态注册 动态注册
注册方式 根据JNI命名规则自动查找方法 通过RegisterNatives在运行时绑定方法
方法签名和命名 方法名遵循Java_包名_类名_方法名格式 通过RegisterNatives函数进行注册
JNI_OnLoad 无需使用动态注册相关API 包含RegisterNatives调用
实现查找 C/C++实现文件中存在静态注册命名方式 C/C++实现文件中通过RegisterNatives绑定的方法

题目及:
链接: https://pan.baidu.com/s/1LXN1v-4HW5_Wgzv9bI9FyA?pwd=ic6w 提取码: ic6w


参考博客

NDK 系列(6):说一下注册 JNI 函数的方式和时机 - 彭旭锐 - 博客园 (cnblogs.com)

深入浅出Android NDK之使用RegisterNatives函数动态注册native函数_registernatives() 最后一个参数-CSDN博客

Android NDK之静态/动态注册Native方法_android native方法-CSDN博客

Android NDK开发——静态注册和动态注册 - 知乎 (zhihu.com)

[Android JNI学习-函数动态注册 | Programmer Liu (david1840.github.io)](https://david1840.github.io/2020/11/09/Android-JNI函数动态注册/#:~:text=不同于静态注册中在Java类中定义好native方法后由编译器生成JNI方法,动态注册基本思想是在JNI_Onload ()函数中通过JNI中提供的RegisterNatives ()方法来将C%2FC%2B%2B方法和java方法对应起来%2C,JNI_OnLoad ()函数会在我们调用 System.loadLibrary的时候回调,注册整体流程如下%3A)

免费评分

参与人数 2威望 +1 吾爱币 +21 热心值 +2 收起 理由
allspark + 1 + 1 用心讨论,共获提升!
正己 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

justwz 发表于 2024-9-29 20:34
跟着大佬学逆向
0nepunch 发表于 2024-9-30 12:34
XXCAINIAO110 发表于 2024-9-30 21:50
牛逼,我想知道有没有压缩文件加密后破解的资料
xixicoco 发表于 2024-9-30 22:36
不错的学习资料
Brantfang 发表于 2024-10-1 20:03
不错的教程啊
fridaand 发表于 2024-10-2 18:27
学到了plus
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-1 09:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表