本帖最后由 HNHuangJingYU 于 2021-9-29 20:29 编辑
1. 将app2.apk拉进JEB进行分析,和之前的套路一样就是点击按钮传入字符串加密进行比较,如图1
1
2. 这里是so层的函数,果断进入IDA进行分析,这里采用动态注册函数的方式,所以我们就进入IDA-View视图进入.data数据段(按ctrl+s选.data)寻找函数果然找到了doRawData函数:分析结果我放在了注释,这样看起来方便点[C++] 纯文本查看 复制代码 jstring __fastcall doRawData(_JNIEnv *env, int jclass, int context, int string)
{
_JNIEnv *env_1; // r4
void *string_1; // r9
const char *v6; // r6
const char *v7; // r8
jstring result; // r0
jstring (__cdecl *v9)(JNIEnv *, const jchar *, jsize); // r6
char *v10; // r5
size_t v11; // r2
int v12; // [sp+0h] [bp-28h]
int v13; // [sp+18h] [bp-10h]
env_1 = env; // 如果不相等直接返回
string_1 = string;
if ( j_checkSignature(env, jclass, context) != 1
|| (strcpy(&v12, "thisisatestkey=="),
v6 = env_1->functions->GetStringUTFChars(&env_1->functions, string_1, 0),
v7 = j_AES_128_ECB_PKCS5Padding_Encrypt(),
env_1->functions->ReleaseStringUTFChars(&env_1->functions, string_1, v6),
result = env_1->functions->NewStringUTF(&env_1->functions, v7),
_stack_chk_guard != v13) ) // 1.进行签名验证2.将输入字符串与加密后字符比较(这里的key是thisisatestkey==)
{ // j_AES_128_ECB_PKCS5Padding_Encrypt这里出题人估计是故意降低难度的吧
do
{
v9 = env_1->functions->NewString;
v10 = UNSIGNATURE[0];
v11 = strlen(UNSIGNATURE[0]);
}
while ( _stack_chk_guard != v13 );
result = (v9)(env_1, v10, v11);
}
return result;
}
3.得到了分析后去到ACE加密解密网站(http://tool.chacuo.net/cryptaes)对“VEIzd/V2UPYNdn/bxH3Xig==”进行解密操作得到了“aimagetencent”嗯,进行flag提交发现提交错误,好家伙有点东西,又跑回去安装Apk运行输入解密字符后发现不对劲,点开JEB看代码流程,就算输入成功后也是启动了一个服务,所以看不到成功与失败的结果信息,后面我有看到FileDataActivity类我以为就是一个简单的测试界面,而且全文下来它并没有被使用,然后我去吾爱大家庭看看大佬的解题,万万没想到进入就是FileDataActivity类的字符串:9YuQ2dk8CSaCe7DTAmaqAA==拿去再去解密得到aimagetencent,提交flag,成功!因为我也是第一次做ctf的题目,刚开始我还质疑出题人,后来想想这不也算考察能力的一部分嘛,哈哈哈哈哈 |