Android
拿到phonedump压缩包,解压后为一个Android备份文件好和一个提示文件。

使用abe.jar来恢复备份文件内容。还原出一个压缩文件backup.tar。

打开压缩包,有两个文件夹,apps和shared,其中前者包含很多app应用,后者的Download目录下下载了几个apk,在模拟器里安装测试,未见端倪。

Camera目录下有几个可疑的加密文件。

将apps目录下的所有应用翻了一遍,发现一个vdex文件,而且该应用的命名方式com.dfwgxc.zimcdwpealgy也很像恶意软件命名形式。

在ubuntu 14.04里编译vdexExtractor,编译成功后对上面的vdex文件进行反编译。

输出muquieljmg.apk_classes.dex文件。使用JEB打开

最终在PkdGTfG类下发现上述发现的可疑后缀。
可以确定应用com.dfwgxc.zimcdwpealgy就是题中涉及到的勒索软件。

其中函数faweifunhiunfg2uylbh8734gh778ghinegkrGln18hi8123(Context arg3)里将得到的imei号进行md5处理

Md5处理

上面获取到的md5编码和文件名一起作为参数,交由加密函数处理。

主要加密/sdcard及其子目录下的文件(不处理以.xxx、.salt和.iv为后缀的文件)。

加密函数核心代码

同样给出了解密函数

代码逻辑已经搞清楚了,而且imageinfo.txt已经包含了imei号。

于是尝试破解加密后的文件。
使用java对应编写解密文件DecryRan.java,代码如下
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 
 | import java.io.FileInputStream;import java.io.FileOutputStream;
 import java.math.BigInteger;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import javax.crypto.Cipher;
 import javax.crypto.SecretKeyFactory;
 import javax.crypto.spec.IvParameterSpec;
 import javax.crypto.spec.PBEKeySpec;
 import javax.crypto.spec.SecretKeySpec;
 
 public class DecryRan {
 public static void main(String args[]) throws Exception{
 Decrypt(Mmd5("867562039629283"),"C://Users//Administrator//workspace//Test//src//IMG_20180101_071505.jpg.xxx");
 System.out.println("done");
 }
 
 public static String Mmd5(String arg6) {
 MessageDigest v0 = null;
 try {
 v0 = MessageDigest.getInstance("MD5");
 }
 catch(NoSuchAlgorithmException v2) {
 v2.printStackTrace();
 }
 v0.update(arg6.getBytes(), 0, arg6.length());
 return new BigInteger(1, v0.digest()).toString(16);
 }
 
 private static void Decrypt(String key, String filename) throws Exception {
 
 FileInputStream v16 = new FileInputStream(filename.substring(0, filename.length() - 4) + ".salt");
 byte[] v17 = new byte[8];
 v16.read(v17);
 v16.close();
 FileInputStream v4 = new FileInputStream(filename.substring(0, filename.length() - 4) + ".iv");
 byte[] v11 = new byte[16];
 v4.read(v11);
 v4.close();
 SecretKeySpec v18 = new SecretKeySpec(SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret(new PBEKeySpec(key.toCharArray(), v17, 65536, 256)).getEncoded(), "AES");
 Cipher v6 = Cipher.getInstance("AES/CBC/PKCS5Padding");
 v6.init(2, v18, new IvParameterSpec(v11));
 FileInputStream v8 = new FileInputStream(filename);
 FileOutputStream v9 = new FileOutputStream(filename + ".decrypted");
 byte[] v7 = new byte[64];
 while(true) {
 int v10 = v8.read(v7);
 if(v10 == -1) {
 break;
 }
 byte[] v5 = v6.update(v7, 0, v10);
 if(v5 == null) {
 continue;
 }
 v9.write(v5);
 }
 byte[] v15 = v6.doFinal();
 if(v15 != null) {
 v9.write(v15);
 }
 v8.close();
 v9.flush();
 v9.close();
 }
 }
 
 | 
运行报出Illegal key size错误,因为密钥长度是受限制的, java运行时环境读到的是受限的policy文件. 文件位于${java_home}/jre/lib/security, 这种限制是因为美国对软件出口的控制.

解决办法:拷贝JCE无限制权限策略文件并进行替换,替换jdk目录下的jre。

| 12
 
 | javac DecryRan.javajava DecryRan
 
 | 
得到以.decrypted结尾的文件,修改后缀,得到一张图片,其中包含flag。
