首页 > 其他分享 >Android逆向题解-攻防世界-Ph0en1x-100

Android逆向题解-攻防世界-Ph0en1x-100

时间:2024-08-20 15:54:20浏览次数:16  
标签:Ph0en1x encrypt getFlag 题解 char v4 getSecret a1 Android

jeb反编译apk

主要代码是if 那个判断,getFlag取字符串用getSecret加密,和输入字符串encrypt加密后再getSecret加密,进行比较,两边同样都是getSecret加密,那比较可以简化成this.getFlag() == this.encrypt(s) 。
也就是输入字符经过encrypt加密后等于getFlag的字符串即可。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(0x7F040019);  // layout:activity_main
        this.etFlag = (EditText)this.findViewById(0x7F0C004F);  // id:flag_edit
    }

    public void onGoClick(View v) {
        String s = this.etFlag.getText().toString();
        **if(this.getSecret(this.getFlag()).equals(this.getSecret(this.encrypt(s)))) {**
            Toast.makeText(this, "Success", 1).show();
            return;
        }

        Toast.makeText(this, "Failed", 1).show();
    }

Hook获取getFlag返回值

直接上objection 获取到getFlag的返回值:ekfz@q2^x/t^fn0mF^6/^rbqanqntfg^E`hq|

(agent) [360023] Return Value: ekfz@q2^x/t^fn0mF^6/^rbqanqntfg^E`hq|

ida分析so

ida看下encrypt 的实现。
循环遍历字符串。每个字符-1;

jstring __fastcall Java_com_ph0en1x_android_1crackme_MainActivity_encrypt(JNIEnv *a1, jobject a2, jstring a3)
{
  const char *v4; // r4
  const char *i; // r5

  v4 = (*a1)->GetStringUTFChars(a1, a3, 0);
  for ( i = v4; i - v4 < strlen(v4); ++i )
    --*i;
  return (*a1)->NewStringUTF(a1, v4);
}

算法还原

循环遍历字符串ekfz@q2^x/t^fn0mF^6/^rbqanqntfg^E`hq|,每个字符+1;

    public static void main(String[] args) {
        String aa = "ek`fz@q2^x/t^fn0mF^6/^rb`qanqntfg^E`hq|";
        char[] chars = new char[aa.length()];
        for (int i = 0; i < aa.length(); i++) {
            chars[i] = (char) (aa.charAt(i) + 1);
        }
        System.out.println(chars);
    }

得到flag:
在这里插入图片描述

标签:Ph0en1x,encrypt,getFlag,题解,char,v4,getSecret,a1,Android
From: https://blog.csdn.net/u013170888/article/details/141359302

相关文章

  • ABC077D / ARC084B Small Multiple 题解
    AtCoderLuogu考虑数位和的来源:从\(1\)开始进行若干次\(\times10\)和\(+1\)操作可以得到任意正整数,此时\(+1\)操作的次数为其数字和。注意不能连续进行\(10\)次及以上\(+1\)操作。不难列出转移,设\(f(i)\)表示\(i\)的数字和,则:\(f(10i)=f(i)\)\(f(i+1)=......
  • Android about event log
    EventLogTags.logtags,它是个日志工具,很多模块有该文件.eventlog在framework层常常使用,通过类似EventLog.writeEvent()写log,这种log被保存在/system/etc/event-log-tags../frameworks/base/services/core/java/com/android/server/wm/EventLogTags.logtagswm_set_resumed_......
  • [AtCoder - tdpc_game] :ゲーム 题解
    [AtCoder-tdpc_game]:ゲーム题解一道小清新\(dp\)题。定义\(dp_{i,j}\)为第一堆山还有\(i\)个物品,第二堆山还有\(j\)个物品,すぬけ君能取得物品的最大价值。由于只能取两座山最上面的物品,假设当前两座山分别有\({x,y}\)个物品,すぬけ君选后只能有两种情况,分别为\(d......
  • 题解:P10279 [USACO24OPEN] The 'Winning' Gene S
    思路建议升蓝。算法一考虑暴力。我们先枚举\(K,L\),考虑如何求解。直接枚举每一个\(K\)-mer,再枚举里面的每一个长度为\(L\)的子串,找到最大的子串并在起始部分打一个标记。最后直接看有几个地方被打标记就行。时间复杂度:\(O(n^4)\)。预计能过测试点\(1-4\)。算法二我们......
  • Android 10.0 Launcher3从首页开始安装app功能实现
    1.前言 在10.0的系统rom定制化开发中,在进行Launcher3的某些功能开发实现过程中,在某些项目中,安装的app比较多,要求在launcher3的首页开始安装app应用,接下来就需要分析下app安装图标排序的流程,然后在实现相关的功能2.Launcher3从首页开始安装app功能实现的核心类packages/a......
  • [题解]P4052 [JSOI2007] 文本生成器
    P4052[JSOI2007]文本生成器正难则反,我们发现用总字符串个数\(26^m\),减去不可读的字符串个数,就是答案。要使一个字符串不可读,就不能让任何模式串在其中出现。如果某个主串的第\(i\)位与自动机的节点\(j\)相匹配,那么如果状态\(j\)包含模式串(即有一个前缀是一个模式串),那么不管主......
  • 关系代数、函数依赖、Armstrong公理及软考试题解析
    注:本文面向于软考高级—系统架构设计师,具体来说是数据库部分,知识点偏零碎化。想要系统学习数据库原理的,可考虑去看《数据库原理》,清华大学出版社或其他出版社皆可。概述概念关系,就是二维表。特性:列不可分性:关系中每一列都是不可再分的属性,即不能出现如下复合属性行列无序性:......
  • P1543 [POI2004] SZP 题解
    P1543[POI2004]SZP题解传送门。题目简述有\(n\)个人,每个人都会监视另一个人,要求选出尽可能多的同学,使得选出的每一名同学都必定会被监视到。且选出的同学不可再监视其他人。思路简述因为任意一个人只能被另一个人管,那么就想到,如果没人管的同学就不能被选(不被监视)。若某......
  • 题解:[TJOI2018] 游园会
    所谓dp套dp,实际上就是在说求解一个dp的过程中,我们用另一个dp求解出他应该从某个状态转移到另一个状态。考虑一下这道题,首先求LCS的dp如下:\[dp_{i,j}=\max\{dp_{i-1,j},dp_{i,j-1},dp_{i-1,j-1}+[s_i==t_j]\}\]显然,当\(i\)固定的时候,\(dp_{i,j}\)是单调不降的,且相邻两......
  • Android UsbDeviceManager 代码分析
    USBDeviceManager是一个Android系统中用于管理USB设备的类,它是系统服务之一。其主要功能是控制USB设备的连接和断开,以及管理USB设备的权限和状态。下面是对USBDeviceManager代码的简要分析:USBDeviceManager的构造函数:在USBDeviceManager的构造函数中,它会调用系统服务框架的regis......