二木 王者

try_decrypt_me

这里我们直接将文件放入jeb中进行分析,直接找到我们的mainactivity

Untitled

按下tab键,进行反汇编

Untitled

进入这个DES加密函数。

Untitled

肉眼可见,这里是进行了aes加密,CBC模式,用PKCS5进行填充

对于这个填充方式,我找了一个大佬写了一篇很好的文章。

关于PKCS7,PKCS5,zore的填充方式

iOS 实现对称加密多种填充方式(ANSIX923、ISO10126、Zero) - 简书 (jianshu.com)

这下,我们返回主函数分析逻辑,重点地方我将其标注出来了。

Untitled

这里有个equal,在java中,这个就是一个比较函数,就是将我们加密后的密文与BxLHc1KruiH31I94W171oal+9olDzgBIjnK/J1Db0IUyi+MbI38+nw62ejCPShRB,进行比较,我们可以知道这个就是我们的密文了。

intput 就是我们输入的flag了。

这个vector2就是我们CBC的偏移量了。但是这个我们发现,偏移量调用了一个函数。

Untitled

可以发现,我们的偏移量是将reversehavemagic 用md5进行加密后的数据。

对此,我们进行md5加密即可得出我们的偏移量,但是这里有个问题。

去网上搜解密时,我们可以发现,md5有16位大,小写,和32位大,小写,我们应该怎么选勒?两种,一个是挨个挨个的试,另外一个,通过它的加密进行判断。

对于MD5加密,下面用JAVA写md5的加密函数,我们只需要对其进行对照即可,判断出来为32位小写。

/**
 * 将字符串转换为MD5
 */
 public class ParseMD5 {
 	public static String parseStrToMd5L32(String str) {
 		// 将字符串转换为32位小写MD5 
 		String reStr = null;
 		try {
 			MessageDigest md5 = MessageDigest.getInstance("MD5");
 			byte[] bytes = md5.digest(str.getBytes());
 			StringBuffer stringBuffer = new StringBuffer();
 			for (byte b : bytes) {
 				int bt = b&0xff;
 				if (bt < 16) {
 					stringBuffer.append(0);
 				}
 				stringBuffer.append(Integer.toHexString(bt));
 			}
 			reStr = stringBuffer.toString();
 		} catch (NoSuchAlgorithmException e) {
 			e.printStackTrace();
 		}
 		return reStr;
 	}

	// 将字符串转换为32位大写的MD5
	public static String parseStrToMd5U32(String str) {
		String reStr = parseStrToMd5L32(str);
		if (reStr != null) {
			reStr = reStr.toUpperCase();
		}
		return resStr;
	}

	// 将字符串转换为16位小写的MD5
	public static String parseStrToMd5L16(String str) {
		String reStr = paseStrToMd5L32(str);
		if (reStr != null) {
			reStr = reStr.subString(8, 24);
		}
		return reStr;
	}

	// 将字符串转换为16位大写的MD5
	public static String parseStrToMd5U16(String str) {
		String reStr = parseStrToMd5L32(str);
		if (reStr != null) {
			reStr = reStr.toUpperCase().subString(8, 24);
		}
		return reStr;
	}
 }

这里,万事俱备只欠东风,将我们得出的数据进行解密即可,由于本题未对AES进行魔改,我们可以用在线网站进行解

Untitled

 评论