pk8900 发表于 2021-3-1 23:20

【春节】解题领红包之三 {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:09

本帖最后由 霍洛 于 2021-3-6 11:28 编辑

请问大佬,断点应该下在什么位置?我下了断点不知道为什么输入30个字符没断下来,不知道哪里出了问题{:1_904:}
另外,androidkiller一直卡在“正在反编译APK源码,请稍等”(我直接安装成功了,所以没用androidkiller改)

pk8900 发表于 2021-3-6 18:46

霍洛 发表于 2021-3-6 11:09
请问大佬,断点应该下在什么位置?我下了断点不知道为什么输入30个字符没断下来,不知道哪里出了问题{:1_90 ...

断点位置没错,估计是IDA调试的哪个环节的问题,adb shell am start -D 启用调试模式,我用的XPosed模块。

nagra 发表于 2021-3-1 23:23

这个思路有点意思,我仿一个练练手

a15119497456 发表于 2021-3-2 00:02

andyyang886 发表于 2021-3-2 07:23

蒙蔽树下蒙蔽果,还有就是你懂的!

whbshj 发表于 2021-3-2 07:52

看不懂啊啊啊啊

wzwzaozao 发表于 2021-3-2 07:53

等级低,看不懂{:1_896:}。好好学习吧

奇迹先生 发表于 2021-3-2 07:59

这个好高端,赞楼主,慢慢研究

zlb7758 发表于 2021-3-2 08:27

不懂哦,小白一枚!

lili2312280 发表于 2021-3-2 08:57

不错不错呀,膜拜大佬!!!

q200492sg 发表于 2021-3-2 09:04

看到一半有点复杂,马克一下
页: [1] 2 3 4 5
查看完整版本: 【春节】解题领红包之三 {Android 中级题}解题过程分享