Android逆向题解-攻防世界easyso

2024-08-20 15:20

本文主要是介绍Android逆向题解-攻防世界easyso,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

jeb反编译apk

输入字符串传入到native方法CheckString进行判断。
核心逻辑都在so里面的CheckString函数。
在这里插入图片描述
在这里插入图片描述

ida反编译so

直接反编译看伪代码,代码比较简单直接手撕即可,循环走一两遍就可以知道整个逻辑了。
整理逻辑流程就是输入字符串前16位与后16位互换。
然后单双位互换,0,1互换,2,3互换,4,5互换。。。
最后与指定字符串比较。

bool __fastcall Java_com_testjava_jack_pingan2_cyberpeace_CheckString(JNIEnv *a1, jobject a2, jstring a3)
{const char *v3; // x20__int64 v4; // x0signed int v5; // w21unsigned __int64 v6; // x22_BYTE *v7; // x0_BYTE *v8; // x19size_t v9; // w2unsigned __int64 v10; // x20_BYTE *v11; // x8char v12; // w9char v13; // w10char v14; // w9__int64 v15; // x20_BYTE *v16; // x8char v17; // w10unsigned __int64 v18; // x0unsigned __int64 v19; // x8v3 = (*a1)->GetStringUTFChars(a1, a3, 0LL);   // 输入字符串v4 = strlen(v3);                              // 字符串长度v5 = v4;v6 = ((v4 << 32) + 0x100000000LL) >> 32;      // v6 = v4 +1v7 = malloc(((v4 << 32) + 0x100000000LL) >> 32);v8 = v7;if ( v6 > v5 )v9 = v6 - v5;                               // v9 = 1elsev9 = 0;memset(&v7[v5], 0, v9);memcpy(v8, v3, v5);                           // 输入字符复制到v8if ( strlen(v8) >= 2uLL ){v10 = 0LL;do{v11 = &v8[v10];                           // v11 = &v8[0]--循环1--v10=1, v11 = v8[1]v12 = v8[v10 + 16];                       // v12 = v8[16]--循环1--v12 = v8[17]v13 = v8[v10++];                          // v13 = v8[0],v10=1--循环1--v13 = v8[1],v10  =2*v11 = v12;                               // v11 = v8[16] --循环1--v11 = v8[17]v11[16] = v13;                            // v11[16] = v8[0] --循环1-- v8[17] = v8[1]}                                           // v8[0]与v8[16]互换,循环1--v8[1]与v8[17]互换。。。// 这段循环的逻辑就是前16位与后16位互换while ( strlen(v8) >> 1 > v10 );            // v8的长度/2 > v10 , 就是循环v8的长度/2}if ( *v8 ){v14 = v8[1];                                // v14 = v8[1]v8[1] = *v8;                                // v8[1] = v8[0]*v8 = v14;                                  // v8[0] = v8[1]// 这段逻辑就是v8[0]与v8[1]互换if ( strlen(v8) >= 3uLL ){v15 = 0LL;do{v16 = &v8[v15];                         // v16 = &v8[0]v17 = v8[v15 + 2];                      // v17 = v8[2]v16[2] = v8[v15 + 3];                   // v8[2] = v8[3]v16[3] = v17;                           // v8[3] = v8[2]v18 = strlen(v8);v19 = v15 + 4;                          // v19 = 4v15 += 2LL;                             // v15 = 2}                                         // 这一段循环的逻辑就是单双位互换,0,1互换,2,3互换,4,5互换。。。while ( v18 > v19 );                      // v18是v8的长度,v19 = v15 + 4, v15是自加2,那v19也是自加2,也就是循环是自加2循环}}return strcmp(v8, "f72c5a36569418a20907b55be5bf95ad") == 0;// 最后v8与指定字符串比较
}

算法还原

还原过程就是指定的字符串“f72c5a36569418a20907b55be5bf95ad”先单双位互换得到“7fc2a5636549812a90705bb55efb59da”
然后前16位与后16位互换得到
flag{90705bb55efb59da7fc2a5636549812a}

    public static void main(String[] args) {String string = "f72c5a36569418a20907b55be5bf95ad";char[] chars = new char[string.length()];for (int i = 0; i < string.length(); i+=2) {chars[i] = string.charAt(i+1);chars[i+1] = string.charAt(i);}char[] ch2 = new char[chars.length];for (int i = 0; i < 16; i++) {ch2[i] = chars[i+16];ch2[i+16] = chars[i];}System.out.println(ch2);}

这篇关于Android逆向题解-攻防世界easyso的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090442

相关文章

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式