Android逆向题解 攻防世界难度4- Android2.0

news2024/9/21 19:03:21

Jeb打开apk

关键代码在Native函数getResult
在这里插入图片描述

IDA 打开 so

发现代码比较简单,可以直接静态分析。
输出字符串也就是flag 长度是15,然后分成三段,第一段是可以整除3,第二段是除3取余=1,第三段是除3取余等于2;

bool __fastcall Java_com_example_test_ctf03_JNI_getResult(JNIEnv *a1, int a2, int a3)
{
  int v3; // r4
  const char *v4; // r8
  char *v5; // r6
  char *v6; // r4
  char *v7; // r5
  int i; // r0
  int j; // r0


  v3 = 0;
  v4 = (*a1)->GetStringUTFChars(a1, a3, 0); //输入字符串
  if ( strlen(v4) == 15 )                   //判断输入字符串长度==15
  {
    v5 = malloc(1u);
    v6 = malloc(1u);
    v7 = malloc(1u);
    Init(v5, v6, v7, v4, 15);       //输入字符串分成三段
    if ( !First(v5) )               //第一部分比较
      return 0;
    for ( i = 0; i != 4; ++i )
      v6[i] ^= v5[i];
    if ( !strcmp(v6, " 5-\x16a") )  //第二部分比较
    {
      for ( j = 0; j != 4; ++j )
        v7[j] ^= v6[j];
      return strcmp(v7, "AFBo}") == 0;  //第三部分比较
    }
    else
    {
      return 0;
    }
  }
  return v3;
}

Init 字符串分成三段
int __fastcall Init(int result, char *a2, char *a3, const char *a4, int a5)
{
  int v5; // r5
  int v6; // r10
  int v7; // r6
  if ( a5 < 1 )
  {
    v6 = 0;
  }
  else
  {
    v5 = 0;
    v6 = 0;
    do
    {
      v7 = v5 % 3;
      if ( v5 % 3 == 2 )   //除3取余 == 2 是第3段
      {
        a3[v5 / 3u] = a4[v5];
      }
      else if ( v7 == 1 ) //除3取余 == 1 是第2段
      {
        a2[v5 / 3u] = a4[v5];
      }
      else if ( !v7 )
      {
        ++v6;
        *(result + v5 / 3u) = a4[v5];  //除3是第1段
      }
      ++v5;
    }
    while ( a5 != v5 );
  }
  *(result + v6) = 0;
  a2[v6] = 0;
  a3[v6] = 0;
  return result;
}

计算第一段

就是一个异或运算,注意这里只计算了4位,第5位不用算就是“l”;

First处理第一段
bool __fastcall First(char *a1)
{
  int i; // r1
  for ( i = 0; i != 4; ++i )
    a1[i] = (2 * a1[i]) ^ 0x80;  //经过运算后判断是否== LN^dl ,先乘以2再异或0x80, 反推就是用 LN^dl先异或0x80再除以2
  return strcmp(a1, "LN^dl") == 0;
}

可以算出第一段的值是 fgorl

        char[] chars = new char[]{'L','N','^','d','l'};
        char[] res = new char[5];
        for (int i = 0; i < 4; i++) {
            res[i] = (char) ((chars[i] ^ 0x80)/2);
        }
        res[4] = 'l';
        System.out.println(res);

计算第二段

第二段也是一个异或,同样也只算4位,第5位不用异或计算。注意这里的v5 不是上面计算出来的第一段的值,是上面异或之后的也就是“LN^dl” ,

for ( i = 0; i != 4; ++i )
      v6[i] ^= v5[i];
    if ( !strcmp(v6, a5A) )

可以算出第二段的值 是 l{sra

        char[] c2 = new char[]{0x20,0x35,0x2D,0x16,0x61}; //a5A
        char[] r2 = new char[5];
        for (int i = 0; i < 4; i++) {
            r2[i]  = (char) (chars[i]^c2[i]); //chars 是上面的 LN^dl
        }
        r2[4] = 0x61;
        System.out.println(r2);

计算第三段

一样的套路,还是异或计算4位,第5位直接照搬是“}”

      for ( j = 0; j != 4; ++j )
        v7[j] ^= v6[j];
      return strcmp(v7, "AFBo}") == 0;

可以计算出第三段 是 asoy}

        char[] c3 = new char[]{0x41, 0x46, 0x42, 0x6F, 0x7D}; // "AFBo}"
        char[] r3 = new char[5];
        for (int i = 0; i < 4; i++) {
            r3[i] = (char) (c2[i] ^  c3[i]);
        }
        r3[4] = 0x7D;
        System.out.println(r3);

组合起来就是flag

三段数据组合起来就是flag了
第一段:fgorl -------------整除3,对应的下标就是0,3,6,9,12
第二段:l{sra -------------除3余1,对应下标就是1,4,7,10,13
第三段:asoy} -------------除3余2,对应下标就是2,5,8,11,14
组合结果就是:flag{sosorryla}
完整计算代码:

    public static void main(String[] args) {
        char[] chars = new char[]{'L','N','^','d','l'};
        char[] res = new char[5];
        for (int i = 0; i < 4; i++) {
            res[i] = (char) ((chars[i] ^ 0x80)/2);
        }
        res[4] = 'l';
        System.out.println(res);

        //第二段
        char[] c2 = new char[]{0x20,0x35,0x2D,0x16,0x61};
        char[] r2 = new char[5];
        for (int i = 0; i < 4; i++) {
            r2[i]  = (char) (chars[i]^c2[i]);
        }
        r2[4] = 0x61;
        System.out.println(r2);

        //第三段
        char[] c3 = new char[]{0x41, 0x46, 0x42, 0x6F, 0x7D};
        char[] r3 = new char[5];
        for (int i = 0; i < 4; i++) {
            r3[i] = (char) (c2[i] ^  c3[i]);
        }
        r3[4] = 0x7D;
        System.out.println(r3);

        //还原
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < 5; i++) {
            stringBuilder.append(res[i]);
            stringBuilder.append(r2[i]);
            stringBuilder.append(r3[i]);
        }
        System.out.println(stringBuilder);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2042391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis进阶】缓存设计模式

目录 Cache Aside&#xff08;旁路缓存&#xff09;模式 概念 读操作流程如上图所示 写操作流程如上图所示 代码示例 总结 Read-Through 模式 概念 操作流程&#xff1a; 优点&#xff1a; Write-Through 模式 概念 操作流程&#xff1a; 优点&#xff1a; Writ…

【摄影后期技巧】连拍多张图像中快速找到最清晰的图像——Python代码实现

手持相机高速连拍过程&#xff0c;当快门速度不够高时不可避免出现模糊帧&#xff0c;通过肉眼去从多张连拍图像中找到最清晰的帧是比较费事的&#xff0c;可通过代码自动去计算最清晰的图像&#xff0c;省去挑选图像的麻烦事&#xff0c;同时也可以将模糊图像剔除掉&#xff0…

【Python学习-UI界面】PyQt5 小部件11-Dialog Button Box 确认与取消框

样式如下: 一个预配置的对话框&#xff0c;带有一个文本字段和两个按钮&#xff0c;OK和取消。在用户单击OK按钮或按下Enter键后&#xff0c;父窗口会在文本框中收集输入。 用户输入可以是数字、字符串或列表中的项。还会显示一个提示用户应该做什么的标签。 常用方法如下&…

详细介绍 Vue3 的 watch 和 watchEffect

在 Vue 3 中&#xff0c;watch 和 watchEffect 都是用于响应式地监听数据变化的工具&#xff0c;但它们有不同的使用场景和工作机制。 1. watch 1、概念 watch 是 Vue 3 提供的一个用于观察响应式数据变化并在数据发生变化时执行特定操作的工具。它通常用于执行副作用&#…

LeetCode 热题 HOT 100 (023/100)【宇宙最简单版】

【技巧】No. 0647 回文子串【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xff…

基于spring boot的疫情信息管理系统

TOC springboot255基于spring boot的疫情信息管理系统 绪论 1.1研究背景与意义 信息化管理模式是将行业中的工作流程由人工服务&#xff0c;逐渐转换为使用计算机技术的信息化管理服务。这种管理模式发展迅速&#xff0c;使用起来非常简单容易&#xff0c;用户甚至不用掌握…

CSC5812C 同步降压5V2.5A DC/DC车载充电方案

CSC5812C 是一款同步降压型的 DC/DC 变换器 IC &#xff0c;CSC5812C输入电压为 8~30V &#xff0c;可取得 2.5A恒定输出电流&#xff0c;开关频率 120kHz 左右&#xff0c;具有良好的瞬态响应和环路稳定性。CSC5812C 外围元器件极少&#xff0c;具有线补、过流保护和热保护功能…

Android全面解析之context机制(二): 从源码角度分析context创建流程(上)

前言 这篇文章从源码角度分析context创建流程。 在上一篇Android全面解析之Context机制(一) :初识context一文中讲解了context的相关实现类。经过前面的讨论&#xff0c;读者对于context在心中有了一定的理解。但始终觉得少点什么&#xff1a;activity是什么时候被创建的&…

IDEA终端无法打开,解决方法

检查终端路径&#xff1a; 确保你的系统终端路径被正确设置在你的开发环境或IDE的配置中。例如&#xff0c;在Windows上&#xff0c;这通常是cmd.exe、PowerShell或Git Bash的路径&#xff1b;在macOS或Linux上&#xff0c;这通常是/bin/bash、/bin/zsh等。 2.权限问题&#…

CTFSHOW 萌新 web13 解题思路和方法(利用?>提前结束语句)

点击题目链接&#xff0c;分析代码。发现相比上一关卡&#xff0c;增加过滤了分号。 此时&#xff0c;如果按照之前的方式构造url语句&#xff0c;发现由于分号的存在导致返回cmd error信息。 因为php中最后一行代码的结尾如果不接分号&#xff0c;也会被正常执行。 此时我们可…

Python 设计模式之享元模式

文章目录 从一个 MP3 案例谈起flyweight 模式解决flyweight pattern 的组件拆解定义与逐步实现完整代码 未讨论问题 享元模式&#xff08; flyweight pattern&#xff09;属于结构型设计模式&#xff0c;主要用于解决系统中大量创建同一个类的实例时导致的内存激增的问题&…

国产崛起,Solon:我们的性能是 Spring 的 300%

Solon 应用开发框架&#xff08;java framework&#xff09;。是从零开始构建&#xff0c;有自主的标准规范与开放生态。纯血国产。 追求&#xff1a; 更快、更小、更简单提倡&#xff1a; 克制、简洁、高效、开放、生态 相对于 Spring 应用开发框架。并发高 300%&#xff1b…

el-cascader多选的父子关联和父子不关联功能

公用html&#xff1a; <el-cascader v-model"data" :options"optionsData" :props"props" clearable> </el-cascader> 公用js变量&#xff1a; data () {return {// 绑定的数组data: [],// 绑定的选项数据optionsData: []} }, 公…

python自动化笔记:操作mysql数据库

操作mysql数据库常见方法 1、第三方库&#xff1a;pymysql1.1、安装pymysql1.2、连接数据库1.3、连接指定数据库1.4 创建数据库、创建表1.5、表中插入数据1.6、批量插入数据1.7、获取查询结果数据1.8、防sql注入&#xff0c;sql语句中一般用占位符传值 2、标准库 &#xff1a;m…

OpenCV图像处理——按最小外接矩形剪切图像

引言 在图像处理过程中&#xff0c;提取感兴趣区域&#xff08;ROI&#xff09;并在其上进行处理后&#xff0c;往往需要将处理后的结果映射回原图像。这一步通常涉及以下几个步骤&#xff1a; 找到最小外接矩形&#xff1a;使用 cv::boundingRect 或 cv::minAreaRect 提取感兴…

Jenkins默认工作目录修改及迁移(Windows)

问题描述 如果Jenkins安装时安在C盘&#xff0c;那么默认的空间就是C:\ProgramData\Jenkins.jenkins&#xff0c;git下拉的项目会在该目录的workspace下&#xff0c;造成C盘空间增大。网上方法倒是有&#xff0c;五花八门&#xff0c;我这里是Windows&#xff0c;是有更简单的…

前端工程化14-git merge 以及 git rebase。

rebase会把当前分支的 commit 放到公共分支的最后面,所以叫变基。就好像从公共分支又重新拉出来这个分支一样。 举例&#xff1a; 如果从 master 拉个feature分支出来,然后提交了几个 commit,这个时候刚好有人把他开发的东西合并到 master 了,这个时候 master 就比你拉分支的…

VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection

VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection Abstract 摘要部分&#xff0c;作者首先指出了3D点云中目标检测的重要性&#xff0c;在自动驾驶导航、家政机器人以及增强现实和虚拟现实等多个领域有重要的作用。然后&#xff0c;提到了现有方法的…

C语言实现多种快速排序

目录 1.概念 2.快速排序hoare版本 2.1基本思想 2.2解释相遇处的值为何一定小于key 2.3hoare版本快速排序的实现 3.快速排序挖坑法 3.1基本思想 3.2挖坑法快速排序的实现 4. 快速排序前后指针版本 4.1基本思想 4.2快速排序前后指针版本实现 5.快速排序非递归版本 …