01easy-apk-攻防世界XCTF新手练习Mobile记录

一、easy-apk

看到某个学习安卓逆向的路线,看到攻防世界。。。然后就去看了下题目
在这里插入图片描述

好久没碰安卓了,工作偶尔需要查看源码,一直没有深入学习

1.安装apk

拿到apk的思路,安装查看一遍,安装后发现需要验证
在安卓模拟器安装
在这里插入图片描述

2.反编译源码

使用jadx-gui直接打开apk
一般在MainActivity就可以看到程序一开始运行的操作
发现需要输入和该字符串类似的才能验证通过

在这里插入图片描述

找到核心加密的编码方法
 public void onClick(View view) {
      if (new Base64New().Base64Encode(((EditText) MainActivity.this.findViewById(C0295R.C0297id.editText)).getText().toString().getBytes()).equals("5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=")) {
           Toast.makeText(MainActivity.this, "验证通过!", 1).show();
       } else {
           Toast.makeText(MainActivity.this, "验证失败!", 1).show();
       }

发现后面有“=”,与base64的编码类似,但是到在线的base64解密是显示解密失败或者乱码

代码段意思是需要验证输入的文本经过Base64New().Base64Encode后的字符与"5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs="相等,则验证通过

所以我们找到Base64New().Base64Encode方法
在这里插入图片描述

这是对字符串编码的过程
我自己没看懂。。。百度一波后才发现,真的是base64编码,但是解密的字符换了
然后百度了一波原理,最后还是百度找的代码
使用了java进行解密
参考了知乎大神:https://zhuanlan.zhihu.com/p/116110552的解题思路,这里自己只是记录一下

3.解码

最后脚本:

package mobile;
import java.io.ByteArrayOutputStream;  
import java.io.IOException;  
import java.io.OutputStream;  
import java.io.UnsupportedEncodingException;

public class Base64New {
    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 final int RANGE = 255;
    private static byte[] StrToBase64Byte = new byte[128];
    
    //base64 原编码
    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 解码 网上找的
    public static byte getIndex(char x)
    {
        byte index = -1;
        String talbe = new String(Base64New.Base64ByteToStr);
        if(x != '=') {
            index = (byte) talbe.indexOf(x);
        }
        else {
            index = 0;
        }
        return index;
    }
    
    
    public static String Base64Decode(String str) {
        String flag = "";
        String flag_temp = "";
        for(int i = 0;i < str.length();i+=4)
        {
            String enf = str.substring(i,i+4);
            byte flag1 = (byte)(((getIndex(enf.charAt(0)) & 255) << 2 | ((getIndex(enf.charAt(1)) & 255) >>> 4)));
            byte flag2 = (byte)(((getIndex(enf.charAt(1)) & 255) << 4 | ((getIndex(enf.charAt(2)) & 255) >>> 2)));
            byte flag3 = (byte)(((getIndex(enf.charAt(2)) & 255) << 6 | ((getIndex(enf.charAt(3)) & 255))));

            flag_temp = "" + (char)flag1 + (char)flag2 + (char)flag3;
            flag += flag_temp;
        }
        System.out.println(flag);
        return flag;
    } 
    
	
    public static void main(String[] args) {
    	String str="5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=";
    	String flag=Base64New.Base64Decode(str);
    }
    
}



输出结果:
在这里插入图片描述
还找到一个python解法的,直接原链接:https://blog.csdn.net/sun8890446/article/details/102688191
base64原理解析:https://blog.csdn.net/wo541075754/article/details/81734770

4.输入flag

最后输入flag,
还有标准格式flag{}
估计后面的都是要这样的。。
所以最终答案为flag{05397c42f9b6da593a3644162d36eb01}
感想:
平时工作就是直接使用工具反编译,然后看懂app的大概思路,找后台传输数据或者app的核心运行原理思路,突然一接触这题目,学习路程漫漫

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值