查看附件为ELF文件,Linux中运行下
需要输入正确的flag
查看反编译代码
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s[24]; // [rsp+0h] [rbp-20h] BYREF
int v5; // [rsp+18h] [rbp-8h]
int i; // [rsp+1Ch] [rbp-4h]
for ( i = 0; i <= 181; ++i )
judge[i] ^= 0xCu;
printf("Please input flag:");
__isoc99_scanf("%20s", s);
v5 = strlen(s);
if ( v5 == 14 && (*(unsigned int (__fastcall **)(char *))judge)(s) ) //flag长度为14
puts("Right!");
else
puts("Wrong!");
return 0;
}
关键的judge居然是数据不是函数,应该是SMC加密,自己取自己地址的数据进行加密,加密之后无法反汇编
用IDAPython运行脚本解一下
如果脚本运行报错NameError: name 'XXX' is not defined
,可以尝试将idapython.cfg
文件中下图选项改为YES
脚本运行后
按 C 生成新汇编
选中600B00到600BB5,按P生成judge函数
此时再查看judge函数反编译代码
__int64 __fastcall judge(__int64 a1)
{
char v2[5]; // [rsp+8h] [rbp-20h] BYREF
char v3[9]; // [rsp+Dh] [rbp-1Bh] BYREF
int i; // [rsp+24h] [rbp-4h]
qmemcpy(v2, "fmcd", 4);
v2[4] = 127;
qmemcpy(v3, "k7d;V`;np", sizeof(v3));
for ( i = 0; i <= 13; ++i )
*(_BYTE *)(i + a1) ^= i; //异或处理
for ( i = 0; i <= 13; ++i )
{
if ( *(_BYTE *)(i + a1) != v2[i] )
return 0LL;
}
return 1LL;
}
简单的异或加密
Exp
s = 'fmcd\x7Fk7d;V`;np'
flag = ''
for i in range(14):
flag += chr(ord(s[i]) ^ i)
print(flag)
输出flag{n1c3_j0b}
验证一下