Java层分析
将getSecret(getFlag())与getSecret(encrypt(input))进行比较
其中encrypt()
在so内,是将每个字符的ascii码减1
getSecret中为MessageDigest.getInstance("MD5")
hookdigest
方法
/**
* hook MessageDigest.digest方法
*/
private void hookDigest(XC_LoadPackage.LoadPackageParam lpparam) {
final XC_MethodHook digestHook = new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// 打印栈调用
AppGlobal.logStack();
MessageDigest messageDigest = (MessageDigest) param.thisObject;
String algorithm = messageDigest.getAlgorithm();
// 如果digest方法 含有参数,则可以打印原数据
if (param.args.length >= 1) {
// 获取加密前的数据
byte[] originData = (byte[]) param.args[0];
// 打印原始数据
AppGlobal.logOriginData(algorithm, originData);
}
// 获得加密后的数据
byte[] resultBytes = (byte[]) param.getResult();
// 打印加密后的结果
AppGlobal.logResult(algorithm, resultBytes);
// 打印日志分割线
AppGlobal.logHorizontalRule();
}
};
// 寻找MessageDigest类
Class<?> messageDigestClass = XposedHelpers.findClass("java.security.MessageDigest", lpparam.classLoader);
// 所hook的digest方法名
String digestMethod = "digest";
// hook所有方法
XposedBridge.hookAllMethods(messageDigestClass, digestMethod, digestHook);
}
得到加密前的值ek`fz@q2^x/t^fn0mF^6/^rb`qanqntfg^E`hq|
So层分析
encrypt函数,将每个字符的ascii码减1,构造成新字符串
解题脚本
ens = "ek`fz@q2^x/t^fn0mF^6/^rb`qanqntfg^E`hq|"
flag = ""
for i in ens:
flag += chr(ord(i) + 1)
print(flag)
得到flag为flag{Ar3_y0u_go1nG_70_scarborough_Fair}