攻防世界-Mobile-easyjava
这个题说是easyjava,但是我这个菜鸟一点也不觉得easy,花了我2个小时才做出来(我太菜了)。
首先就是下载apk,反编译出源代码,说到这里就不得不吐槽一下Android逆向助手这个工具(就是下面这个),它反编译出来的源代码竟然还少函数,导致我看了半天,总觉得少点什么,最后我用jeb反编译之后才发现,Android逆向助手反编译的结果少了一个至关重要的有一个函数调用的函数。

言归正传,打开源代码首先看 函数
然后观察参数为 类型的 方法
讯享网
好,我们继续看 方法,这个方法就有点东西了,不过没事,我来一行一行的注释,保证你们都能看懂
上面的代码中有两处实例化,现在来解释一下里面的算法,首先看 的构造方法,因为 先被调用:
讯享网
上面类 的实例化代码就是将c的前两位移到最后,运行之后,其中变量的值为
然后看类 的实例化做了什么:
上面的代码就不注释了,它和类 的功能类似,这里是将c的前3位移到最后,运行之后就是:

构造方法都看完了,我们接着上面的往下分析 方法,在实例化之后,我们可以看到如下这个循环,我们来看一下这个循环做了什么:
它将v3中的每一个字符循环传给 ,好,我们接下来就来看看这个 方法(三个参数)是何方神圣:
我们可以很明显的看到这是一个嵌套的函数调用,代码有些混淆,我也懒得去弄了,直接分析吧,我头硬。
它先调用了 我们可以看到,它将第一个参数作为参数传给第二个参数的 方法,好吧有点绕,仔细读一下,应该能读懂。
那我们就来看一下这个函数究竟干了什么,它是类 的 函数(有一个参数为String),下面就是代码,我给出详细的注释,方便大家理解。
上面这个方法返回的是一个整数值,它的返回值传递给 ,这个 方法其实就是类 中的 方法,我在代码中给出详细注释:
从上面的分析我们对于整个程序的执行流程应该是很清楚了,那么我们就从程序中判断字符串 反向推导,我用python写了一个反向推导的脚本:
最后可以得出来:
安卓逆向java基础
将得到的字符串两端加上flag{},然后就是正确答案了。
代码比较长,写的步骤很细,从 一直回推到 ,变量名也尽量和原Java代码保持一致,如果想看明白,对着源代码仔细看,理解后,应该很容易看懂。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/4153.html