首先,下载附件.re后缀的文件?照常看一下文件格式
运行一下试试
IDA打开,直奔Main函数,F5看伪代码
__int64 __fastcall main(int a1, char **a2, char **a3)
{
__int64 result; // rax
char s[264]; // [rsp+0h] [rbp-110h] BYREF
unsigned __int64 v5; // [rsp+108h] [rbp-8h]
v5 = __readfsqword(0x28u);
printf("Enter the password: ");
if ( !fgets(s, 255, stdin) )
return 0LL;
if ( (unsigned int)sub_4006FD(s) )
{
puts("Incorrect password!");
result = 1LL;
}
else
{
puts("Nice!");
result = 0LL;
}
return result;
}
代码很简单,接受我们的输入,然后传给一个叫sub_4006FD的函数校验,然后根据函数返回的内容选择输出Incorrect password!还是Nice
进去看一眼sub_4006FD这个函数
__int64 __fastcall sub_4006FD(__int64 a1)
{
int i; // [rsp+14h] [rbp-24h]
__int64 v3[4]; // [rsp+18h] [rbp-20h]
v3[0] = (__int64)"Dufhbmf";
v3[1] = (__int64)"pG`imos";
v3[2] = (__int64)"ewUglpt";
for ( i = 0; i <= 11; ++i )
{
if ( *(char *)(v3[i % 3] + 2 * (i / 3)) - *(char *)(i + a1) != 1 )
return 1LL;
}
return 0LL;
}
如果返回1LL则为真,会执行if里的Incorrect password!,所以我们的目标是不进if
所以不等于就是要等于,简单做个对这个算式做个变换
res = ""
word = ["Dufhbmf", "pG`imos", "ewUglpt"]
for i in range(12):
res += chr(ord(word[i % 3][2 * (i // 3)]) - 1)
print(res)
"""output
Code_Talkers
"""
得到flag:Code_Talkers