android 领取红包情况,【春节】解题领红包之三 {Android 中级题}解题过程分享

本帖最后由 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不同。

55fd2b2273b5a8b4531f72773c469d6e.gif

Image2.png (32.59 KB, 下载次数: 0)

2021-3-1 22:55 上传

于是对V19进行RC4解密:

55fd2b2273b5a8b4531f72773c469d6e.gif

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文件,方便大家下载练手。

c557529e2ea4bb8d5cb558b7b5575102.gif

CrackMe.rar

(1.07 MB, 下载次数: 37)

2021-3-1 23:29 上传

点击文件名下载附件

阅读权限: 10

下载积分: 吾爱币 -1 CB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值