
题目信息,一个apk,一句提示。
提示信息为:flag格式为flag{}
首先下载apk
毕竟是第一题,应该不会多难,直接静态分析应该可以。
看smali代码没有看java代码痛快,还是决定反编译为jar包来看。
修改apk后缀名为zip,解压:
结构很简单,我们使用dex2jar将dex文件反编译为jar文件:
然后就可以使用jd-gui查看java代码了。jar包中有多个类,我们直接看MainActivity类的构造函数:
构造函数中,看到“验证通过”“验证失败”两个字符串,且分别在以if判断的两个分支中,所以重点是这个if判断。
if判断的条件为cyberpease.CheckString函数的返回值,该函数的参数为一个控件的文本:
搜索这个控件的ID,为editText,猜测这里的参数应该就是我们输入的字符串
查看cyberpease.CheckString函数代码,发现在jar包中该函数体为NULL。但函数名中出现了一个关键字:native。说明这是个native函数。
我们到apk解压后的目录下的lib目录内找cyberpeace库文件,可以看到有四个指令集的版本
分析任何一个版本的都可以,这里我们分析x86版本的cyberpeace库:
用IDA打开,从函数列表中可以看到我们要找的函数CheckString
在IDA中对这个函数的代码进行反编译
代码整个流程为:通过两循环对输入的字符串进行变形,然后通过strcmp与字符串“f72c5a36569418a20907b55be5bf95ad”进行比较。
最终字符为32个字符,猜测输入字符串也为32个字符。
第一个循环将前16个字符和后16个字符调换顺序。
第二个循环遍历32个字符,以两个字符为单位,调换两个字符的顺序。
这两个变换都是可逆的,为了得到输入字符串,我们对最终的结果字符串执行逆变换:
首先针对第二个循环,将最终的字符串以两个字符为单位,调换两个字符的顺序:
f72c5a36569418a20907b55be5bf95ad --> 7fc2a5636549812a90705bb55efb59da
然后针对第一个循环,将前16个字符和后16个字符调换顺序:
7fc2a5636549812a90705bb55efb59da --> 90705bb55efb59da7fc2a5636549812a
根据题目的提示,flag格式为:flag{}。即可得到最终结果。
欢迎关注我的微博:大雄_RE。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)