前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【愚公系列】2023年05月 攻防世界-MOBILE(app2)

【愚公系列】2023年05月 攻防世界-MOBILE(app2)

作者头像
愚公搬代码
发布2023-05-24 10:10:06
2570
发布2023-05-24 10:10:06
举报
文章被收录于专栏:历史专栏历史专栏

前言

下面介绍两个反编译工具

  • jadx是一个用于反编译Android APK文件的开源工具,静态反编译,查找索引功能强大
  • jeb和IDA很像,属于动态调试,可以看java汇编也可以生成伪代码,还可以动态attach到目标调试

对于so文件的逆向工具选择

  • IDA逆向工具是一款反汇编器,被广泛应用于软件逆向工程领域,能够反汇编各种不同平台的二进制程序代码,并还原成可读的汇编代码。

Objection是一款移动设备运行时漏洞利用工具,该工具由Frida驱动,可以帮助研究人员访问移动端应用程序,并在无需越狱或root操作的情况下对移动端应用程序的安全进行评估检查。

安装命令

代码语言:javascript
复制
pip3 install objection 

frida是一款便携的、自由的、支持全平台的hook框架,可以通过编写JavaScript、Python代码来和frida_server端进行交互

frida的安装可以参考:https://www.jianshu.com/p/60cfd3f6afde

一、app2

1.题目

在这里插入图片描述
在这里插入图片描述

2.答题

2.1 运行app

点击登录得到:不能为空的提示

2.2 jadx反编译apk文件

搜索不能为空字符串

在这里插入图片描述
在这里插入图片描述

找到MainActivity函数

代码语言:javascript
复制
package com.tencent.testvuln;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.tencent.testvuln.c.SignatureTool;

@SuppressLint({"ShowToast"})
/* loaded from: classes.dex */
public class MainActivity extends Activity implements View.OnClickListener {
    private Button a;
    private Handler b = null;
    private EditText c;
    private EditText d;

    @Override // android.app.Activity
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.activity_main);
        this.a = (Button) findViewById(R.id.button1);
        this.a.setOnClickListener(this);
        this.c = (EditText) findViewById(R.id.editText1);
        this.d = (EditText) findViewById(R.id.editText2);
        SharedPreferences.Editor edit = getSharedPreferences("test", 0).edit();
        edit.putLong("ili", System.currentTimeMillis());
        edit.commit();
        Log.d("hashcode", SignatureTool.getSignature(this) + "");
    }

    @Override // android.app.Activity
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override // android.app.Activity
    public boolean onOptionsItemSelected(MenuItem menuItem) {
        if (menuItem.getItemId() == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(menuItem);
    }

    @Override // android.view.View.OnClickListener
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.button1:
                if (this.c.getText().length() == 0 || this.d.getText().length() == 0) {
                    Toast.makeText(this, "不能为空", 1).show();
                    return;
                }
                String obj = this.c.getText().toString();
                String obj2 = this.d.getText().toString();
                Log.e("test", obj + " test2 = " + obj2);
                Intent intent = new Intent(this, SecondActivity.class);
                intent.putExtra("ili", obj);
                intent.putExtra("lil", obj2);
                startActivity(intent);
                return;
            default:
                return;
        }
    }
}

进而保存为ili,lil传入给了SecondActivity,双击进入

在这里插入图片描述
在这里插入图片描述

发现

在这里插入图片描述
在这里插入图片描述

因为doRawData为navtive函数,所以打开IDA

2.3 IDA修改apk逻辑实现破解

先发现有趣的函数,AES,Base64预估用到了AES加密算法

在这里插入图片描述
在这里插入图片描述

搜索doRawData只有一个结果,双击跳过去,F5转伪代码,大概看一下

代码语言:javascript
复制
jstring __fastcall doRawData(_JNIEnv *env, int jclass, int context, int string)
{
  _JNIEnv *env_1; // r4
  void *string_1; // r9
  const char *v6; // r6
  const char *v7; // r8
  jstring result; // r0
  jstring (__cdecl *v9)(JNIEnv *, const jchar *, jsize); // r6
  char *v10; // r5
  size_t v11; // r2
  int v12; // [sp+0h] [bp-28h]
  int v13; // [sp+18h] [bp-10h]
 
  env_1 = env;                                  // 如果不相等直接返回
  string_1 = string;
  if ( j_checkSignature(env, jclass, context) != 1
    || (strcpy(&v12, "thisisatestkey=="),
        v6 = env_1->functions->GetStringUTFChars(&env_1->functions, string_1, 0),
        v7 = j_AES_128_ECB_PKCS5Padding_Encrypt(),
        env_1->functions->ReleaseStringUTFChars(&env_1->functions, string_1, v6),
        result = env_1->functions->NewStringUTF(&env_1->functions, v7),
        _stack_chk_guard != v13) )              // 1.进行签名验证2.将输入字符串与加密后字符比较(这里的key是thisisatestkey==)
  {                                             // j_AES_128_ECB_PKCS5Padding_Encrypt这里出题人估计是故意降低难度的吧
    do
    {
      v9 = env_1->functions->NewString;
      v10 = UNSIGNATURE[0];
      v11 = strlen(UNSIGNATURE[0]);
    }
    while ( _stack_chk_guard != v13 );
    result = (v9)(env_1, v10, v11);
  }
  return result;
}

分析,可以发现,应该是对我们传入的数据做了AES加密。

v4应该是我们传入的值,v10则是秘钥。可以看到v14-v10这里组成了个数组。我们将其取出。秘钥即为thisisatestkey==

得到密钥后寻找加密字符串在FileDataActivity中发现9YuQ2dk8CSaCe7DTAmaqAA==

在这里插入图片描述
在这里插入图片描述

2.4 AES解密

在线解密网址:http://tool.chacuo.net/cryptaes

在这里插入图片描述
在这里插入图片描述

得到flag:Cas3_0f_A_CAK3


总结

  • AES
  • IDA
  • JADX
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-05-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、app2
    • 1.题目
      • 2.答题
        • 2.1 运行app
        • 2.2 jadx反编译apk文件
        • 2.3 IDA修改apk逻辑实现破解
        • 2.4 AES解密
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档