黑客精神

题目来源: 暂无

题目描述:

 

 

进入程序,发现程序的逻辑是点击按钮,如果当前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}

posted @ 2021-08-24 14:12  hktk1643  阅读(43)  评论(0编辑  收藏  举报