easy-so

附件地址:

https://adworld.xctf.org.cn/media/task/attachments/456c1dab04b24036ba1d6e32a08dc882.apk

分析

安装apk文件,梳理逻辑,寻找flag隐藏方式,ddms 随时监听

打开jadx 查看验证失败 是怎么出现的

定位CheckString 函数,很明显 这是个so层的方法,那目的明确了 去so层找这个方法

分析so层 搜索Java_关键字,找到checkstring ,跟进

有个判断相等就返回1,那么回推v4 = f72c5a36569418a20907b55be5bf95ad

if ( !strcmp(v4, "f72c5a36569418a20907b55be5bf95ad") )

v4进行了一次j_TestDec ,那么可以判断

跟进j_TestDec, 在TestDec 中有两个判断,第一个判断内做了一次前16位和后16位交换,第二个判断是两两之间做了一次交换。

那逆推也就简单了。 和前面分析的几个题大致类似

单独把TestDec拿出来 看看

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
v1 = (char *)a1;
# 这里做了一个前16位和后16位的交换
if ( strlen(a1) >= 2 )
{
v2 = 0;
do
{
v3 = (int)&v1[v2]; v3 记录地址
v4 = v1[v2]; v4 记录值
v1[v2] = v1[v2 + 16]; 然后 str[0] = str[16] 此后 每次都是 str[v2] = str[v2+16]
++v2;
*(_BYTE *)(v3 + 16) = v4; str[v2+16] = v4
}
while ( v2 < strlen(v1) >> 1 );
}
result = (unsigned __int8)*v1;
# 这里做了一个两两交换
if ( *v1 )
{
*v1 = v1[1];
v1[1] = result;
result = strlen(v1);
if ( result >= 3 )
{
v6 = 0;
do
{
v7 = (int)&v1[v6]; 这里替换成熟悉的变量
v8 = v1[v6 + 2]; v8 用tmp表示 tmp = v1[2]
*(_BYTE *)(v7 + 2) = v1[v6 + 3]; v1[2] = v1[3]
*(_BYTE *)(v7 + 3) = v8; v[3] = tmp
result = strlen(v1);
v9 = v6 + 4;
v6 += 2;
}
while ( v9 < result );
}
}

脚本

1
2
3
4
5
6
7
8
9
10
11
12
str = list("f72c5a36569418a20907b55be5bf95ad")

# 反推
# 做一次两两交换
for i in range(0, len(str), 2):
str[i], str[i + 1] = str[i + 1], str[i]
print("".join(str))
# 在做一次前16位和后16位的交换
for i in range(len(str) // 2):
str[i], str[i + 16] = str[i + 16], str[i]
print("".join(str))
# 记得加上flag{} 格式
相关文章
评论
分享
  • 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!