try_decrypt_me
这里我们直接将文件放入jeb中进行分析,直接找到我们的mainactivity
按下tab键,进行反汇编
进入这个DES加密函数。
肉眼可见,这里是进行了aes加密,CBC模式,用PKCS5进行填充
对于这个填充方式,我找了一个大佬写了一篇很好的文章。
关于PKCS7,PKCS5,zore的填充方式
iOS 实现对称加密多种填充方式(ANSIX923、ISO10126、Zero) - 简书 (jianshu.com)
这下,我们返回主函数分析逻辑,重点地方我将其标注出来了。
这里有个equal,在java中,这个就是一个比较函数,就是将我们加密后的密文与BxLHc1KruiH31I94W171oal+9olDzgBIjnK/J1Db0IUyi+MbI38+nw62ejCPShRB,进行比较,我们可以知道这个就是我们的密文了。
intput 就是我们输入的flag了。
这个vector2就是我们CBC的偏移量了。但是这个我们发现,偏移量调用了一个函数。
可以发现,我们的偏移量是将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进行魔改,我们可以用在线网站进行解
评论