[安洵杯 2019]game
懒得去平坦化了,直接嗯看
64 位 ELF,查看主函数
看到有个 sudoku 数组,应该是个数独,查看一下提取出来
然后上网随便找个网站做一下,得到:4693641762894685722843556137219876255986
继续往下看,重点在于 check1() 和 check3() 两个函数,先看一下 check1(),注意到有三个主要的变换操作
首先 a1 前半部分和后半部分交换,然后前后两两交换,最后再进行一次变换,猜测最终结果要与填的数独答案一致
然后看一下 check3()
重点在 check2() 函数,查看一下
主要是将 v16 存入 D0g3,然后与 sudoku 数组比较
v16 是经过处理的输入
得到程序的总体逻辑如下:输入 ——> check1() 三次变换 ——> 比较
所以按照 check1() 逻辑写脚本逆向即可,exp 如下:
#include <bits/stdc++.h>
using namespace std;
char a[] = "4693641762894685722843556137219876255986";
int main() {
int len = strlen(a);
char temp;
for (int i = 0; i < len; i++) {
temp = a[i] + 20;
temp = temp & 0xf3 | ~temp & 0xc;
a[i] = temp;
}
for (int i = 0; i < len; i+=2) {
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
for (int i = 0; i < len / 2; i++) {
temp = a[i];
a[i] = a[i + len / 2];
a[i + len / 2] = temp;
}
printf("%s\n", a);
return 0;
}
得到:flag{KDEEIFGKIJ@AFGEJAEF@FDKADFGIJFA@FDE@JG@J}