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