黑客精神
题目来源: 暂无
题目描述:无
进入程序,发现程序的逻辑是点击按钮,如果当前MyApp中的m为0,即未注册时,会进入doRegister,m为1,即已注册时,会进入MyApp里的work
doRegister会弹出一个窗口,然后跳转到RegActivity中
RegActivity会把输入调用MyApp中的saveSN进行处理
之后分析MyApp,发现initSN,saveSN,work都在myjni库中
用IDA分析libmyjni.so
发现找不到这三个同名函数,其实是运用了动态加载
首先找到加载函数JNI_OnLoad,找到g_env,双击向上找,data区里能看到这样的东西(图中是改完名称之后的)
能清楚的看出那几个函数实际上是哪些函数,将名字改过来即可
然后回到JNI_OnLoad,将g_env类型改回JNIEnv *,发现
加载时会调用off_5004这个函数,也就是initSN
因此查看initSN
它的逻辑是,尝试打开/sdcard/reg.dat,如果打开失败(即文件不存在),会调用setValue将m改为0,setValue如下
也就是将MyApp中的m这个int改为a2这个值
继续分析initSN
如果reg.dat内的内容为EoPAoY62@ElRD,则将m改为1即注册成功,否则改为0
因此我们的目的应该是将reg.dat的内容置为EoPAoY62@ElRD
查看如果注册成功后的会被调用的work函数
发现如果m=1会告诉我们"输入即是flag,格式为xman{……}!"
因此看看输入是什么时候会让reg.dat内容为EoPAoY62@ElRD
查看saveSN
发现是将输入进行一个异或处理
由于流程是固定的,只要长度相等,每次对应位置就会和固定的异或值进行异或,因此可以考虑写脚本,或者直接输入EoPAoY62@ElRD,然后查看reg.dat,里面就会是正常应该要输入的内容,得到flag
xman{201608Am!2333}