[安洵杯 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}

posted @ 2022-01-27 18:06  Moominn  阅读(118)  评论(0编辑  收藏  举报