[ACTF新生赛2020]easyre 1

下载回来后,有两个文件

查那个内存大的就行,上边那个扔着不管就行

查壳

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;
}

得到flag{U9X_1S_W6@T?}收工

posted @   TFOREVERY  阅读(451)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示