这道题是一个逆向题,拿到题目文件是一个exe:
双击运行一下发现需要密码,所以猜测应该是找到密码就能拿到flag,或者往下进行。
把文件放入IDA里分析:
直接shift+f12查看字符串:
看到一行 "请输入密码\r\n" 双击这行,跳转到该字符串所在内存中的位置:
单击字符串“请输入密码”前方的asc_510E84
并按下键盘的X键查看程序中调用该字符串的代码位置:
双击选中行,跳转到代码界面。按F5将汇编代码翻译成伪代码:
int __cdecl main_0(int argc, const char **argv, const char **envp)
{
size_t i; // [esp+D0h] [ebp-84h]
char Str2[60]; // [esp+DCh] [ebp-78h] BYREF
char Str1[39]; // [esp+118h] [ebp-3Ch] BYREF
int v7; // [esp+13Fh] [ebp-15h]
int v8; // [esp+143h] [ebp-11h]
__int16 v9; // [esp+147h] [ebp-Dh]
char v10; // [esp+149h] [ebp-Bh]__CheckForDebuggerJustMyCode(&unk_53B006);
strcpy(Str1, "oehnr8>?;<?:9k>09;hj00o>:<o?8lh;8h9l;t");
v7 = 0;
v8 = 0;
v9 = 0;
v10 = 0;
j__memset(Str2, 0, 0x32u);
sub_45748D("请输入密码\r\n");
sub_457929(&unk_510E50, (char)Str2);
for ( i = 0; i < j__strlen(Str2); ++i )
Str2[i] ^= 9u;
if ( !j__strcmp(Str1, Str2) )
sub_45748D("right");
else
sub_45748D("error");
return 0;
}
从伪代码可以分析出,程序将输入的字符串会跟v5进行比较,相同则输出成功标志,可以看到flag就是v5字符串异或上9。
char temp[50] = { "oehnr8>?;<?:9k>09;hj00o>:<o?8lh;8h9l;t" }; for (int i = 0; i < strlen(temp); i++) { printf("%c", temp[i] ^ 9); }
利用代码进行解密:
#include<stdio.h>
#include<string.h>
int main()
{
int i = 0;
int len = 0;
char temp[50] = { "oehnr8>?;<?:9k>09;hj00o>:<o?8lh;8h9l;t" };
len = strlen(temp);
for (i = 0; i < len; i++)
{printf("%c", temp[i] ^ 9);
}
return 0;
}
运行代码得到flag: