先安装跑一下,不知道为啥我这里模拟器打不开,传到手机上就可以。如下图。
一个输入框,一个按钮,随便输入提示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 }
原文:https://www.cnblogs.com/sweetbaby/p/10903159.html