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