XCTF

XCTF,第1张

XCTF

题目信息,一个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。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5438179.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-11
下一篇2022-12-11

发表评论

登录后才能评论

评论列表(0条)

    保存