(非官方解,以下内容均互联网收集的信息和个人思路,仅供学习参考)
CrypticConundrum
使用 UPX 脱壳
主要逻辑如上,输入的明文经过 mix 和 Encryption 两个函数进行变换,然后与预期flag的密文进行比较
mix 函数的主要功能是对输入参数a1和a2进行变换操作,最终将结果存储在字符串a1中,并返回a1字符串指针
在 Encryption 函数中,会先调用 NewEncryption 函数对输入字符串进行加密处理,然后执行剩余的加密部分
通过动调拿到密文和Key后根据加密函数编写脚本解密即可
里Encryption实际上只使用到了v7的前四位作为加密参数,而密文是从v7[4]开始
从 0x53 开始提取即可
#include <stdio.h> #include <stdlib.h> void decryption(char *enc, char *key, int a3) { char v3; // [rsp+2Bh] [rbp-15h] int n; // [rsp+2Ch] [rbp-14h] int m; // [rsp+30h] [rbp-10h] int k; // [rsp+34h] [rbp-Ch] int j; // [rsp+38h] [rbp-8h] int i; // [rsp+3Ch] [rbp-4h] for (n = 0; n < a3; ++n) enc[n] -= 10; for (m = 0; m <= a3 - 2; ++m) enc[m] += enc[m + 1]; for (k = 0; k < a3 - 1; ++k) enc[k] ^= key[2]; for (j = 0; j < a3; j += 2) enc[j] ^= key[j % 4]; for (j = 0; j < a3 / 2; ++j) { v3 = enc[j]; enc[j] = enc[a3 - j - 1]; enc[a3 - j - 1] = v3; } for (i = 0; i < a3 / 2; ++i) { v3 = enc[i]; enc[i] = enc[a3 - i - 1]; enc[a3 - i - 1] = v3; } for (i = 0; i < a3; ++i) enc[i] += key[i % 4]; } int main() { char key[] = "ISCC"; |
unsigned char enc[] = {0x53, 0xCB, 0x8C, 0x88, 0xCF, 0x7D, 0xEB, 0x40, 0x39, 0xF4, 0xCE, 0x2A, 0x3F, 0xC3, 0x95, 0x8D, 0xD6, 0x77, 0xE7, 0x0E, 0x49, 0xE0, 0x85, 0x8E, 0xF4, 0x34 }; decryption((char *)enc, key, 26); puts((char *)enc); } |