第一题
第一题逆向很简单,用JEB打开,点开com包,找到主函数按tab查看伪代码,加密代码很简单,一个简单的异或就行。
将v2和v1 转成字符得到两串base64加密后的密文
v2 = NjI1OzA3YGAuNjNmNzc7YmU=
v1 = YWBlOmZnNjAuOmJmNzAxO2Y=
base64解码后得到
v2 = 625;07``.63f77;be
v1 = a`e:fg60.:bf701;f
然后搞个脚本就行,脚本如下:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
int main()
{
//a = NjI1OzA3YGAuNjNmNzc7YmU= base64 ½âÃÜºó £º 625;07``.63f77;be
//b = YWBlOmZnNjAuOmJmNzAxO2Y= base64 ½âÃÜºó £º a`e:fg60.:bf701;f
int a[] = {78, 106, 73, 49, 0x4F, 0x7A, 65, 51, 89, 71, 65, 0x75, 78, 106, 78, 109, 78, 0x7A, 99, 55, 89, 109, 85, 61,0};
int b[] = {89, 87, 66, 108, 0x4F, 109, 90, 110, 78, 106, 65, 0x75, 0x4F, 109, 74, 109, 78, 0x7A, 65, 120, 0x4F, 50, 89, 61,0};
int i,j;
char c[] = "625;07``.63f77;be";
char d[] = "a`e:fg60.:bf701;f";
for(i = 0 ; i < strlen(c) ; i++)
{
c[i] ^= 3;
d[i] ^= 3;
}
printf("%s\n%s\n",c,d);
//516834cc-50e448af
// bcf9ed53-9ae4328e
return 0;
}
得到flag: 516834cc-50e448af-bcf9ed53-9ae4328e
第二题
第二题逆向就难了,,,完全不知道要从哪里下手,,后面看到个大佬的思路,就尝试复现一下
直接用IDA载入apk文件(当然你用apktool解包后,直接找到so文件载入也行),选择第一个模式载入
找到so文件,这里一共有四个so文件,看到第二个so文件大小比其他几个要高出一截,那就先逆向第二个so文件
看输出表里面有个all函数,点进查看
发现确实在这里藏了东西
int all()
{
bool v0; // zf
int v2; // r0
int v3; // r0
int v4; // r1
int v5; // r2
FILE *v6; // r6
int i; // r4
int v8; // r1
int v9; // r2
char v10[4]; // [sp+0h] [bp-170h] BYREF
char v11[4]; // [sp+4h] [bp-16Ch] BYREF
__int64 v12[2]; // [sp+8h] [bp-168h] BYREF
int v13; // [sp+18h] [bp-158h]
int v14; // [sp+1Ch] [bp-154h]
__int64 v15[2]; // [sp+60h] [bp-110h] BYREF
int v16; // [sp+70h] [bp-100h]
int v17; // [sp+74h] [bp-FCh]
char v18[16]; // [sp+B8h] [bp-B8h] BYREF
char v19[16]; // [sp+C8h] [bp-A8h] BYREF
char v20[16]; // [sp+D8h] [bp-98h] BYREF
char v21[20]; // [sp+E8h] [bp-88h] BYREF
__int16 v22; // [sp+FCh] [bp-74h]
int v23; // [sp+11Ch] [bp-54h]
int v24; // [sp+13Ch] [bp-34h]
_system_property_get((int)"ro.product.cpu.abi");
_system_property_get((int)"ro.build.version.release");
v0 = v23 == 0x363878;
if ( v23 == 0x363878 )
v0 = v22 == 57;
if ( v0 && j_f_e((int)"/data/2233") == 1 )
{
strcpy(v21, "bili_2233_3322");
v15[0] = 0LL;
v15[1] = 0xEFCDAB8967452301LL;
v16 = -1732584194;
strcpy(v20, "bili_3322_2233");
v17 = 271733878;
v2 = _strlen_chk(v21, 0xFu);
j_EU((int)v15, (int)v21, v2);
j_EF(v15, v19);
v12[0] = 0LL;
v12[1] = 0xEFCDAB8967452301LL;
v13 = -1732584194;
v14 = 271733878;
v3 = _strlen_chk(v20, 0xFu);
j_EU((int)v12, (int)v20, v3);
j_EF(v12, v18);
v6 = fopen("/data/2233", "a+");
if ( v6 )
{
for ( i = 0; i != 8; ++i )
{
sub_14E8((int)v11, v4, v5, (unsigned __int8)v19[i]);
sub_14E8((int)v10, v8, v9, (unsigned __int8)v18[i]);
fputs(v11, v6);
fputs(v10, v6);
}
fputs("-----------\n", v6);
}
fclose(v6);
}
return _stack_chk_guard - v24;
}
然后根据大佬的思路一点点分析
根据了解开发手机的各项参数之SystemProperties找到了这两个函数的原型
_system_property_get((int)"ro.product.cpu.abi");
_system_property_get((int)"ro.build.version.release");
一个是获取当前cpu类型和abi的,一个是获取系统版本号的
这里有两个判断条件
v0 = v23 == 0x363878;
if ( v23 == 0x363878 )
v0 = v22 == 57;
if ( v0 && j_f_e((int)"/data/2233") == 1 )
将这两串16进制转为字符,结合上面获取cpu类型和系统版本号的函数,推测v23中保存的是获取的cpu类型,v22中保存的是获取的系统版本号。
v0 = v23 == '68x';
if ( v23 == '68x' )
v0 = v22 == '9';
if ( v0 && j_f_e((int)"/data/2233") == 1 )
还有一个j_f_e函数,跟进查看,这个函数判断文件 “/data/2233” 是否存在,存在则返回1,不存在则返回0
满足了这两个条件,就会生成flag
修改版本号和cpu类型可以参考这个修改安卓系统版本教程,完整的可以参考这个build.prop解释
注意要完成更改手机需要root,建议使用虚拟机完成,我用的是vmos手机虚拟机,电脑安卓模拟器也行,只要root就行
步骤:
1.使用re管理器挂载根目录
2.打开system目录
3.更改ro.build.version.release为9
4.更改ro.product.cpu.abi为x86
然后在data目录下创建2233文件
再安装test.apk,已经装了的卸了重装一下,这个好像只在安装的时候检测版本号和cpu信号,安装好后打开一下
看到这个文件大小已经变成了60字节
打开查看,获得flag
每八位字符一组,在每组中间加上 -,得到最终flag
flag: b13981f4-5ae996d4-bc04be5b-34662a78