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'))
