faze
依然还是老规矩,先查壳
用 Die ,进行查壳
无壳,64位,放到 IDA 里,看主函数
可以看到 flag 就存储在 V9 里
if ( (unsigned __int8)std::operator==<char>(v8, v9) )
处下断点
本地动调一下看到 flag
这道好像和校赛的一道re题一样,也是动调就出 flag 的
greeting
先查看是否有壳
引用了 PDB 调试符号文件,无壳 64位,IDA 打开,先看主函数
根据主函数,定位:sub_140001220 函数
分析 sub_140001220 函数,可以看到:xmmword_14001B390
获取地址:0x014001B390 ,读取 16 字节加密数据
用 0x5a + i 的值与字节进行异或
Exp:
from ida_bytes import * # 🐍 IDA Python API:读取二进制字节
# 🎯 从指定地址读取 16 字节加密数据
encoded_bytes = list(get_bytes(0x014001B390, 16))
# 🔄 定义循环右移函数(8 位)
def rotate_right8(byte_val, shift):
"""
🌪️ 对单字节进行 8 位循环右移
:param byte_val: 原始字节值(0–255)
:param shift: 移动位数
"""
byte_val &= 0xFF
shift %= 8
return ((byte_val >> shift) | (byte_val << (8 - shift))) & 0xFF
# 🗝️ 解密主循环:先 ROR,再 XOR (key 0x5A + 索引)
for idx in range(len(encoded_bytes)):
# 🚀 ROR:根据当前位置 idx % 5 决定移位
encoded_bytes[idx] = rotate_right8(encoded_bytes[idx], idx % 5)
# 🔑 XOR:与 (0x5A + idx) 异或
encoded_bytes[idx] ^= (0x5A + idx)
# 🥳 将解密后的字节列表转换为字符串并打印
plaintext = "".join(map(chr, encoded_bytes))
print("🔓 解密结果:", plaintext)