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

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

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

前言

下面介绍两个反编译工具

  • 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

一、Ph0en1x-100

1.题目

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

2.答题

2.1 jadx反编译apk文件

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/* loaded from: classes.dex */
public class MainActivity extends AppCompatActivity {
    EditText etFlag;

    public native String encrypt(String str);

    public native String getFlag();

    static {
        System.loadLibrary("phcm");
    }

    /* JADX INFO: Access modifiers changed from: protected */
    @Override // android.support.v7.app.AppCompatActivity, android.support.v4.app.FragmentActivity, android.app.Activity
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.etFlag = (EditText) findViewById(R.id.flag_edit);
    }

    public void onGoClick(View v) {
        if (getSecret(getFlag()).equals(getSecret(encrypt(this.etFlag.getText().toString())))) {
            Toast.makeText(this, "Success", 1).show();
        } else {
            Toast.makeText(this, "Failed", 1).show();
        }
    }

    public String getSecret(String string) {
        try {
            byte[] hash = MessageDigest.getInstance(encrypt("KE3TLNE6M43EK4GM34LKMLETG").substring(5, 8)).digest(string.getBytes("UTF-8"));
            if (hash != null) {
                StringBuilder hex = new StringBuilder(hash.length * 2);
                for (byte b : hash) {
                    if ((b & 255) < 16) {
                        hex.append("0");
                    }
                    hex.append(Integer.toHexString(b & 255));
                }
                return hex.toString();
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e2) {
            e2.printStackTrace();
        }
        return null;
    }
}

发现

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

我们看到 encrypt()以及 getFlag()都在 so 文件里,所以我们IDA

2.2 IDA

encrypt()函数解析:

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

其实这个 encrypt()函数很简单,就是把输入的字符串每位的 ASCII 码减去 1

getFlag()函数解析:

getFlag我们就采用动态解析

2.3 apktool,模拟器动态调试

第一步:安装adb

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

第二步:安装安卓模拟器

下载链接:https://www.yeshen.com/

第三步:apktool

下载链接:https://ibotpeaches.github.io/Apktool/install/

拆包

代码语言:javascript
复制
java -jar apktool.jar d f6adc401d0eb472892a4ac4481f76a85.apk
在这里插入图片描述
在这里插入图片描述

打开AndroidManifest.xml 添加 android:debuggable=“true”

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ph0en1x.android_crackme" platformBuildVersionCode="22" platformBuildVersionName="5.1.1-1819727">
    <application android:debuggable="true" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
        <activity android:name="com.ph0en1x.android_crackme.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

打包

代码语言:javascript
复制
java -jar apktool.jar b f6adc401d0eb472892a4ac4481f76a85

的文件夹里会出现一个 dist 文件夹,里面就是重新生成的 APK,但是此时的 APK 是不可以使用的,因为还没有签名!

生成签名

代码语言:javascript
复制
keytool -genkey -alias mykey -keyalg RSA -validity 40000 -keystore demo.keystore 
在这里插入图片描述
在这里插入图片描述

注意参数:

  1. -keystore demo.keystore 为密钥的位置
  2. -signedjar <new.apk> <old.apk> <demo.keysotre> 正式签名

执行命令

代码语言:javascript
复制
jarsigner -verbose -keystore demo.keystore -signedjar new.apk f6adc401d0eb472892a4ac4481f76a85.apk mykey
在这里插入图片描述
在这里插入图片描述

2.3 JEB

用JEB打开new.apk

我们在 onGoClink()方法下打断点,断点的位置即为 getFlag()返回的位置

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

使用 adb 查看是否已经连接上设备

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

在 CMD 中以 adb shell am start -D -n 包名/入口activity名的命令格式执行以下命令开始运行程序:

代码语言:javascript
复制
adb shell am start -D -n com.ph0en1x.android_crackme/com.ph0en1x.android_crackme.MainActivity

然后模拟器运行 APP

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

然后 attach 进入调试模式,这时候 app 随便输入flag,成功断下

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

然后就得到了 getFlag()的字符串ekfz@q2x/tfn0mF6/rbqanqntfg^Ehq|`

最后只要编写脚本即可获得 flag

代码语言:javascript
复制
flag="ek`fz@q2^x/t^fn0mF^6/^rb`qanqntfg^E`hq|"
flag_list=[]
for i in flag:
	flag_list.append(chr((ord(i)+1)))
print("".join(flag_list))
在这里插入图片描述
在这里插入图片描述

flag为:flag{Ar3_y0u_go1nG_70_scarborough_Fair}

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、Ph0en1x-100
    • 1.题目
      • 2.答题
        • 2.1 jadx反编译apk文件
        • 2.2 IDA
        • 2.3 apktool,模拟器动态调试
        • 2.3 JEB
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档