某安卓ctf矩阵题解题

%title插图%num

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

一开始没有找到题目的解题方法,瞎猜了2下,提示如下:

%title插图%num

并且伴随有语音:”你是个好人,但是我们不适合”。这。。。果然搞这些的也是脑洞大。

看着题目好像有些唬人,本以为是so层有逻辑,结果并没有so层的逻辑。

%title插图%num

入口是:xyz.konso.testsrtp.MainActivity

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

%title插图%num

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

返回真的话则提示:”通过爱的验证”。因此check方法是关键方法

%title插图%num

不好截图,干脆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类的构造方法中初始化的:

%title插图%num

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

%title插图%num

初始值都是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++;
        }
    }
}

运行结果如下:

%title插图%num

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

%title插图%num

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

%title插图%num

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

%title插图%num

至此题目已解。

发表回复