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、反转、加减运算可逆混合加密结构。
阅读全文