intro
第一节:题目
用IDA的来
第二节:过程
IDA里反编译main
__int64 __fastcall main(int a1, char **a2, char **a3)
{
char v3; // r14
__int64 i; // rdx
char v5; // di
bool v6; // zf
const char *v7; // rdi
_BYTE v9[88]; // [rsp+0h] [rbp-58h] BYREF
memset(v9, 0, 65);
puts(s: "Input your flag: ");
v3 = 0;
read(fd: 0, buf: v9, nbytes: 0x41u);
for ( i = 0; i != 65; ++i )
{
v5 = aCtf2026[i & 7] ^ v9[i];
v6 = v5 == byte_2010[i];
v9[i] = v5;
v3 |= !v6;
}
v7 = "Correct";
if ( (v3 & 1) != 0 )
v7 = "Wrong";
puts(s: v7);
return 0;
}
分析伪代码
输入 65 字节

IDA里shift+F12搜CTF 点B?ctf2026到.rodata 发现aCtf2026 是密钥 ?ctf2026
每个字节先异或 key[i % 8],其中 key 是 "?ctf2026" 就在这上面
异或结果与 0x2010 起 65 字节的目标串比较
如果全对了那就回correct
那很简单了我们只要把65个字节直接反解了就是flag了
脚本和intro放在同一目录运行即可
data = open(r'intro', 'rb').read()
tgt = data[0x2010:0x2010 + 65]
key = data[0x2051:0x2051 + 8]
flag = bytes(t ^ key[i % 8] for i, t in enumerate(tgt))
print(flag.decode())
最终flagflag{51mp13_x0r_cr4ck3d_61371f68aaaee5251e8b3e6cf877fe92b32e6286}