easyjni

下载附件地址:https://adworld.xctf.org.cn/media/task/attachments/eb760e6a10ea4dcab700a6b7db948488.apk

分析

安装apk,先看看逻辑,打开后发现输入字符串,然后系统判断正确与否,那么就要自己去啃算法了

打开jadx ,定位到oncrete处,if判断决定了是正确还是失败,跟进其中的方法查看

在a方法中,当ncheck(new a().a(str.getBytes())) 才能返回正确,那么继续跟进,看何时返回True

先分析一个new a().a(str.getBytes()) 获得了什么

输入一个a

a.getBytes(): [B@1540e19d

输出 23==

做了一个类似base64编码的算法

下来看ncheck

定位到如下,看来居然是在so层进行的判断。那么打开ida 查看,so文件在lib下

private native boolean ncheck(String str);

搜索Java下划线开头的方法,只有一个,那么就查看他了,进去后tab一下,查看伪代码

从后往前分析, return=1 时 v12 为空,那么 memcmp 方法中s1 ==MbT3sQgX039i3g==AQOoMQFPskB1Bsc7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
v5 = (env->functions->GetStringUTFChars)(env, str, 0);
if ( strlen(v5) == 32 )
{
v6 = 0;
do
{
v7 = &s1[v6];
s1[v6] = v5[v6 + 16];
v8 = v5[v6++];
v7[16] = v8;
}// 前16位和后16位 交换
while ( v6 != 16 );
(env_1->functions->ReleaseStringUTFChars)(env_1, v4, v5);
v9 = 0;
do
{
v11 = __OFSUB__(v9, 30);
v10 = v9 - 30 < 0;
v15 = s1[v9];
s1[v9] = s1[v9 + 1];
s1[v9 + 1] = v15;
v9 += 2;
} // 两两之间交换
while ( v10 ^ v11 );
v12 = memcmp(s1, "MbT3sQgX039i3g==AQOoMQFPskB1Bsc7", ' ');

所以解密的方式也就清晰了,先解决so层,得到传入so层的值,然后解决java层 得到flag

脚本

脚本分为两个部分 so()是解决so里面的两个加密, 一个是两两交换,一个是前16和后16交换,之后是java层的加密,是一个替换了base64表的加密,只需要更换base64 表,重新接码即可,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
def so():
str = list("MbT3sQgX039i3g==AQOoMQFPskB1Bsc7")
print(len(str))
# 先两两交换
for i in range(0,len(str),2):
str[i],str[i+1] = str[i+1],str[i]
print("".join(str))
# 然后将str 的前16位和后16位交换
for i in range(len(str)//2):
str[i],str[i+16] = str[i+16],str[i]
print("".join(str))
return "".join(str)
# 之后就是java层的,和解码base64类似


def unbase(string:str)->str:
oldstr = ''
unbase = ''
base64_list = ['i', '5', 'j', 'L', 'W', '7', 'S', '0', 'G', 'X', '6',
'u', 'f', '1', 'c', 'v', '3', 'n', 'y', '4', 'q', '8',
'e', 's', '2', 'Q', '+', 'b', 'd', 'k', 'Y', 'g', 'K',
'O', 'I', 'T', '/', 't', 'A', 'x', 'U', 'r', 'F', 'l',
'V', 'P', 'z', 'h', 'm', 'o', 'w', '9', 'B', 'H', 'C',
'M', 'D', 'p', 'E', 'a', 'J', 'R', 'Z', 'N']
for i in string.replace('=',''):
oldstr += '{:06}'.format(int(bin(base64_list.index(i)).replace('0b', '')))
newstr = ['{}'.format(oldstr[j:j + 8]) for j in range(0, len(oldstr), 8)]
for l in range(len(newstr)):
unbase += chr(int(newstr[l], 2))

print(unbase)
if __name__ == "__main__":
unbase(so())


# 参考 : https://blog.csdn.net/Leeeey/article/details/89517254 找到一个base64 解码的python脚本

结果:flag{just_ANot#er_@p3}
相关文章
评论
分享
  • scrapy 框架学习

    入坑scrapy在自己学习了一段时间爬虫之后(其实也就是了解了下爬虫),我就迫不及待的想学习心得东西了。 今天就入手scrapy框架 官方文档 安装安装上基本没啥大问题,缺啥补啥就行 这里我选择使用Python虚拟环境virtuale...

    scrapy 框架学习
  • 某app加密算法分析

    Hey, password is required here. a7fbab8565cf6bbb84f5578e356b215e1a835de7a145bd926381e35cc45256f4...

    某app加密算法分析
  • jni函数hook

    jni函数hook(计算 地址方式)12345678910111213141516171819202122232425262728293031323334353637function hookTest9() { Jav...

    jni函数hook
  • Hook jni 主动调用

    Hook jni 主动调用要对hellofromc 进行主动调用,修改返回值,但是这里不能直接通过replace去修改返回值,而是要通过newstringutf 去修改返回值。 1234567891011121314151617181...

    Hook jni 主动调用
  • Hook 计算非导出函数地址

    hook 读写内存数据对string字符串,可能是加密的,可以通过直接hook 加载的内存数据来读取解密状态的字符串 123456789读取内存字符串数据function hookTest7() { var soAdd...

    Hook 计算非导出函数地址
  • Hook 获取指针参数的返回值

    Hook 获取指针参数的返回值在c语言中,一般都会以指针传递返回的值 ,没有return 或者return为true hook sub_750 打印参数和输出 12345678910111213141516171819functio...

    Hook 获取指针参数的返回值
  • Hook dlopen

    hook dlopen在刚开始hook 我们必须使得app加载so 才能hook, 我们可以hookdlopen 获取到so在那加载,在高版本中有一些so会走android_dlopen_ext 1234567891011121314...

    Hook dlopen
  • Hook 导出函数和修改函数参数返回值

    Hook 导出函数123456789101112131415161718192021222324252627282930// hook 导出函数function hookTest1() { var addAddr =...

    Hook 导出函数和修改函数参数返回值
  • Hook so 导入导出表

    hook so 导入导出表启动frida打开两个cmd 窗口 12345第一个cmd窗口adb shellsucd /data/local/tmp./fx // 这个是frida-server-12.8.14-android-x86...

    Hook so 导入导出表
  • Hook Java层通杀

    Hook 通杀Hook 普通方法和修改函数参数返回值fradaserver 是手机端的, android低版本 frida 尽量低版本 fridaserver版本要与frida库版本一致 不同平台用不同fridaserver 不要和...

    Hook Java层通杀
Please check the comment setting in config.yml of hexo-theme-Annie!