下载回来后,有两个文件
查那个内存大的就行,上边那个扔着不管就行
查壳
32位,进IDA,老套路,进主函数
int __cdecl main(int argc, const char **argv, const char **envp)
{
_BYTE v4[12]; // [esp+12h] [ebp-2Eh] BYREF
_DWORD v5[3]; // [esp+1Eh] [ebp-22h]
_BYTE v6[5]; // [esp+2Ah] [ebp-16h] BYREF
int v7; // [esp+2Fh] [ebp-11h]
int v8; // [esp+33h] [ebp-Dh]
int v9; // [esp+37h] [ebp-9h]
char v10; // [esp+3Bh] [ebp-5h]
int i; // [esp+3Ch] [ebp-4h]
__main();
qmemcpy(v4, "*F'\"N,\"(I?+@", sizeof(v4));
printf("Please input:");
scanf("%s", v6);
if ( v6[0] != 65 || v6[1] != 67 || v6[2] != 84 || v6[3] != 70 || v6[4] != 123 || v10 != 125 )
return 0;
v5[0] = v7;
v5[1] = v8;
v5[2] = v9;
for ( i = 0; i <= 11; ++i )
{
if ( v4[i] != _data_start__[*((char *)v5 + i) - 1] )
return 0;
}
printf("You are correct!");
return 0;
}
看着不是很难弄,那么问题来了,flag的输出哪里来?找了好多地方,啥也没有。只看到了v5被初始了,那么有没有可能v5里存的就是我们要找的flag的字符串呢?
能看出来,这个判断是关键,已知v4:"*F'"N,"(I?+@",那么先看看 data_start_ 里边是个啥,跟进 data_start_ :
那么问题就知道了,比较v4中的字符和data数据中的字符.找到对应字符相等的位置,也就是下标。下标就是我们的flag。(这里有个小坑,我们是要找v5里存放的值,但看伪代码,我们能知道v5-1的值才是拿来比较的字符所在下标,写脚本的时候注意这一点)
int main(){
char v[] = {'*','F','\'','\"','N',',','\"','(','I','?','+','@','\0'};
string s = "~}|{zyxwvutsrqponmlkjihgfedcba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$# !\"";
string flag = "";
for(int i = 0; i < strlen(v); i++) {
for (int j = 0; j < s.size(); j++) {
if (s[j] == v[i]) {
flag += (char)(j+1);
break;
}
}
}
cout << flag << endl;
return 0;
}