[GUET-CTF2019]number_game[数独]
目录
题目
学到的知识点:
题目
在buu上看到了一道数独题,没见过,记录一下
下载附件,查壳,无壳,在IDA中打开,直接找到主函数
unsigned __int64 __fastcall main(int a1, char **a2, char **a3)
{__int64 v4; // [rsp+8h] [rbp-38h]__int64 input; // [rsp+10h] [rbp-30h] BYREF__int16 v6; // [rsp+18h] [rbp-28h]__int64 v7; // [rsp+20h] [rbp-20h] BYREF__int16 v8; // [rsp+28h] [rbp-18h]char v9; // [rsp+2Ah] [rbp-16h]unsigned __int64 v10; // [rsp+38h] [rbp-8h]v10 = __readfsqword(0x28u);input = 0LL;v6 = 0;v7 = 0LL;v8 = 0;v9 = 0;scanf("%s", &input);if ( function(&input) ) // 0<v5[i]<=4并且len(v5)==10{v4 = function_1(&input, 0LL, 10LL); // 建树function_2(v4, &v7); // 令v7=input// 中序遍历 递归v9 = 0;function_3(&v7); // 将中序遍历后的数据存入到一段内存中if ( function_4() ) // 这里进行判断是是将中序遍历转换后的字符串{ // 实际上就是根据中序遍历求出原本的输入puts("TQL!");printf("flag{");printf("%s", &input);puts("}");}else{puts("your are cxk!!");}}return __readfsqword(0x28u) ^ v10;
}
大致理一下思路,可以看到
首先输入一串字符串,在function函数中进行了判断(确保输入的值在字符‘0’~‘4’之间,并且长度要为10)
接着在function_1中进行建树
_QWORD *__fastcall sub_400758(__int64 input, int i, signed int len)
{char cnt; // [rsp+1Fh] [rbp-11h]_QWORD *v6; // [rsp+28h] [rbp-8h]cnt = *(i + input);if ( cnt == ' ' || cnt == '\n' || i >= len ) // 判段输入不为空格和换行符return 0LL;v6 = malloc(0x18uLL); // 申请一块内存*v6 = cnt; // 存储根结点v6[1] = function_1(input, 2 * i + 1, len); // 递归调用,存储左子树和右子树v6[2] = function_1(input, 2 * (i + 1), len);return v6;
}
再在function_2中进行中序遍历的变换
__int64 __fastcall sub_400807(__int64 v4, __int64 v7)
{__int64 result; // raxresult = v4;if ( v4 ){function_2(*(v4 + 8), v7); // 左子树*(v7 + dword_601080++) = *v4; // 保存根结点return function_2(*(v4 + 16), v7); // 右子树}return result;
}
把经过中序变换的数据在fnction_3里面存储到一段内存中
__int64 __fastcall sub_400881(char *a1)
{__int64 result; // raxbyte_601062 = *a1;byte_601067 = a1[1];byte_601069 = a1[2];byte_60106B = a1[3];byte_60106E = a1[4];byte_60106F = a1[5];byte_601071 = a1[6];byte_601072 = a1[7];byte_601076 = a1[8];result = a1[9];byte_601077 = a1[9];return result;
}
最后进入function_4函数,function_4函数是一个数独游戏函数,代码如下
__int64 sub_400917()
{unsigned int v1; // [rsp+0h] [rbp-10h]int i; // [rsp+4h] [rbp-Ch]int j; // [rsp+8h] [rbp-8h]int k; // [rsp+Ch] [rbp-4h]v1 = 1;for ( i = 0; i <= 4; ++i ) // 5*5数独游戏{for ( j = 0; j <= 4; ++j ){for ( k = j + 1; k <= 4; ++k ){if ( *(&unk_601060 + 5 * i + j) == *(&unk_601060 + 5 * i + k) )// 每行数无重复元素v1 = 0;if ( *(&unk_601060 + 5 * j + i) == *(&unk_601060 + 5 * k + i) )// 每列数无重复元素v1 = 0;}}}return v1;
}
5*5的数独函数,两个if语句判断要求每行元素不重复,每列元素不重复
大致思路就是输入一段字符串,进行给定二叉树的存储,然后再中序遍历存储,最后判断是否满足数独函数,满足则输出正确,反之,错误
二叉树如何存储的呢?树的结构与对应输入树的值存储关系如下

用0~9的数输入来测试输出的顺序。经过变换后的结果是 :7381940526
数独矩阵为

手动解出结果为:0421421430,只要使输入的结果经过变换后满足此顺序即可
借用一下大佬的脚本解密
map = [7, 3, 8, 1, 9, 4, 0, 5, 2, 6] # 对应关系
v7 = [48, 52, 50, 49, 52, 50, 49, 52, 51, 48]
flag=[0]*10for i in range(10):flag[map[i]] = chr(v7[i])
flag=''.join(flag)
print('flag{'+flag+'}')
# 1134240024
学到的知识点:
- 二叉树相关的题目类型
- 怎么判断代码是数独游戏
- 额外补充一个在别的题目中遇到的:凯撒加密代码的标志是:
*v7 = (v5 - 48 + a) % 10 + 48
*v7=(v5-97+a)%26+97
其中a表示偏移量,但是凯撒加密不会移位数字,但有的题目是凯撒加密的变种,会移位数字
相关文章:
[GUET-CTF2019]number_game[数独]
目录 题目 学到的知识点: 题目 在buu上看到了一道数独题,没见过,记录一下 下载附件,查壳,无壳,在IDA中打开,直接找到主函数 unsigned __int64 __fastcall main(int a1, char **a2, char **a3…...
探索可视化大屏:引领信息时代的视觉革命
可视化大屏是一种利用先进的数据可视化技术和交互技术,将大量的数据和信息以直观、易于理解的方式展示在大屏幕上的解决方案。可视化大屏通常由高分辨率的显示屏、强大的计算和处理设备以及专业的可视化软件组成,它通过图表、图形、动画等可视化元素&…...
Groovy学习笔记-2.Groovy相关基础信息
更多代码相关的内容可以参考:https://github.com/zclhit/groovy_learning/tree/main 代码结构 注释 #!注释,只允许出现在groovy脚本的第一行,通过这种注释可以方便Unix shell进行定位启动并运行 //单行注释 /* xxxxx */多行注释 /** xxxxx…...
android 12.0Settings去掉二级三级菜单搜索功能
1.概述 在12.0由于客户定制开发需求,需要去掉Settings里面的搜索功能,主页面的搜索功能,在前面的章节已经讲了 这里需要去掉二级三级菜单的搜索功能,需要从搜索功能流程分析去掉搜索功能 2.Settings去掉二级三级菜单搜索功能核心代码 packages/apps/Settings/src/com/and…...
【业务功能篇03】Springboot+POI 带图片的导出Excel
继前面介绍的 Springboot+mybatis-plus+POI实现表单数据导出Excel 这篇实现功能介绍,后期业务又有新的导出需求,就是在导出表单数据的同时,在表单下面位置,放入对应一个业务的图片数据,这些图片数据,就是结合表格的数据,在前端的表格下面的位置展示的,比如针对时间-数量…...
“智慧赋能 强链塑链”——打造电力特色智慧供应链体系
构建业务数智化、资源集约化、运营一体化、发展绿色化的智慧供应链体系,是电力企业实现智慧供应链建设的使命和目标。同时,在国内外双循环、一带一路、建立统一大市场的政策背景推动下,企业经营和居民生活对电力的需求仍然强劲并持续增长&…...
服了呀,被现在的00后卷麻了....
现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的,工作没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家里条…...
带你开发一个远程控制项目---->STM32+标准库+阿里云平台+传感器模块+远程显示-------之 阿里云平台项目建造。
第一篇章: (13条消息) 带你开发一个远程控制项目---->STM32标准库阿里云平台传感器模块远程显示。_海口飞鹏岛科技有限公司的博客-CSDN博客 本次文章是指引开发者进行开发阿里云平台建造设备项目,可观看UP主教程,完成如下&#x…...
MoveIt2中使用trac_ik
文章目录 1.下载trac_ik的源码2.安装 NLopt library3.编译源码4.使用4.1.已经配置好的项目4.2.新使用moveIt_setup_assistant进行配置时 在ros1moveit1中,使用trac_ik是很简单的一件事情:【TRAC-IK Kinematics Solver】 但是在Ros2中,无论Mov…...
搭建服务器的主流中间件有哪些?如何在外网访问内网的服务?
计算机业内人士对于搭建服务器的中间件并不陌生,apache、tomcat、IIS、nginx 都是比较常用的搭建服务器的中间件,它们之间还是有一些区别差异的。今天就说说这些中间件之间有哪些区别,以及如何利用快解析实现内网主机应用让外网访问。 首先说…...
MapperFacade使用
一、MapperFacade是Orika框架中的一个核心类,它用于管理对象映射。使用MapperFacade可以方便地将一个对象转换为另一个对象。以下是使用MapperFacade的基本步骤: 创建一个MapperFactory对象。 使用MapperFactory对象注册对象之间的映射关系。 调用Mapp…...
@开源爱好者,字节跳动这项技术,正式宣布开源了
告诉大家一个好消息,字节跳动的云原生数据仓库 ByConity 正式宣布开源了。 ByConity 是一个云原生数据仓库,由字节跳动数据平台团队在国际知名开源数据库管理系统 ClickHouse 社区版本基础上开发。 早期,字节跳动的数据存储使用的是 ClickHou…...
React学习笔记八-受控与非受控组件
此文章是本人在学习React的时候,写下的学习笔记,在此纪录和分享。此为第八篇,主要介绍非受控组件与受控组件。 目录 1.非受控组件 1.1表单提交案例 1.2案例的总结 2.受控组件 2.1受控组件案例 2.1受控案例总结 1.非受控组件 1.1表单提…...
gcc编译
一、GCC简介 GCC(GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。 GCC 原名为 GNU C语言编译器,因为它原本…...
华为云服务器租用费用及CPU性能(1核2G/2核4G/4核8G)
华为云HECS云服务器即云耀云服务器,类似于阿里云和腾讯云的轻量应用服务器,HECS云服务器1核2G配置39.02元一年、2核4G配置99元一年、4核8G配置69.94元3个月,华为云百科分享华为云HECS云服务器租用费用及CPU性能详解: 目录 华为云…...
Redis---事务管道
目录 一、Redis的事务是什么? 1.1 Redis和关系型数据库事务的区别 二、怎么玩Redis事务? 2.1 正常执行: 2.2 放弃事务 2.3 全体连坐 2.4 冤头债主 2.5 watch监控 三、管道 3.1 为什么会引入管道这个概念呢?我们首先来看一…...
Python的内置数据类型(通过故事来学习)
有一天,小李在学习Python语言时,听到了一个关于内置数据类型的故事。 Python内置了很多数据类型,比如整数、浮点数、字符串、布尔值等等。这些数据类型可以帮助我们更方便地处理数据,提高代码的效率。 小李很好奇,就…...
继瑞吉外卖后的又一个项目——SpringBoot+Vue的前后端博客系统
文章目录 博客系统项目介绍前言项目演示前台演示后台演示 组织结构后端组织结构前端组织结构 技术选型前端技术后端技术架构图系统架构图业务架构图 模块介绍前端模块后端模块 环境搭建开发工具开发环境项目运行 未完待续结语 博客系统项目介绍 前言 本项目已开源在Gitee 后端…...
2023暑期实习历程总结
一.前言 Hello 大家好久不见,已经三个月左右没有更新了,那我这三个月在干什么呢?自2023年3月中旬开始到现在五月底这期间接近三个月的时间里,我一直在进行2023暑期实习的投递和面试。这期间投递了包括各大中厂(阿里&am…...
UART-STM32
UART-STM32 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 第一步,开启时钟,把需要用的USART和GPIO的时钟打开 第二步,GPIO初始化,把TX配置成复用输出,RX配置成输入 第三步,配置USART,直接使…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...
Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...
