【crackmes.one】———— Zero4
Language: c/c++ | Arch: x86-64 | Platform: Windows |Tech: crackme,anti-debug,xor

无壳,直接打开IDA分析
作者打了反调试的标签,实际上只有一个ISDebuggerPresent

strings列表里有一些加密数据,以及提示字符串,还有更关键的Wrong password和Press enter to exit,分别对应失败和成功

main函数总体并不长,前面的输出函数是cout,下面紧接着是std::string对象的初始化
*(_OWORD *)buf = 0;
size = 0;
capacity = 15;
LOBYTE(buf[0]) = 0;
初始化的主要特征是16 字节清零 + 一个 0 + 一个 15 + 首字节 0
中间部分是关于c++虚表的内容,与本题无关
后面是获取输入的函数getline

判断依据是这几个字符串,它们是getline的特征

后面这部分是在原字符串基础上把'\r'去掉,以及检查长度是否为71个字符。
其中0xF用于判断字符串长短,用于string的短串内联、长串堆分配判定

接下来验证逻辑就一行异或运算,根据可逆性编写python脚本就可以了
\
enc = [] #enc使用lazyida提取
flag = bytes(((i * 7 + 0x5A) & 0xFF) ^ enc[i] for i in range(0x47))
print(f"flag:{flag}")
浙公网安备 33010602011771号