【愚公系列】2023年04月 攻防世界-MOBILE(Android2.0)

article/2025/7/8 7:29:40

文章目录

  • 前言
  • 一、Android2.0
    • 1.题目
    • 2.答题


前言

下面介绍两个反编译工具

  • jadx是一个用于反编译Android APK文件的开源工具,静态反编译,查找索引功能强大
  • jeb和IDA很像,属于动态调试,可以看java汇编也可以生成伪代码,还可以动态attach到目标调试

对于so文件的逆向工具选择

  • IDA逆向工具是一款反汇编器,被广泛应用于软件逆向工程领域,能够反汇编各种不同平台的二进制程序代码,并还原成可读的汇编代码。

一、Android2.0

1.题目

在这里插入图片描述

2.答题

1、将apk拖进jadx工具反编译,可以看到调用这个函数JNI.getResult,返回值为0就提示wrong。

在这里插入图片描述

2、因为getResult是JNI函数,所以需要看一看so文件,找到这个函数,反汇编代码如下:

选择函数窗体搜索getResult

在这里插入图片描述
点击后,在出现的汇编代码中,按F5就可以查看反编译的代码了~

在这里插入图片描述

bool __fastcall Java_com_example_test_ctf03_JNI_getResult(int a1, int a2, int a3)
{_BOOL4 v3; // r4const char *v4; // r8char *v5; // r6char *v6; // r4char *v7; // r5int i; // r0int j; // r0v3 = 0;v4 = (const char *)(*(int (__fastcall **)(int, int, _DWORD))(*(_DWORD *)a1 + 676))(a1, a3, 0);if ( strlen(v4) == 15 ){v5 = (char *)malloc(1u);v6 = (char *)malloc(1u);v7 = (char *)malloc(1u);Init(v5, v6, v7, v4, 15);if ( !First(v5) )goto LABEL_6;for ( i = 0; i != 4; ++i )v6[i] ^= v5[i];if ( !strcmp(v6, a5) ){for ( j = 0; j != 4; ++j )v7[j] ^= v6[j];v3 = strcmp(v7, "AFBo}") == 0;}else{
LABEL_6:v3 = 0;}}return v3;
}

改一下函数的形参类型:JNIEnv *env, jobject obj, jstring str,再看看伪代码:
在这里插入图片描述

bool __fastcall Java_com_example_test_ctf03_JNI_getResult(JNIEnv *a1, jobject a2, jstring a3)
{int v3; // r4const char *v4; // r8char *v5; // r6char *v6; // r4char *v7; // r5int i; // r0int j; // r0v3 = 0;v4 = (*a1)->GetStringUTFChars(a1, a3, 0);if ( strlen(v4) == 15 ){v5 = (char *)malloc(1u);v6 = (char *)malloc(1u);v7 = (char *)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, a5) ){for ( j = 0; j != 4; ++j )v7[j] ^= v6[j];return strcmp(v7, "AFBo}") == 0;}else{return 0;}}return v3;
}

先看GetStringUTFChars将我们输入的java类型的str变成c语言形式的字符串,然后判断长度是否等于15,否则返回0,接着v5,v6,v7分配了一个字符的大小,执行Init函数,进去看一看这个函数是干啥的:

int __fastcall Init(int result, char *a2, char *a3, const char *a4, int a5)
{int v5; // r5int v6; // r10int v7; // r6if ( a5 < 1 ){v6 = 0;}else{v5 = 0;v6 = 0;do{v7 = v5 % 3;if ( v5 % 3 == 2 ){a3[v5 / 3u] = a4[v5];}else if ( v7 == 1 ){a2[v5 / 3u] = a4[v5];}else if ( !v7 ){++v6;*(_BYTE *)(result + v5 / 3u) = a4[v5];}++v5;}while ( a5 != v5 );}*(_BYTE *)(result + v6) = 0;a2[v6] = 0;a3[v6] = 0;return result;
}

代入去想(注意这里要把result看成*a1),15位字符串,do while循环15次,模3赋值a1,a2,a3,也就是将我输入的字符串按如下方式处理:

a1就是str[0],str[3],str[6],str[9],str[12]
a2就是str[1],str[4],str[7],str[10],str[13]
a3就是str[2],str[5],str[8],str[11],str[14]也就是对应getResult函数中的v5,v6,v7

3、分析v5,v6,v7的来源

接着看第一个if ( !First(v5) ),这里是将v5进行了4次循环处理,将自身乘以2然后异或0x80,v5通过前面的分析,可以知道一共有5位,这里只对前4位进行了处理,处理后的v5必须等于"LN^dl"。

bool __fastcall First(char *a1)
{int i; // r1for ( i = 0; i != 4; ++i )a1[i] = (2 * a1[i]) ^ 0x80;return strcmp(a1, "LN^dl") == 0;
}

再回来,又看到一个4次的for循环,这一次处理的是v6,将自身与v5的每一位进行异或,那串字符串反编译有点问题,看data进行比较。

    for ( i = 0; i != 4; ++i )v6[i] ^= v5[i];if ( !strcmp(v6, " 5-\x16a") ).rodata:00002888 unk_2888        DCB 0x20                ; DATA XREF: Second(char *,char *)+18↑o.rodata:00002888                                         ; Second(char *,char *)+1C↑o ....rodata:00002889                 DCB 0x35 ; 5.rodata:0000288A                 DCB 0x2D ; -.rodata:0000288B                 DCB 0x16.rodata:0000288C                 DCB 0x61 ; a.rodata:0000288D                 DCB    0

最后又是一组循环,v7的处理和v6一样,也是将自身与v6异或,同样只处理前4位,然后和"AFBo}"比较。

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

4、逆向还原v5、v6、v7

#include <stdio.h>void getV5(char *v5)
{int i;char str[6] = "LN^dl";;for (i = 0; i < 4; i++){v5[i] = (str[i] ^ 0x80) / 2;}v5[i] = str[i];v5[i + 1] = 0;
}void getV6(char *v6)
{int i;char str[6] = "LN^dl";char str2[6] = {0x20, 0x35, 0x2d, 0x16, 0x61, 0};for (i = 0; i < 4; i++){v6[i] = str2[i] ^ str[i];}v6[i] = str2[i];v6[i + 1] = 0;
}void getV7(char *v7)
{int i;char str2[6] = {0x20, 0x35, 0x2d, 0x16, 0x61, 0};char str3[6] = "AFBo}";for (i = 0; i < 4; i++){v7[i] = str3[i] ^ str2[i];}v7[i] = str3[i];v7[i + 1] = 0;
}int main()
{char v5[6];char v6[6];char v7[6];char flag[15];getV5(v5);getV6(v6);getV7(v7);int j= 0;for (int i = 0; i < 5; i++){flag[j] = v5[i];flag[j+1] = v6[i];flag[j+2] = v7[i];j=j+3;}printf("%s", flag);return 1;
}

优化下代码

#include <stdio.h>int main()
{char str[6] = "LN^dl";char str2[6] = {0x20, 0x35, 0x2d, 0x16, 0x61, 0};char str3[6] = "AFBo}";char flag[15];int i = 0;int j = 0;for (i = 0; i < 4; i++){flag[j] = (str[i] ^ 0x80) / 2;flag[j + 1] = str2[i] ^ str[i];flag[j + 2] = str3[i] ^ str2[i];j = j + 3;}flag[j] = str[i];flag[j + 1] =str2[i];flag[j + 2] = str3[i];flag[j + 3] = '\0'; printf("%s", flag);return 1;
}

python脚本如下:

a1 = ""
a2 = ""
a3 = ""key1 = "LN^dl"
for i in range(4):a1 += chr((ord(key1[i]) ^ 0x80) // 2)
a1 += key1[4]key2 = " 5-\x16a"
for i in range(4):a2 += chr(ord(key2[i]) ^ ord(key1[i]))
a2 += key2[4]key3 = "AFBo}"
for i in range(4):a3 += chr(ord(key3[i]) ^ ord(key2[i]))
a3 += key3[4]flag = ""
for i in range(5):flag = flag + a1[i] + a2[i] + a3[i]print(flag)
flag{sosorryla}

http://chatgpt.dhexx.cn/article/pXwtEg4T.shtml

相关文章

方法重载与方法重写

方法重载 目的&#xff1a;为了解决两个或多个功能相同的不同方法在命名时出现多个不同方法名的问题&#xff0c;重载把一组功能相同的方法命名为同一个方法名&#xff0c;这样就可以减轻开发者在方法的命名上的痛苦。 什么是方法重载 在同一个类中, 具有相同方法名的一组方…

java重写是什么?方法重写特点是什么?

Java属于入门容易&#xff0c;天花板却极高的编程语言。java重写是什么&#xff1f;对于java工程师来说技术的不断发展,需要不断学习java进阶知识。为了帮助大家巩固基础&#xff0c;本文解答了java重写是什么?方法重写特点是什么?等相关问题&#xff0c;希望可以帮到大家。 …

彻底搞懂为什么重写equals还要重写hashcode?

引言 原文链接&#xff1a;深入理解equals和hashCode 由于hashCode与HashMap有一定关系&#xff0c;推荐大家看一下我的这篇文章 HashMap源码大剖析 本文介绍java.lang.Object类中的两个方法&#xff1a;equals和hashCode。这两个方法大家应该都知道&#xff0c;但是这两个方…

Java方法的重写

一、 方法的重写&#xff08;Override&#xff09; 重写是子类对父类的允许访问的方法的实现过程进行重新编写&#xff0c;返回值和形参都不能改变。 重写的好处在于子类可以根据需要&#xff0c;定义特定属于自己的行为。也就是说子类能够&#xff0c;根据需要实现父类的方法。…

方法的重写

方法的重写和super关键字 1、重写&#xff1a; 在Java和其他一些高级面向对象的编程语言中&#xff0c;子类可继承父类中的方法&#xff0c;而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法&#xff0c;而是想作一定的修改&#xff0c;这就需要采用方…

Java方法之重写

方法的重写是学习java面向对象过程中一个极其重要的知识点。那么什么叫方法的重写呢&#xff1f;举个例子&#xff08;再次摆上使用了多次的老图&#xff09;&#xff1a;              博主毕业后&#xff0c;终于继承了家里面的一笔巨额财产&#xff1a;一辆奇瑞…

为什么重写equals一定要重写hashcode?

引言 这篇文章已经是我很久之前写的&#xff0c;其中的内容表述得不太清楚&#xff0c;或多或少难以让人信服&#xff0c;于是我又写了一篇&#xff0c;链接如下&#xff1a; CSDN链接&#xff1a;彻底搞懂为什么重写equals还要重写hashcode&#xff1f; 微信公众号链接&…

详述重写

1、什么是重写 重写即重新改写&#xff0c;是为了将一个已有的事物进行某些改变以适应新的要求 2、为什么要重写 方法使用的是父类的eat方法&#xff0c;子类继承自父类的eat方法已经不能“准确描述子类自身的行为”&#xff0c;此时就需要用到重写 注&#xff1a;如果父类中…

什么是重写?重写的作用?

一、什么是重写&#xff1f; 1. 重写(Override)概念 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变&#xff0c;核心重写&#xff01; 重写的好处在于子类可以根据需要&#xff0c;定义特定于自己的行为。 也就是说子类能够…

店铺淘客软件定制,1688分销软件OEM贴牌配合精细化运营提升店铺流量

之前做淘宝的有很多人做的是店淘模式&#xff0c;简单来讲店淘模式就是我们开一个淘宝店&#xff0c;然后用软件采集淘宝联盟上的高佣金高销量产品上传到咱们自己的店铺&#xff0c;目前市场上这类软件种类繁多&#xff0c;主要是看软件的功能&#xff0c;安全深度&#xff0c;…

弘辽科技:拼多多的流量从何而来?怎样提升店铺流量?

原标题《弘辽科技&#xff1a;拼多多的流量从何而来?怎样提升店铺流量?》 无论在哪个平台开店&#xff0c;要想商品卖出去&#xff0c;就一定要有要有流量才可以。自然流量对卖家来讲&#xff0c;肯定是最好的&#xff0c;因为不用花钱去做推广。那么&#xff0c;拼多多的流…

弘辽科技:10大手淘推荐流量来源地,快速提升店铺流量

原标题《弘辽科技&#xff1a;10大手淘推荐流量来源地&#xff0c;快速提升店铺流量》 在手淘上面有不少流量都是来自于推荐的&#xff0c;但是这些流量都是来源于哪些呢&#xff1f;商家们肯定对此很是疑惑&#xff0c;对这些“不知来源的流量”很是好奇。接下来就告诉大家这…

分享淘宝如何提升免费流量 附疫情期间遇到的一些店铺问题

大家保护好自己不给祖国添麻烦!出门戴口罩&#xff0c;勤洗手&#xff0c;少去人群聚集处。疫情期间很多人都不知做什么&#xff0c;有很多喜欢淘宝在做的时候去碰到了一堆问题如:铺流量下滑&#xff0c;或者标题修改流量降低&#xff0c;提升店铺流量办法等等很多&#xff0c;…

店铺自然流量是什么?如何提升其自然流量

我们常说&#xff0c;互联网时代流量为王。那么自然流量是什么&#xff1f;是线上的客流&#xff0c;获取流量&#xff0c;才能获取消费者&#xff1b;但自然流量不是最关键的&#xff0c;如何转化流量才是关键。本文带你分析分析自然流量及其转化问题&#xff0c;以及如何提升…

Shopee Man多店铺运营管理工具教你提升印尼Shopee本土店铺流量

现在做Shopee平台&#xff0c;提升店铺流量至关重要&#xff0c;流量在一定程度上能够决定店铺的销量&#xff0c;所以当现在有许多商家入驻东南亚地区最具潜力的电商市场印尼站时&#xff0c;就会从提升店铺流量这方面下功夫&#xff0c;那么想要提升Shopee印尼站的店铺流量&a…

Lazada Feed可行性在于提升Lazada店铺流量的工具之一

Lazada发展迅速&#xff0c;成为了跨境电商引领者之一。Lazada平台也越来越重视内容营销发展。Lazada有Feed的内容方式&#xff0c;可以助力卖家进行一个营销推广的作用&#xff0c;达到促进销量增长的效果。 Lazada Feed可以理解为淘宝的微淘&#xff0c;是卖家通过发布互动帖…

提升eBay店铺流量的方式有哪些?

对很多淘宝ebay卖家来说&#xff0c;也希望能够做好店铺的站外推广&#xff0c;但是也有很多的方式&#xff0c;我这就来给各位卖家们详细介绍一下&#xff0c;另外也要了解一下推广到底需要多久才有效果。 1、Facebook广告 Facebook广告作为全球最大的社交平台&#xff0c;自然…

成都榆熙:商家怎样提升店铺自然流量?

越来越多的商家都开始入驻拼多多&#xff0c;而盲目跟风开店是不可行的&#xff0c;多多少少都需要有一些开店经验和对拼多多的了解&#xff0c;那么如果拼多多店铺一直没有自然流量怎么办呢&#xff1f;一起来和成都榆熙小编来看看吧。 一、什么是拼多多自然流量&#xff1f;…

速卖通店铺流量下滑什么原因,如何做提升?(测评补单)

速卖通作为阿里巴巴未来国际化的重要战略产品,已成为全球最活跃的跨境电商平台之一,并依靠阿里巴巴庞大的会员基础,成为目前全球产品品类最丰富的平台之一。 近期有朋友问我&#xff0c;速卖通店铺开了几个月&#xff0c;店铺流量一直都是稳定上升状态&#xff0c;可是不知道怎…

新手店铺如何稳定提升流量? 精细化运营带你提升店铺权重

现在随着电商行业的发展,越来越多的人会选择淘宝开店,选择做无货源模式。这个模式也已经火了两三年了,做的人也很多,但是做的好的人却是寥寥无几。原因在哪?主要还是不会操作方法。所以想做好这个无货源店铺,方法很重要。 那么到底有多少人真正理解它到底是做什么的,怎…