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{}括号中

  • 相关阅读:
    POJ 3672 水题......
    POJ 3279 枚举?
    STL
    241. Different Ways to Add Parentheses
    282. Expression Add Operators
    169. Majority Element
    Weekly Contest 121
    927. Three Equal Parts
    910. Smallest Range II
    921. Minimum Add to Make Parentheses Valid
  • 原文地址:https://www.cnblogs.com/YenKoc/p/13593907.html
Copyright © 2011-2022 走看看