[ACTF新生赛2020]easyre1
放入ida,一眼 UPX 壳
先脱壳,脱壳后主函数内容如下:

修改一下函数名。

一步一步分析,a 被初始化为
*F'\"N,\"(I?+@
然后输入 v6 ,可以看出flag构成为:ACTF{}
之后v6数组就查无此人了,a也不像flag,打开s数组,发现s数组

s 数组存的也不是flag,合理猜测 f 数组存放flag。
这个 if 判断应该就是检验 flag 的地方了。
把 f 数组里的值作为下标,判断两值相等。
上脚本(C++):
#include<bits/stdc++.h>
using namespace std;
const char a[]={"*F'\"N,\"(I?+@"};
const char ch[]={"~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(',27h,'&%$# !"};
signed main() {for (int i=0;i<=11;++i) {for (int j=0;j<strlen(ch);++j){if (a[i]==ch[j]) {cout<<(char)(j+2);}}}return 0;
}
注意,数组 s 开头的这个 db 7Eh 也是 s 里的内容,别漏了。

得到 flag 里的内容:
U9X^1SY]W6@T?
原本的flag应该是 ACTF{U9X^1SY]W6@T?} ,但这里是BUUCTF,应该改成
flag{U9X^1SY]W6@T?} (因为这个原因被卡了好久)。
复盘发现 v7、v8、v9 的地址和 v6 是连续的,而这三个值又都赋给了 f ,可以佐证 f 里存的就是 flag 。