LCTF (easy-100)

先安装跑一下,不知道为啥我这里模拟器打不开,传到手机上就可以。如下图。

一个输入框,一个按钮,随便输入提示no。

放入JEB反编译。

可以看到有6个Class。大体看一遍,b和e应该和解题无关,在类a中有AES字眼,那么大致思路就有了:找KEY和加密后的字符串,通过AES对称解密的机制得到正确输入。

不知道是出题人故意的还是编程习惯就是不好,每个类命名为abcd,类中的函数也命名为abcd,看代码会有点绕,耐心找一下其实还是挺简单的。

先从类d开始逆向分析,调用MainActivity中的a函数,这个a传入三个形参的a,如下图

然后接着调用两个形参的a,如下图

再调用类c中的a函数,返回的结果与后面的字符串作比较,return一个布尔值。显然这串字符串就是要找的加密后的字符串了,如果再能找到AES中的KEY此题就解决了。

查看类c中的a函数。

上来先给v0赋值,用的是arg5调用类c中a函数的返回值。如下图

这里我卡住了好一会,原因是这个参数值不知道是什么,后来在MainActicity中发现。

 

//我是做出这个题之后查了百度才知道,一个activity启动调用的第一个函数就是onCreate,它主要做这个activity启动时一些必要的初始化工作。

这个v是MainActicity的一个私有String变量,在p函数中进行了赋值,函数很容易理解,把url.png中的第144个字节开始的16长度的字节变成String后赋值给v。144=0x90,打开winhex直接查看,如下图

现在KEY和字符串都已经找到(注意KEY还要经过变化的),最后写个脚本就OK了,我是用JAVA写的,直接复制黏贴JEB中反编译的代码,十分方便。。。

 1 import java.io.IOException;
 2 import java.security.InvalidKeyException;
 3 import java.security.NoSuchAlgorithmException;
 4 import javax.crypto.BadPaddingException;
 5 import javax.crypto.Cipher;
 6 import javax.crypto.IllegalBlockSizeException;
 7 import javax.crypto.NoSuchPaddingException;
 8 import javax.crypto.spec.SecretKeySpec;
 9 
10 public class MainActivity {
11     public static void main(String[] args) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
12         StringBuilder v1 = new StringBuilder();
13         int v0_1;
14         String v0_2;
15         String arg4 = "this_is_the_key.";    //在winhex中发现
16         for(v0_1 = 0; v0_1 < arg4.length(); v0_1 += 2) {  //对KEY进行二次变换,这是有类c中的函数分析得到的
17             v1.append(arg4.charAt(v0_1 + 1));
18             v1.append(arg4.charAt(v0_1));
19         }
20         v0_2 = v1.toString();
21         byte key[] = v0_2.getBytes();     //转换成Bytes数组
22         SecretKeySpec a;
23         Cipher b;
24         a = new SecretKeySpec(key, "AES");
25         b = Cipher.getInstance("AES/ECB/PKCS5Padding");
26         byte flag[] = {21, -93, -68, -94, 86, 117, -19, -68, 
27                 -92, 33, 50, 118, 16, 13, 1, -15, -13, 3, 4, 103, -18, 81, 30, 68, 54, -93, 44, -23, 
28                 93, 98, 5, 59};
29         b.init(Cipher.DECRYPT_MODE,a);    //这里注意前面的参数,选择相应的解密参数
30         
31 //        String sflag = b.doFinal(flag).toString();   一开始我是这样写的,结果不对,必须要向下面这样转utf-8才行
32         String AES_decode=new String(b.doFinal(flag),"utf-8");
33         System.out.println(AES_decode);
34     }
35 }

猜你喜欢

转载自www.cnblogs.com/sweetbaby/p/10903159.html
100