题目描述文档:此题使用《规则:5.1.1 Windows方案一》,需要你输入一串序列号。最终cm.exe文件的SHA1值为:db4b7754816c6ba61f8a9687feb2d50203941958判胜条件:打开cm.exe,输入你的序列号,然后回车,如果结果显示“success.”表示成功,其他为失败。
源码:#include <iostream>
#pragma comment(linker, "/BASE:0x00700000")
const char keydict[]="0123456789abcdefghijklmnopqrstuvwxyz";
int maze_data[3][9][10] = {//不可分解为墙,可分解为路;
// 第二层
// 第三层
// 自定义绝对值函数
inline double custom_abs(double val) {
return (val < 0) ? -val : val;
// 自定义平方根函数
double my_sqrt(double x) {
// 处理边界值
if (x <= 0.0) return 0.0;
if (x == 1.0) return 1.0;
double guess = x / 2.0; // 初始猜测值
double prev = 0.0;
const double eps = 1e-7; // 精度阈值
int max_iter = 50; // 最大迭代次数
for (int i = 0; i < max_iter; ++i) {
prev = guess;
guess = 0.5 * (guess + x / guess); // 牛顿迭代公式
// 计算相对误差
double diff = custom_abs(guess - prev);
if (diff < eps * custom_abs(guess)) {
break;
return guess;
bool is_prime(int num) {
if (num < 2) return false;
for (int i = 2; i <= (int)my_sqrt((double)num); ++i) {
if (num % i == 0) return false;
return true;
bool is_product_of_two_primes(int n, int* p1 = NULL, int* p2 = NULL) {
if (n < 4) return false;
for (int i = 2; i <= (int)my_sqrt((double)n); ++i) {
if (n % i == 0) {
int j = n / i;
if (is_prime(i) && is_prime(j)) {
if (p1) *p1 = i;
if (p2) *p2 = j;
return true;
return false;
bool checklic(const char*input)
if(input==NULL || strlen(input)==0) return false;
int nLenInput=strlen(input);
int nLenDict=strlen(keydict);
int x,y,z,x0,y0,z0;
x=y=z=0;
x0=y0=z0=0;
int step=0;
for(int i=0;i<nLenInput;i++)
char a=input[i];
int p=0;
for (;p<nLenDict;p++)
if(keydict[p]==a) break;
if(p>=nLenDict) break;
if(p<12){
z=0;
else if(p<24){
z=1;
z=2;
if((i&1)==0)
y=p%12;
else
x=p%12;
step++;
// 起点终点特殊检查
if(step==1 && maze_data[z][y][x]!=11278) {
return false;
if(i==nLenInput-1 && maze_data[z][y][x]!=8114) {
return false;
// 路径点有效性检查
if(step>1 && i<nLenInput) {
int p1, p2;
bool decomposable = is_product_of_two_primes(maze_data[z][y][x], &p1, &p2);
if (false == decomposable) {
return false;
if(p1<2 || p2<2) return false;
if(p1==p2) return false;
// 连续性检查
if(step>1) {
int dz = abs(z - z0);
int dy = abs(y - y0);
int dx = abs(x - x0);
if(dz+dy+dx != 1) {
return false;
x0=x;
y0=y;
z0=z;
//最后一步必须为8114
if(i==nLenInput-1 && maze_data[z][y][x]==8114) {
return true;
return false;
int main() {
printf( "input your serial:\n");
std::cin.getline(szInputStr, sizeof(szInputStr));
if ( strlen(szInputStr) <= 112 ) // 输入不能超过112个字符
bool ret=checklic(szInputStr);
if(re
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-287585.htm
[原创]2025 KCTF提交防守题目[设计思路+源码]
382 浏览
1 回复
一楼附件解压密码是:kxdg.1234