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学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

MyBatisX逆向工程的实现示例

《MyBatisX逆向工程的实现示例》本文主要介绍了MyBatisX逆向工程的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录逆向工程准备好数据库、表安装MyBATisX插件项目连接数据库引入依赖pom.XML生成实体类、

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Android 实现一个隐私弹窗功能

《Android实现一个隐私弹窗功能》:本文主要介绍Android实现一个隐私弹窗功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 效果图如下:1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来res/l

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE