zoukankan      html  css  js  c++  java
  • XCTF_Android 黑客精神

    一.概述

    这题感觉要懂一些开发的东西才能弄,正向和逆向是永远离不开的

    二.先用jeb打开,找到AndroidMainfest这个文件,找到启动的主活动是啥

     虽然一般也是就是MainActiivity,不过确实一下也挺好的,发现就是这个活动,我们跟进去看看

    三.跟进MainActivity

     先看这个onCreate方法,毕竟启动这个活动是先调用这个方法的。

    然后发现有个Myapp.m的字段,是用来是否注册的东西,这波讲道理有点意思

    这个默认是初始化为0的,毕竟你什么都没输入能注册的了吗。。。

    接下来才是重点。

     

     这里给按钮设置了一个点击事件,由于上面已经知道是默认为0了,所以看if就够了,再跟进去

     设置了一个隐式的intent对象,startActivity之后,启动这个活动

     这里又调用了一个方法出来getApplication方法返回一个对象再调用一个saveSn()方法来验证注册码的,点击那个方法,跟进去

     System.loadLibrary是动态加载so文件的方法,原理就是先将so文件下载到本地之后,再复制到对应安装包的路径下,这步比较关键

    然后就是native都是so文件中的函数,不过是过jni来调用,发现这个流程是先调用initSN()方法,再调用这个东西,saveSn()方法

    这里就需要找so文件中的东西了,ida安排

    这里讲道理挺懵的,毕竟ndk的玩意没接触过,动态加载要找JNI_ONload方法,找它的动态注册表

    找它的注册表

     

     这里其实已经很明显了,n1 -》initSN,n2-》saveSN,n3->work

    先看n1

     这里其实就是从/sdcard/reg.dat中取出字符串,和那个E开头的判断是否相等,并改变v8的值,这里v8的值其实挺关键的,后面就会知道

    接下来看n2

     这里就是对注册码一波处理,其实就是对每个字符异或一个值,这里挺好逆的。将加密后的结果存入那个文件中

    接下来n3

     发现getValue()方法取出了一个值,用来判断的,说明要为1时就对了,而且还调用了n1一次,不就是前面处理后的结果和E开头的字符串比较吗

    直接写算法逆回去就结束了

    a="EoPAoY62@ElRD"
    b="W3_arE_whO_we_ARE"
    v10=0
    v9=2016
    flag=""
    for i in range(len(a)):
        if v10%3==1:
            v9=(v9+5)%16
            v11=b[v9+1]
        elif v10%3==2:
            v9=(v9+7)%15
            v11=b[v9+2]
        else :
            v9=(v9+3)%13
            v11=b[v9+3]
        flag+=chr((ord(a[v10])^ord(v11)&0xff))
        v10+=1
    
    print(flag)

    记得加入xman{}括号中

  • 相关阅读:
    洛谷 P1508 Likecloud-吃、吃、吃
    Codevs 1158 尼克的任务
    2017.10.6 国庆清北 D6T2 同余方程组
    2017.10.6 国庆清北 D6T1 排序
    2017.10.3 国庆清北 D3T3 解迷游戏
    2017.10.3 国庆清北 D3T2 公交车
    2017.10.3 国庆清北 D3T1 括号序列
    2017.10.4 国庆清北 D4T1 财富
    2017.10.7 国庆清北 D7T2 第k大区间
    2017.10.7 国庆清北 D7T1 计数
  • 原文地址:https://www.cnblogs.com/YenKoc/p/13593907.html
Copyright © 2011-2022 走看看