数据加密
crackme
找到关键函数,因为不知道CCCrypt(0, 0, 1u对应什么算法,得到正确的key和iv后尝试解密
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| __int64 __fastcall verify_system_password(const void *a1) { _BYTE v2[4]; // [xsp+20h] [xbp-90h] BYREF __int64 *v3; // [xsp+28h] [xbp-88h] _BYTE *dataOut; // [xsp+30h] [xbp-80h] int v5; // [xsp+3Ch] [xbp-74h] int i; // [xsp+44h] [xbp-6Ch] const char *v8; // [xsp+48h] [xbp-68h] size_t dataOutMoved[3]; // [xsp+50h] [xbp-60h] BYREF size_t dataOutAvailable; // [xsp+68h] [xbp-48h] size_t v11; // [xsp+70h] [xbp-40h] const void *v12; // [xsp+78h] [xbp-38h] unsigned int v13; // [xsp+84h] [xbp-2Ch] char iv[16]; // [xsp+88h] [xbp-28h] BYREF char key[16]; // [xsp+98h] [xbp-18h] BYREF
v3 = &qword_1000140B0; v12 = a1; ++qword_1000140B0; v11 = strlen((const char *)a1); dataOutAvailable = (v11 + 16) & 0xFFFFFFFFFFFFFFF0LL; dataOutMoved[2] = (size_t)v2; dataOut = &v2[-((dataOutAvailable + 15) & 0xFFFFFFFFFFFFFFF0LL)]; dataOutMoved[1] = dataOutAvailable; dataOutMoved[0] = 0LL; v8 = "1234561234561234"; for ( i = 0; i < 16; ++i ) { ++v3[1]; key[i] = encrypted_system_key[i] ^ v8[i]; iv[i] = encrypted_system_iv[i] ^ v8[i]; } print_crypto_info(); if ( CCCrypt(0, 0, 1u, key, 0x10uLL, iv, v12, v11, dataOut, dataOutAvailable, dataOutMoved) ) { ++v3[2]; v13 = 0; v5 = 1; } else { if ( dataOutMoved[0] == 16 ) { LOBYTE(v13) = memcmp(dataOut, &encrypted_system_password, 0x10uLL) == 0; v13 = (unsigned __int8)v13; } else { ++v3[3]; v13 = 0; } v5 = 1; } return v13; }
|
隐私合规
TaskPrivate(1)
发现des和base64
只找到了key,猜测key和iv是一样的
密文先from hex再解base64,最后des解密
**MD5{银行卡+密码}**后提交
TaskPrivate(2)
MainActivity里找到申请读取短信和打电话的权限
md5后得到flag