某安卓ctf矩阵题解题

这是题目录打开的界面。我不知道题目作者和题目的原出处,这题是去年学习安卓逆向老师在第二阶段结束时留下的7道题中的最后一道,当时家庭的一些变故,导致课程中断,这次利用三三两两的忙着抽闲的时间再捡起来看看这题。
一开始没有找到题目的解题方法,瞎猜了2下,提示如下:

并且伴随有语音:”你是个好人,但是我们不适合”。这。。。果然搞这些的也是脑洞大。
看着题目好像有些唬人,本以为是so层有逻辑,结果并没有so层的逻辑。

入口是:xyz.konso.testsrtp.MainActivity
进去看了里面是初始化一些语音设备什么的,开始没有注意到里面的background对象,便通过搜索关键字”你根本不知道什么叫做爱”,定位到关键字所在类,发现就是这个background,在onTouch方法里面。

如图可以看到在调用check方法的时候如果返回假,则会提示:”你根本不知道什么叫做爱”,并且伴随语音:”你是个好人,但是我们不适合”,从图中可以看到先语音,后文子提示,但是实际上app里面是文字先提示的,语音滞后了,应该是异步的,语音加载可能时间长一些。
返回真的话则提示:”通过爱的验证”。因此check方法是关键方法

不好截图,干脆copy出来,如下:
public boolean check(){ int vi = 1; if (this.matrix[vi][vi].getStatus() == vi && this.matrix[vi][2].getStatus() == vi && this.matrix[vi][7].getStatus() == vi && this.matrix[vi][8].getStatus() == vi && this.matrix[2][0].getStatus() == vi && this.matrix[2][3].getStatus() == vi && this.matrix[2][6].getStatus() == vi && this.matrix[2][9].getStatus() == vi && this.matrix[3][0].getStatus() == vi && this.matrix[3][4].getStatus() == vi && this.matrix[3][5].getStatus() == vi && this.matrix[3][9].getStatus() == vi && this.matrix[4][0].getStatus() == vi && this.matrix[4][9].getStatus() == vi && this.matrix[5][vi].getStatus() == vi && this.matrix[5][8].getStatus() == vi && this.matrix[6][2].getStatus() == vi && this.matrix[6][7].getStatus() == vi && this.matrix[7][3].getStatus() == vi) { int iStatus = this.matrix[7][6].getStatus(); if (iStatus == vi && this.matrix[8][4].getStatus() == vi && this.matrix[8][5].getStatus() == vi) { label_0127 : return vi; } } boolean vb = false; goto label_0127 ; }
可以看出是在取二维数组中的某些元素看看是否等于1,1即鼠标点击了白色背景的圆点后的值,点击了后其值就被赋值1,最开始的白色背景的圆点初始值都是0,其实那个界面就是个矩阵,10*10的矩阵。这个矩阵是在background类的构造方法中初始化的:

background构造方法调用initGame方法,initGame方法就是初始化矩阵的,如下

初始值都是0,知道这些之后就不难了,自己写一下这个矩阵,并根据check方法里的条件填充一下,看看最终填充好的图案是什么样的
public class Ctf7 { public static void main(String []args) { int[][] arr=new int [10][10]; int j; int i = 0; System.out.println("=========== 矩阵初始化:============"); while (i < 10) { for (j = 0; j < 10; j++) { arr[i][j] = 0; System.out.print(arr[i][j] + "\t"); if(j==9)System.out.print("\n"); } i++; } arr[1][1] = 1; arr[1][2] = 1; arr[1][7] = 1; arr[1][8] = 1; arr[2][0] = 1; arr[2][3] = 1; arr[2][6] = 1; arr[2][9] = 1; arr[3][0] = 1; arr[3][4] = 1; arr[3][5] = 1; arr[3][9] = 1; arr[4][0] = 1; arr[4][9] = 1; arr[5][1] = 1; arr[5][8] = 1; arr[6][2] = 1; arr[6][7] = 1; arr[7][3] = 1; arr[7][6] = 1; arr[8][4] = 1; arr[8][5] = 1; i = 0; j = 0; System.out.println("=========== 填充后如下:============"); while (i < 10) { for (j = 0; j < 10; j++) { System.out.print(arr[i][j] + "\t"); if(j==9)System.out.print("\n"); } i++; } } }
运行结果如下:

去掉0,就是一个爱心形状:

照着这个格式,在app界面点亮响应的按钮

最后点击上面的皇帝图像检查验证结果,如下

至此题目已解。