下载回来后,有两个文件

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

32位,进IDA,老套路,进主函数
| int __cdecl main(int argc, const char **argv, const char **envp) |
| { |
| _BYTE v4[12]; |
| _DWORD v5[3]; |
| _BYTE v6[5]; |
| int v7; |
| int v8; |
| int v9; |
| char v10; |
| int i; |
| |
| __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?}收工
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?