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

  • 相关阅读:
    vue官方实例-组件
    数据处理-js
    图片大于div时的居中显示
    angularjs select通过动态加载option有空白项的处理方法-
    背景图片自适应div
    input-text
    input-number-required
    input-number-not-required
    null与undefined的区别?
    是true还是false呢?
  • 原文地址:https://www.cnblogs.com/YenKoc/p/13593907.html
Copyright © 2011-2022 走看看