2016问鼎杯-4-1
拿到这道题是个压缩包,解压后得到一个app-release.apk。我们安装到安卓模拟器测试一下,发现让我们输入随机码,下面显示“您的随机码为:xxxxxx”,这个随机码变化很快,手动输入下面的随机码有点不可能,我们随便输入一个随机码点击提交后显示input is wrong。
我们用Android Killer进行逆向分析。首先查看伪代码,我们发现在onClick下有一个if判断,getText()获得我们输入的随机码然后和OneActtivity类中的valuel值进行比较,如果相等则输出flag,如果错误则输出“Input is wrong”。
我们可以直接修改If条件让它输出flag,不过先不急,我们分析一下它的flag是如何产生的。我们看到flag就是theFlag()的返回值作为getContent()的参数,然后求getContent()的hashCode,接着将hashCode转化为字符型就是flag。但是这里还有一个坑,它将flag用setTransformationMethod()进行了隐藏。
下面是getContent()和theFlag的具体功能,theFlag()获得包名,然后getContent()获得版本号后加233赋值给i,返回结果为i,也就是flag就是i的shahCode。
接下来我们进行破解,这里就是if语句对应的Dalvik汇编代码,我们直接删掉。也就是不用进行判断我们输入的随机码是否与程序生成的随机码相同直接执行输出flag的语句。
这里是setTransformationMethod()对应的Dalvik汇编代码,我们直接删掉,要不它会隐藏我们的flag。
重新编译签名后,在安卓虚拟机上运行,随便填写验证码,点击提交后我们得到flag。