Xctf-easyapk Write UP

前期工作

  • 查壳

    无壳

  • 运行

    没什么特别的

逆向分析

使用jadx反编译查看代码

先看看文件结构

MainActivity代码

  1. public class MainActivity extends AppCompatActivity {
  2. /* access modifiers changed from: protected */
  3. public void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView((int) R.layout.activity_main);
  6. ((Button) findViewById(R.id.button)).setOnClickListener(new View.OnClickListener() {
  7. public void onClick(View view) {
  8. if (new Base64New().Base64Encode(((EditText) MainActivity.this.findViewById(R.id.editText)).getText().toString().getBytes()).equals("5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=")) {
  9. Toast.makeText(MainActivity.this, "验证通过!", 1).show();
  10. } else {
  11. Toast.makeText(MainActivity.this, "验证失败!", 1).show();
  12. }
  13. }
  14. });
  15. }
  16. }

可以看到大概就是将通过Base64编码后比较。但是将代码中的Base64字符串拿去解码得不到正常字符串。注意到Base64New里的New,猜测是自己实现了一个新的Base64编码。

看看Base64New类的代码

  1. public class Base64New {
  2. 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', '+', '/'};
  3. private static final int RANGE = 255;
  4. private static byte[] StrToBase64Byte = new byte[128];
  5. public String Base64Encode(byte[] bytes) {
  6. StringBuilder res = new StringBuilder();
  7. for (int i = 0; i <= bytes.length - 1; i += 3) {
  8. byte[] enBytes = new byte[4];
  9. byte tmp = 0;
  10. for (int k = 0; k <= 2; k++) {
  11. if (i + k <= bytes.length - 1) {
  12. enBytes[k] = (byte) (((bytes[i + k] & 255) >>> ((k * 2) + 2)) | tmp);
  13. tmp = (byte) ((((bytes[i + k] & 255) << (((2 - k) * 2) + 2)) & 255) >>> 2);
  14. } else {
  15. enBytes[k] = tmp;
  16. tmp = 64;
  17. }
  18. }
  19. enBytes[3] = tmp;
  20. for (int k2 = 0; k2 <= 3; k2++) {
  21. if (enBytes[k2] <= 63) {
  22. res.append(Base64ByteToStr[enBytes[k2]]);
  23. } else {
  24. res.append('=');
  25. }
  26. }
  27. }
  28. return res.toString();
  29. }
  30. }

可以看到应该是替换了码表

编写脚本

  1. # s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  2. a = [
  3. 'v', 'w', 'x', 'r', 's', 't', 'u', 'o', 'p', 'q', '3', '4', '5', '6', '7',
  4. 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'y', 'z', '0', '1', '2',
  5. 'P', 'Q', 'R', 'S', 'T', 'K', 'L', 'M', 'N', 'O', 'Z', 'a', 'b', 'c', 'd',
  6. 'U', 'V', 'W', 'X', 'Y', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
  7. '8', '9', '+', '/'
  8. ]
  9. s = ''.join(a)
  10. def My_base64_encode(inputs):
  11. # 将字符串转化为2进制
  12. bin_str = []
  13. for i in inputs:
  14. x = str(bin(ord(i))).replace('0b', '')
  15. bin_str.append('{:0>8}'.format(x))
  16. #print(bin_str)
  17. # 输出的字符串
  18. outputs = ""
  19. # 不够三倍数,需补齐的次数
  20. nums = 0
  21. while bin_str:
  22. #每次取三个字符的二进制
  23. temp_list = bin_str[:3]
  24. if (len(temp_list) != 3):
  25. nums = 3 - len(temp_list)
  26. while len(temp_list) < 3:
  27. temp_list += ['0' * 8]
  28. temp_str = "".join(temp_list)
  29. #print(temp_str)
  30. # 将三个8字节的二进制转换为4个十进制
  31. temp_str_list = []
  32. for i in range(0, 4):
  33. temp_str_list.append(int(temp_str[i * 6:(i + 1) * 6], 2))
  34. #print(temp_str_list)
  35. if nums:
  36. temp_str_list = temp_str_list[0:4 - nums]
  37. for i in temp_str_list:
  38. outputs += s[i]
  39. bin_str = bin_str[3:]
  40. outputs += nums * '='
  41. print("Encrypted String:\n%s " % outputs)
  42. def My_base64_decode(inputs):
  43. # 将字符串转化为2进制
  44. bin_str = []
  45. for i in inputs:
  46. if i != '=':
  47. x = str(bin(s.index(i))).replace('0b', '')
  48. bin_str.append('{:0>6}'.format(x))
  49. #print(bin_str)
  50. # 输出的字符串
  51. outputs = ""
  52. nums = inputs.count('=')
  53. while bin_str:
  54. temp_list = bin_str[:4]
  55. temp_str = "".join(temp_list)
  56. #print(temp_str)
  57. # 补足8位字节
  58. if (len(temp_str) % 8 != 0):
  59. temp_str = temp_str[0:-1 * nums * 2]
  60. # 将四个6字节的二进制转换为三个字符
  61. for i in range(0, int(len(temp_str) / 8)):
  62. outputs += chr(int(temp_str[i * 8:(i + 1) * 8], 2))
  63. bin_str = bin_str[4:]
  64. print("Decrypted String:\n%s " % outputs)
  65. print()
  66. print(" *************************************")
  67. print(" * (1)encode (2)decode *")
  68. print(" *************************************")
  69. print()
  70. num = input("Please select the operation you want to perform:\n")
  71. if (num == "1"):
  72. input_str = input("Please enter a string that needs to be encrypted: \n")
  73. My_base64_encode(input_str)
  74. else:
  75. input_str = input("Please enter a string that needs to be decrypted: \n")
  76. My_base64_decode(input_str)

运行结果

  • 验证

    flag

    flag{05397c42f9b6da593a3644162d36eb01}

Xctf-easyapk的更多相关文章

  1. 攻防世界(XCTF)WEB(进阶区)write up(四)

    ics-07  Web_php_include  Zhuanxv Web_python_template_injection ics-07 题前半部分是php弱类型 这段说当传入的id值浮点值不能为1 ...

  2. 攻防世界(XCTF)WEB(进阶区)write up(三)

    挑着做一些好玩的ctf题 FlatScience web2 unserialize3upload1wtf.sh-150ics-04web i-got-id-200 FlatScience 扫出来的lo ...

  3. 攻防世界(XCTF)WEB(进阶区)write up(一)

      cat ics-05 ics-06 lottery Cat XCTF 4th-WHCTF-2017 输入域名  输入普通域名无果  输入127.0.0.1返回了ping码的结果 有可能是命令执行 ...

  4. XCTF攻防世界Web之WriteUp

    XCTF攻防世界Web之WriteUp 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 view-source2 0x02 get post3 0x03 rob ...

  5. xctf进阶-unserialize3反序列化

    一道反序列化题: 打开后给出了一个php类,我们可以控制code值: `unserialize()` 会检查是否存在一个 `__wakeup()` 方法.如果存在,则会先调用 `__wakeup` 方 ...

  6. 日常破解--从XCTF的app3题目简单了解安卓备份文件以及sqliteCipher加密数据库

    一.题目来源     题目来源:XCTF app3题目 二.解题过程     1.下载好题目,下载完后发现是.ab后缀名的文件,如下图所示:     2.什么是.ab文件?.ab后缀名的文件是Andr ...

  7. 日常破解--XCTF easy_apk

    一.题目来源     来源:XCTF社区安卓题目easy_apk 二.破解思路     1.首先运行一下给的apk,发现就一个输入框和一个按钮,随便点击一下,发现弹出Toast验证失败.如下图所示: ...

  8. XCTF练习题-WEB-webshell

    XCTF练习题-WEB-webshell 解题步骤: 1.观察题目,打开场景 2.根据题目提示,这道题很有可能是获取webshell,再看描述,一句话,基本确认了,观察一下页面,一句话内容,密码为sh ...

  9. 【XCTF】ics-04

    信息: 题目来源:XCTF 4th-CyberEarth 标签:PHP.SQL注入 题目描述:工控云管理系统新添加的登录和注册页面存在漏洞,请找出flag 解题过程 进入注册页面,尝试注册: 进行登录 ...

  10. 【XCTF】ics-05

    信息: 题目来源:XCTF 4th-CyberEarth 标签:PHP.伪协议 题目描述:其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统 解题过程 题目给了一个工控管理系统,并提示存在后门, ...

随机推荐

  1. Flask基础全套

    Flask简介 Flask是主流PythonWeb三大框架之一,其特点是短小精悍以及功能强大从而获得众多Pythoner的追捧,相比于Django它更加简单更易上手,Flask拥有非常强大的三方库,提 ...

  2. maven项目添加jar包

    使用集成工具创建一个maven项目,如果需要添加开发包,只需去maven仓库找到对应的包,将配置信息加入pom.xml文件即可.这样,我们就再也不用到处寻找和下载jar包了. 用例:开发工具 STS ...

  3. Java学习日报7.30

    package dog;import java.util.*;public class Dog { private String dogName; private String dogColor; p ...

  4. Git全栈开发者使用指南

    一.Git基础 1.Git简介 Git是一种分布式版本控制系统,由Linux之父Linus开发. 所谓分布式版本管理系统,就是在每一台机器上都有一个完整的仓库. 2.Git官网 Git官网:git 在 ...

  5. git fork , git pull request那回事

    git fork 原理 相当于你在原项目的主分支上又建立了一个分支,你可以在该分支上任意修改,如果想将你的修改合并到原项目中时,可以pull request,这样原项目的作者就可以将你修改的东西合并到 ...

  6. 解决使用Navicat等工具进行连接登录mysql的1130错误,无法使用Ip远程连接的问题(mysql为8.0版本)

    错误:ERROR 1130: Host '192.168.1.3' is not allowed to connect to thisMySQL serve 错误1130:主机192.168.1.3& ...

  7. C/C++ 弱符号

    为什么会出现弱符号 在两个目标文件(a.o与b.o)链接的过程中,如果其中一个目标文件(a.o)通过extern的方式引用了另外一个目标文件(b.o)中的符号flag,但很不幸,在连接的过程中b.o没 ...

  8. phpstorm 注册码破解

    激活码1 812LFWMRSH-eyJsaWNlbnNlSWQiOiI4MTJMRldNUlNIIiwibGljZW5zZWVOYW1lIjoi5q2j54mIIOaOiOadgyIsImFzc2ln ...

  9. js 鼠标点击页面出现文字

    <script type="text/javascript"> var a_idx = 0; jQuery(document).ready(function($) { ...

  10. ThinkPHP5表单令牌刷新

    制作登录页面的时候,加入了表单令牌,账号和密码输入错误后,再登录的话,会提示表单令牌错误, 这是因为旧的令牌已经过期了,我们要处理下前端的token,修复的办法,在路由文件下加入 //刷新表单令牌,然 ...