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

原文地址:https://www.cnblogs.com/YenKoc/p/13593907.html