iscc的re题解是什么?

摘要:1.迷失之门 这个是一个64位的文件,我们拖进ida里面进行分析 main函数 在main函数里面 能够看到它的一个条件 这代表着flag长度<=27,0x1b=27 接着我们点击更重要的check函数,看看里面是什么
1.迷失之门 这个是一个64位的文件,我们拖进ida里面进行分析 main函数 在main函数里面 能够看到它的一个条件 这代表着flag长度<=27,0x1b=27 接着我们点击更重要的check函数,看看里面是什么 程序定义了三组字符表(大写、小写、特殊字符)以及一组密钥字符串。 输入字符与密钥逐位相减得到偏移值,再根据偏移范围映射到不同字符表中, 构成一种分段替换加密算法。 for ( i = 0; i < v23; ++i ) { if ( a1[i] != 127 && a1[i] > 32 ) { if ( a1[i] - v3[i] <= 0 ) { std::operator<<<std::char_traits<char>>(refptr__ZSt4cout, "flag is wrong"); } else { v22 = a1[i] - v3[i]; if ( v22 > 25 ) { if ( v22 > 51 ) v1 = *((_BYTE *)&v4[-13] + v22); else v1 = *((_BYTE *)&v10[-6] + v22 - 2); a1[i] = v1; } else { a1[i] = *((_BYTE *)v16 + v22); } } 👉 逐字符:减 key → 得到偏移 → 查表替换 加密过程如下: 输入字符与密钥字符逐位相减得到偏移值v22 根据v22范围分别映射到大写字母表、小写字母表或特殊字符表 最终得到加密后的字符串,与check_2中的固定值进行比较 然后我们点开check2 check_2函数对加密后的结果进行逐字节比较, 本质等价于对输入字符串与固定常量进行memcmp操作, 若完全一致则输出flag成功信息。 借助某位大佬的神秘力量 python flag = [70, 83, 66, 66, 104, 75, 104, 122, 73, 79, 118, 109, 105, 66, 69, 81, 80, 106, 70, 108, 67, 84, 81, 111, 115, 66, 54] v16 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' v10 = 'abcdefghijklmnopqrstuvwxyz' v4 = '0123456789+/-=!#&()?;:^%' v3 = 'DABBZXQESVFRWNGTHYJUMKIOLPC' a = 0 循环遍历所有可能的字符 for i in range(27): for j in range(127): if j > 32: # 这里应该是你计算 a 的逻辑 ​ # 如果匹配,打印字符j # 检查是否匹配 if a == chr(flag[i]): print(chr(j), end='') break CrypticConundrum 用die查壳查出来是upx壳,给他脱壳 mix(v5, Str, v10); Encryption(v5, v7, v10); for (i = 0; i < v10; ++i) { if (v5[i] != *((_BYTE *)v8 + i)) 下面还有一个mix,这个是主要内容 input ↓ mix(扰乱结构) ↓ Encryption(核心加密) ↓ 与 v8 比较 程序对输入进行两层处理,首先通过mix函数进行结构扰乱, 随后通过Encryption函数进行核心加密,最终与预存的v8密文逐字节比较验证正确性。 我们需要点进encrption里面看一下程序 a1[j] ^= a2[j % 4]; a1[k] ^= a2[2]; 这说明函数用了xor 该加密算法并非标准加密体系,而是由XOR、反转、加减运算可逆混合加密结构。 该加密函数对输入字符串依次执行: 数组整体翻转 偶数位按 a2[j%4] 进行异或 前 n-1 位与 a2[2] 异或 从后向前进行差分变换 a[i] -= a[i+1] 每个字节统一 +10 ✔ 逆向流程: 从后往前恢复: 所有字节 -10 逆差分恢复:从前向后累加 XOR a2[2] 偶数位 XOR a2[j%4] reverse 数组 那就可以写出来脚本了 from Crypto.Util.number import * 定义一个长整数转换为字节列表的函数 def long_to_bytes_list(value): return list(long_to_bytes(value)) 定义一个反转字节列表的函数 def reverse_bytes_list(data): return data[::-1] 定义一个函数,用于将字节列表转换为长整数 def bytes_list_to_long(data): return bytes(data).long_to_bytes() 定义原始的字节列表 v9 = long_to_bytes_list(0x34CEC15170DCD96071BDAB96DF05CD3334C3B26156F661B3A47A) 定义一个字符串,用于后续操作 iscc = 'ISCC' 遍历v9列表,对应Encryption中的每个加10操作 for i in range(len(v9)): v9[i] = v9[i] - 10 v9[i] = v9[i] & 0xff 遍历v9列表,对应Encryption中减后一项的操作 for i in range(len(v9) - 1): v9[i] = v9[i] + v9[i + 1] v9[i] = v9[i] & 0xff 遍历v9列表,对应Encryption中异或'C'的操作 for i in range(len(v9)): v9[i] = v9[i] ^ ord('C') 遍历v9列表,对应Encryption中偶数位置异或'ISCC'的操作 for i in range(0, len(v9), 2): v9[i] = v9[i] ^ ord(iscc[i % 4]) 遍历v9列表,对应newEncryption中的操作 for i in range(len(v9)): v9[i] = v9[i] + ord(iscc[i % 4]) v9[i] = v9[i] & 0xff 打印转换后的字符串 print(bytes_list_to_long(v9).decode(errors='ignore'))