【春节】解题领红包之三 {Android 中级题}解题过程分享
本帖最后由 pk8900 于 2021-3-1 23:31 编辑0x01:使用工具
jadx-gui
IDA
AndroidKiller
0x01:初步探查
下载APK后,用jadx-gui打开,转到APK入口:入口:cn.pojie52.cm01.MainActivity
看到代码如下:
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,查看。
__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; //
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 = unk_7B3C7C11B1;
*(_QWORD *)&v19 = unk_7B3C7C11BA;
//............中间省略
while ( v9 == v19 )
{
if ( v9 )
{
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 == v19 ),于是打算进行IDA调试,然而在安装APK时确遇到如下问题:
0x02:安装修改APK
第一次安装:
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版本:
sdkInfo:
minSdkVersion: '24'
targetSdkVersion: '30'
sharedLibrary: false
sparseResources: false
minSdkVersion: '26'修改为:minSdkVersion: '24'
打包安装,出现错误如下:
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 == v19)中:
V9="4Gg1pHHQ8N3nGMbAVaX9s3XnwNCzMxgPDVU="
V19="5Gh2/y6Poq2/WIeLJfmh6yesnK7ndnJeWREFjRx8"
经对比发现:对字符串“123456789012345678901234567890”进行RC4加密,密钥为:areyousure?????? 则加密结果为:4Gg1pHHQ8N3nGMbAVaX9s3XnwNCzMxgPDVUAhRd9,仅后面几位与V9不同。
于是对V19进行RC4解密:
得出flag为:52pojieHappyChineseNewYear2021
RC4在线加解密测试网站:http://www.metools.info/code/c95.html
鉴于输入123456789012345678901234567890后得到的字符串V9与RC4加密结果不同,又测试了输入:111111111122222222223333333333,进行测试,发现V9的值为:4Gs3oXXX9tTvGcXAVKP6t3Dty9KxMhgIC1AEjh1+,与网站测试结果一致,估计是CRACKME在实现RC4算法时哪个步骤有细微变动所致。具体算法部分没有进行还原。
能解出这个CRACKME,运气占了一大部分,如果是非标准算法,那就要分析主要的算法函数了。
很久没有发贴了,写的不对的地方还请指正。
附上CRACKME文件,方便大家下载练手。
本帖最后由 霍洛 于 2021-3-6 11:28 编辑
请问大佬,断点应该下在什么位置?我下了断点不知道为什么输入30个字符没断下来,不知道哪里出了问题{:1_904:}
另外,androidkiller一直卡在“正在反编译APK源码,请稍等”(我直接安装成功了,所以没用androidkiller改)
霍洛 发表于 2021-3-6 11:09
请问大佬,断点应该下在什么位置?我下了断点不知道为什么输入30个字符没断下来,不知道哪里出了问题{:1_90 ...
断点位置没错,估计是IDA调试的哪个环节的问题,adb shell am start -D 启用调试模式,我用的XPosed模块。 这个思路有点意思,我仿一个练练手 蒙蔽树下蒙蔽果,还有就是你懂的! 看不懂啊啊啊啊 等级低,看不懂{:1_896:}。好好学习吧 这个好高端,赞楼主,慢慢研究 不懂哦,小白一枚! 不错不错呀,膜拜大佬!!! 看到一半有点复杂,马克一下