本帖最后由 pk8900 于 2021-3-1 23:31 编辑
0x01:使用工具
jadx-gui
IDA
AndroidKiller
0x01:初步探查
下载APK后,用jadx-gui打开,转到APK入口:入口:cn.pojie52.cm01.MainActivity
看到代码如下:
[Java] 纯文本查看 复制代码public class MainActivity extends AppCompatActivity {
public native boolean check(String str);
static {
System.loadLibrary("native-lib");
}
/* access modifiers changed from: protected */
@Override // androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, androidx.appcompat.app.AppCompatActivity, androidx.fragment.app.FragmentActivity
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_main);
final EditText editText = (EditText) findViewById(R.id.flag);
findViewById(R.id.check).setOnClickListener(new View.OnClickListener() {
/* class cn.pojie52.cm01.MainActivity.AnonymousClass1 */
public void onClick(View view) {
String trim = editText.getText().toString().trim();
if (trim.length() != 30) {
Toast.makeText(MainActivity.this, "flag格式错误,请重试", 0).show();
} else if (MainActivity.this.check(trim)) {
Toast.makeText(MainActivity.this, "恭喜你,验证正确!", 0).show();
} else {
Toast.makeText(MainActivity.this, "flag错误,再接再厉", 0).show();
}
}
});
}
}发现关键函数check为so("libnative-lib")中函数,于是用IDA打开native-lib.so,查看。
[C] 纯文本查看 复制代码__int64 __fastcall Java_cn_pojie52_cm01_MainActivity_check(_JNIEnv *a1, __int64 a2, __int64 a3)
{
const char *v5; // x21
size_t v6; // w0
unsigned int v7; // w0
__int64 v8; // x0
_BYTE *v9; // x0
//.....中间省略
__int64 v29; // [xsp+78h] [xbp-28h]
v29 = *(_QWORD *)(_ReadStatusReg(ARM64_SYSREG(3, 3, 13, 0, 2)) + 40);
if ( a1->functions->GetStringUTFLength((JNIEnv *)a1, (jstring)a3) != 30 )
return 0;
v5 = a1->functions->GetStringUTFChars(a1, a3, 0LL);
v28 = 0u;
v27 = 0u;
v26 = 0u;
*(_OWORD *)dest = 0u;
v6 = strlen(v5);
strncpy(dest, v5, v6);
a1->functions->ReleaseStringUTFChars((JNIEnv *)a1, (jstring)a3, v5);
v7 = strlen(dest);
sub_7B3C7C0B90(dest, v7, "areyousure??????");
v8 = strlen(dest);
v9 = sub_7B3C7C0D90(dest, v8);
*(_OWORD *)v19 = unk_7B3C7C11A1;
*(_OWORD *)&v19[16] = unk_7B3C7C11B1;
*(_QWORD *)&v19[25] = unk_7B3C7C11BA;
//............中间省略
while ( v9[v16] == v19[v16] )
{
if ( v9[v16] )
{
if ( ++v16 != 0x29 )
continue;
}
v17 = 1;
goto LABEL_9;
}
v17 = 0;
LABEL_9:
free(v9);
return v17;
}
以上为check函数,函数第一个参数是_JNIEnv *类型,可以读取JNI的C头文件,然后指定参数类型,即可解析GetStringUTFLength和GetStringUTFChars等函数。
看头部“GetStringUTFLength((JNIEnv *)a1, (jstring)a3) != 30 )”可以确定:flag长度为30,中间经过加密,最后进行对比的位置为:while ( v9[v16] == v19[v16] ),于是打算进行IDA调试,然而在安装APK时确遇到如下问题:
0x02:安装修改APK
第一次安装:
[Shell] 纯文本查看 复制代码D:\programme\platform-tools>adb install X:\wuaipoji\2021\CrackMe.apk
Performing Streamed Install
adb: failed to install X:\wuaipoji\2021\CrackMe.apk: Failure [INSTALL_FAILED_OLDER_SDK: Failed parse during installPackageLI: /dat
a/app/vmdl397888885.tmp/base.apk (at Binary XML file line #7): Requires newer sdk version #26 (current version is #25)]
看提示为sdk版本高,无法安装,于是用AndroidKiller工具反编译,在apktool.yml文件中修改最低skd版本:
[Plain Text] 纯文本查看 复制代码sdkInfo:
minSdkVersion: '24'
targetSdkVersion: '30'
sharedLibrary: false
sparseResources: false
minSdkVersion: '26'修改为:minSdkVersion: '24'
打包安装,出现错误如下:
[Plain Text] 纯文本查看 复制代码adb: failed to install D:\CrackTools\AndroidTools\AndroidKiller_v1.3.1org\projects\CrackMe\Bin\CrackMe_killer.apk: Failure [INSTAL
L_FAILED_INVALID_APK: Failed to extract native libraries, res=-2]
百度查找,解决方法,修改AndroidManifest.xml中的application标签中的: android:extractNativeLibs="true",或将该属性去掉。重新编译后安装成功。
0x02:调试SO文件在IDA中附加调试libnative-lib.so,在check函数中下断点:输入flag:123456789012345678901234567890,点击验证,在check函数中断。发现在关键对比(while ( v9[v16] == v19[v16])中:
V9="4Gg1pHHQ8N3nGMbAVaX9s3XnwNCzMxgPDVU="
V19="5Gh2/y6Poq2/WIeLJfmh6yesnK7ndnJeWREFjRx8"
经对比发现:对字符串“123456789012345678901234567890”进行RC4加密,密钥为:areyousure?????? 则加密结果为:4Gg1pHHQ8N3nGMbAVaX9s3XnwNCzMxgPDVUAhRd9,仅后面几位与V9不同。
Image2.png (32.59 KB, 下载次数: 0)
2021-3-1 22:55 上传
于是对V19进行RC4解密:
Image3.png (31.69 KB, 下载次数: 0)
2021-3-1 22:55 上传
得出flag为:52pojieHappyChineseNewYear2021
RC4在线加解密测试网站:http://www.metools.info/code/c95.html
鉴于输入123456789012345678901234567890后得到的字符串V9与RC4加密结果不同,又测试了输入:111111111122222222223333333333,进行测试,发现V9的值为:4Gs3oXXX9tTvGcXAVKP6t3Dty9KxMhgIC1AEjh1+,与网站测试结果一致,估计是CRACKME在实现RC4算法时哪个步骤有细微变动所致。具体算法部分没有进行还原。
能解出这个CRACKME,运气占了一大部分,如果是非标准算法,那就要分析主要的算法函数了。
很久没有发贴了,写的不对的地方还请指正。
附上CRACKME文件,方便大家下载练手。
CrackMe.rar
(1.07 MB, 下载次数: 37)
2021-3-1 23:29 上传
点击文件名下载附件
阅读权限: 10
下载积分: 吾爱币 -1 CB