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

【愚公系列】2023年04月 攻防世界-MOBILE(easy-apk)

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

前言

下面介绍两个反编译工具

  • 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

一、easy-apk

1.题目

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

2.答题

2.1 jadx反编译apk文件

找到入口

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
package com.testjava.jack.pingan1;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

/* loaded from: classes.dex */
public class MainActivity extends AppCompatActivity {
    /* JADX INFO: Access modifiers changed from: protected */
    @Override // android.support.v7.app.AppCompatActivity, android.support.v4.app.FragmentActivity, android.support.v4.app.SupportActivity, android.app.Activity
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((Button) findViewById(R.id.button)).setOnClickListener(new View.OnClickListener() { // from class: com.testjava.jack.pingan1.MainActivity.1
            @Override // android.view.View.OnClickListener
            public void onClick(View view) {
                if (new Base64New().Base64Encode(((EditText) MainActivity.this.findViewById(R.id.editText)).getText().toString().getBytes()).equals("5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=")) {
                    Toast.makeText(MainActivity.this, "验证通过!", 1).show();
                } else {
                    Toast.makeText(MainActivity.this, "验证失败!", 1).show();
                }
            }
        });
    }
}

很明显又是比较字符串:5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=

2.2 base64

打开Base64New 的函数

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
package com.testjava.jack.pingan1;

/* loaded from: classes.dex */
public class Base64New {
    private static final int RANGE = 255;
    private static final char[] Base64ByteToStr = {'v', 'w', 'x', 'r', 's', 't', 'u', 'o', 'p', 'q', '3', '4', '5', '6', '7', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'y', 'z', '0', '1', '2', 'P', 'Q', 'R', 'S', 'T', 'K', 'L', 'M', 'N', 'O', 'Z', 'a', 'b', 'c', 'd', 'U', 'V', 'W', 'X', 'Y', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', '8', '9', '+', '/'};
    private static byte[] StrToBase64Byte = new byte[128];

    public String Base64Encode(byte[] bytes) {
        StringBuilder res = new StringBuilder();
        for (int i = 0; i <= bytes.length - 1; i += 3) {
            byte[] enBytes = new byte[4];
            byte tmp = 0;
            for (int k = 0; k <= 2; k++) {
                if (i + k <= bytes.length - 1) {
                    enBytes[k] = (byte) (((bytes[i + k] & 255) >>> ((k * 2) + 2)) | tmp);
                    tmp = (byte) ((((bytes[i + k] & 255) << (((2 - k) * 2) + 2)) & 255) >>> 2);
                } else {
                    enBytes[k] = tmp;
                    tmp = 64;
                }
            }
            enBytes[3] = tmp;
            for (int k2 = 0; k2 <= 3; k2++) {
                if (enBytes[k2] <= 63) {
                    res.append(Base64ByteToStr[enBytes[k2]]);
                } else {
                    res.append('=');
                }
            }
        }
        return res.toString();
    }
}

发现并不是正常的base64,而是码表不同,所以需要使⽤特定的 base64 解密脚本。

代码语言:javascript
复制
from hashlib import *
def base64_decode(str_list):
	list_base = []
	# 第一个左移两位
	a = str_list[0] << 2
	# 第二个字符低4位
	c = str_list[1] & 15
	# 加上第二个高2位
	b = str_list[1] >> 4
	# 第一个转换字符 6 + 2(剩下4)
	a = a | b
	list_base.append(a)
	# 左移4位
	c = c << 4
	# 第三个字符低2位
	a = str_list[2] & 3
	# 第三个字符高4位
	b = str_list[2] >> 2
	# 第二个转换字符 4 + 4(剩下2)
	c = c | b
	list_base.append(c)
	# 第三个字符低2位左移6位
	a = a << 6
	# 加上第四个字符
	a = a | str_list[3]
	# 第三个转换字符
	list_base.append(a)
	return list_base
byte_to_str = ['v', 'w', 'x', 'r', 's', 't', 'u', 'o',
'p', 'q', '3', '4', '5', '6', '7', 'A',
'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'J', 'y', 'z', '0', '1', '2', 'P', 'Q',
'R', 'S', 'T', 'K', 'L', 'M', 'N', 'O',
'Z', 'a', 'b', 'c', 'd', 'U', 'V', 'W',
'X', 'Y', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', '8', '9', '+', '/']
table = "".join([i for i in byte_to_str])
cipher_test = '5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs='
ans = ''
i = 0
while i <= len(cipher_test) - 1:
	list1 = []
	equal_num = 0
	for k in range(4):
		if cipher_test[i+k] is '=':
			list1.append(0)
			equal_num += 1
		else:
			list1.append(table.index(cipher_test[i+k]))
	ba = base64_decode(list1)
	for j in range(3-equal_num):
		ch = chr(ba[j])
		ans += str(ch)
	i += 4
flag = 'flag{' + format(ans) + '}'
print(flag)

得到flag: flag{05397c42f9b6da593a3644162d36eb01}

总结

一个简单的base64转码题目,不过将转换表更换了,只需要写出解码函数即可,熟悉一遍解码函数

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、easy-apk
    • 1.题目
      • 2.答题
        • 2.1 jadx反编译apk文件
        • 2.2 base64
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档