0x01 mobile1(First_Mobile)
- 提取dex
- 这里推荐使用Androidlxzs ,这个工具集成得很好,基本把Java层的逆向工具都集成了
- Dex2jar把dex文件转jar文件
jd-gui查看源码
看程序主入口onCreate方法代码逻辑,可以清晰地看到输入内容作为参数调用encode的check方法,返回true时输出current,然后再看看encode类
此处分析check逻辑可以得到一条公式((input[i]+b[i])%61)*2-i=input[i]那么我们使用爆破泡一下就行了
1 | public class XMan { |
得到flag=XMAN{LOHILMNMLKHILKHI}
0x02 mobile2(HelloSmali2)
这个真的需要一些smali语法功底zzz
- 先把所以逻辑一句一句转化成java,经过分析
check方法的逻辑是:
把输入字符串每一位字符转化为二进制字符(补0补满8位)append到一个StringBuilder,
然后从这个StringBuilder每6位二进制转化为一个整数,该整数为字符串”+/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”的索引,利用索引得到一个char,添加到另一个StringBuilder,最后得到一串字符”xsZDluYYreJDyrpDpucZCo”,再加上”!?”,最后和”xsZDluYYreJDyrpDpucZCo!?”比较,相等即返回true
怎么解?,逆过来即可 - 逆向过程
1 | public class XMan { |
0x03 mobile3(rev1)
- 提取dex
- dex转jar
该题dex2jar后分析代码,
先调用CheckClass的b方法,把所有check方法的array元素作为输入分别调用b方法,得到输出:- (1 1 1 1 1 0 0 1 1 1 5 2 0 0 3 2 3 2 3 2 0 0 3 2 3 2 3 2 3 4 )
- 再看代码return结果为b3,而能改变b3的只有case 4,而case 4需要满足b2==b为true才有b3=true,
而能改变b2的只有case 3,能改变b的只有case 2,
而每一次case 0都会对A[b2]做一次与b2的异或取值,
case 5是会把b重置为0,
而看上面的输出,5后刚刚好有7个2和7个3并且每个2后都有一个3,
case 2会对array2的第b个元素与b取异或且++ b,
case 3会比较异或后的array2[b2]和输入的this.A[b2]比较,相同就++b2,
好了,到这里,我们可以看出,每一个输入值(字符)this.A[b2]都会与异或后的array2[b2]相等且仅有7位,到最后一个4,b=7,b2=7,满足条件b3赋值true
1 | public class CheckClass |
- 该代码得到每一个调用b方法的输出值:
1 | public class XMan { |
- 执行以下代码得到flag:
1 | public class XMan { |
输出flag=XMAN{4ndr01d}
0x04 写在最后
虽说整个比赛三题mobile都没有涉及到native代码,但是很好的考验了Java代码和smali代码的逻辑分析能力,相信这是基本功,而能做好这个基本工才能说入门mobile,要不然连Java、smali代码都不懂,是不行的,pengyou!