2017 信息安全大赛填数游戏

题目链接
http://static2.ichunqiu.com/icq/resources/fileupload/CTF/echunqiu/qgdxs/numgame_8808BCE6D17A3EF92461A50079264767.zip

首先用IDA打开,找到主程序,如图
在这里插入图片描述

两个判断的地方是需要重点分析的。
分析可知第一个地方是初始化所以重点分析check函数
在这里插入图片描述
因为题目为填数游戏,所以看到这里猜测是一个类似数独的游戏
可以看到块检查函数中,先生成一个数组用来存放每一块检查后的结果,然后根据所有块的检查结果是否都通过来确定返回值。
检测的方法是,将对应的位置的数所在数组标志为0,通过检查0到8是否都被标志来检查数独的完整性。

检查行和列的方法都是类似的,所以不再赘述,重点在初始化函数中。
在这里插入图片描述
函数比较简单基本上就是把数组中的元素取出来然后作为一个int型放入新的数组a1中。
在这里插入图片描述
可以看到初始的数组如上图所示
对应的数组为
0 0 7 5 0 0 0 6 0
0 2 0 0 1 0 0 0 7
9 0 0 0 3 0 4 0 0
2 0 1 0 0 0 0 0 0
0 3 0 1 0 0 0 0 5
0 0 0 0 0 0 7 1 0
4 0 0 0 0 8 2 0 0
0 0 5 9 0 0 0 8 0
0 8 0 0 0 1 0 0 3
在网上找对应的数独解密工具
http://www.llang.net/sudoku/calsudoku.html
结果如图
在这里插入图片描述
在线解出后, 要将原来有数字的位置换为0
在最后结果上加入flag即可

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
竞赛题目#include <cstdio> #include <cstring> #include <ctype.h> #include <cstdlib> #include <cmath> #include <climits> #include <ctime> #include <iostream> #include <algorithm> #include <deque> #include <vector> #include <queue> #include <string> #include <map> #include <stack> #include <set> #include <numeric> #include <sstream> #include <iomanip> #include <limits> #define CLR(a) memset(a, 0, sizeof(a)) using namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; typedef pair <int, int> pii; typedef pair <ll, ll> pll; typedef pair<string, int> psi; typedef pair<string, string> pss; const double PI = 3.14159265358979323846264338327; const double E = exp(1); const double eps = 1e-6; const int INF = 0x3f3f3f3f; const int maxn = 1e6 + 5; const int MOD = 1e9 + 7; int main() { int n; cin >> n; vector <int> v; int num; for (int i = 0; i < n; i++) { scanf("%d", &num;); v.push_back(num); } cin >> n; for (int i = 0; i < n; i++) { scanf("%d", &num;); v.erase(v.begin() + num - 1); } vector <int>::iterator it; for (it = v.begin(); it != v.end(); it++) { if (it != v.begin()) printf(" "); cout << *it; } cout << endl; } --------------------- 作者:Dup4 来源:CSDN 原文:https://blog.csdn.net/dup4plz/article/details/79666083 版权声明:本文为博主原创文章,转载请附上博文链接!#include <cstdio> #include <cstring> #include <ctype.h> #include <cstdlib> #include <cmath> #include <climits> #include <ctime> #include <iostream> #include <algorithm> #include <deque> #include <vector> #include <queue> #include <string> #include <map> #include <stack> #include <set> #include <numeric> #include <sstream> #include <iomanip> #include <limits> #define CLR(a) memset(a, 0, sizeof(a)) using namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; typedef pair <int, int> pii; typedef pair <ll, ll> pll; typedef pair<string, int> psi; typedef pair<string, string> pss; const double PI = 3.14159265358979323846264338327; const double E = exp(1); const double eps = 1e-6; const int INF = 0x3f3f3f3f; const int maxn = 1e6 + 5; const int MOD = 1e9 + 7; int main() { int n; cin >> n; vector <int> v; int num; for (int i = 0; i < n; i++) { scanf("%d", &num;); v.push_back(num); } cin >> n; for (int i = 0; i < n; i++) { scanf("%d", &num;); v.erase(v.begin() + num - 1); } vector <int>::iterator it; for (it = v.begin(); it != v.end(); it++) { if (it != v.begin()) printf(" "); cout << *it; } cout << endl; } --------------------- 作者:Dup4 来源:CSDN 原文:https://blog.csdn.net/dup4plz/article/details/79666083 版权声明:本文为博主原创文章,转载请附上博文链接!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值