[GUET-CTF2019]number_game[数独]

news2024/10/1 7:28:57

目录

题目

 学到的知识点:


题目

在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; // rax

  result = 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; // rax

  byte_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]*10
 
for 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表示偏移量,但是凯撒加密不会移位数字,但有的题目是凯撒加密的变种,会移位数字

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/585318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

您的监控策略是否可扩展?

家公司都在努力更好地了解其运营效率&#xff0c;但他们都遇到了同样的问题&#xff1a;规模。那么&#xff0c;可扩展的监控策略是什么样的&#xff1f;您如何防范可观察性中最重要的问题&#xff1f; 什么是可扩展监控策略&#xff1f; 我们将从确定受规模影响最大的两件事…

生态系统NPP及碳源、碳汇模拟、土地利用变化、未来气候变化、空间动态模拟实践技术应用

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。碳中和可以从碳排放&#xff08;碳源&#xff09;和碳固定&#xff08;碳汇&#xff09;这两个侧面来理解。陆地生态系统在全球碳循环过程中有着重要作…

SpringBootWeb---分层解耦

3. 分层解耦 3.1 三层架构 3.1.1 介绍 在我们进行程序设计以及程序开发时&#xff0c;尽可能让每一个接口、类、方法的职责更单一些&#xff08;单一职责原则&#xff09;。 单一职责原则&#xff1a;一个类或一个方法&#xff0c;就只做一件事情&#xff0c;只管一块功能。…

前端网络、JavaScript优化以及开发小技巧

一、网络优化 YSlow有23条规则&#xff0c;中文可以参考这里。这几十条规则最主要是在做消除或减少不必要的网络延迟&#xff0c;将需要传输的数据压缩至最少。 1&#xff09;合并压缩CSS、JavaScript、图片&#xff0c;静态资源CDN缓存 通过构建工具Gulp&#xff0c;可以在…

PDPS教程:机器人工作站导出为JT格式文件操作方法

目录 功能简介 功能注意事项 导出JT格式文件操作 导出JT格式文件查看 功能简介 PDPS软件不仅能够从外部导入JT格式的模型文件&#xff0c;还能够将创建好的机器人工作站/生产线导出为JT格式的模型文件。这个能够导出JT格式文件的功能就是“Export JT”命令。 使用“Expor…

零尽其用,尾随不落——探究力扣题目“移除字符串中的尾随零”的解题思路

本篇博客会讲解力扣“2710. 移除字符串中的尾随零”的解题思路&#xff0c;这是题目链接。 先来审题&#xff1a; 以下是示例&#xff1a; 以下是提示&#xff1a; 本题的思路是&#xff1a; 先遍历字符串&#xff0c;找到字符串末尾的\0。从\0开始&#xff0c;向前遍历&a…

如何写一篇让人挑不出毛病的产品需求文档?

需求”这个词是产品经理工作中的常客&#xff0c;产品需求文档也贯穿于整个产品经理的日常工作中&#xff0c;本周小编将通过什么是产品需求文档&#xff0c;产品需求文档的作用、如何写好产品需求文档等方面分享如何写出一篇让你挑不出毛病的PRD&#xff0c;让需求文档助力产品…

30分钟开发微信小程序并部署

30分钟开发微信小程序并部署 首先&#xff0c;今天我们会使用到腾讯为我们提供的云平台来协助我们小程序的开发和部署。 环境准备&#xff1a; 微信开发者账号&#xff08;自己在微信公众号平台注册一个账号&#xff09;&#xff1a;https://mp.weixin.qq.com/&#xff0c;同时…

arp欺骗(http)与dns欺骗

Arp欺骗 win7&#xff1a; ip:192.168.127.147 mac:00-0C-29-4F-1C-36 kali: ip:192.168.127.133 mac:00:0c:29:4c:4d:92 arp -a 获取网关 网关&#xff1a;ip&#xff1a;192.168.127.0 mac&#xff1a;00-0c-29-4c-4d-92 fping -g 192.168.127.0/24 192.168.127.1…

在华为眼里,ICT行业今年还有啥搞头?

大家好&#xff0c;我是老杨。 不知道你们有没有研究年报的习惯&#xff0c;一些超大厂是会每年发布年报的&#xff0c;而从年报里&#xff0c;你能看出很多行业趋势出来。 以最热门的华为举例&#xff1a; 每年&#xff0c;华为都会发布全年财报&#xff0c;对自己今年的整…

什么是低代码?国内常见的低代码平台有哪些?

一、什么是低代码开发&#xff1f; 低代码也称之为无代码或是 aPaas。要想了解低代码是什么&#xff0c;我们先来讨论低代码本质&#xff1f; 它是一种可视化软件开发方法&#xff0c;通过最少的编码更快地交付应用程序。 图形用户界面和拖放功能使开发过程的各个方面自动化…

【大数据之Hive】三、Linux下安装MySQL8.0.33

1 安装MySQL &#xff08;1&#xff09;解压MySQL安装包: tar -xf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar -C /opt/module/mysql&#xff08;2&#xff09;卸载系统自带的mariadb&#xff1a; sudo rpm -qa | grep mariadb | xargs sudorpm -e --nodeps&#xff08;3&am…

快速上手 SpringBoot 单元测试

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 什么是单元测试&#xff1f;单元测试有哪些好处SpringBoot 单元测试使用单元测试的实现步骤生成单元测试类添加单元测试代码 …

rsync+inotfy实时同步

rsyncinotfy实时同步 目录 一、服务器端 二、客户端 一、服务器端 1、安装网站服务&#xff0c;启动&#xff0c;但是不写首页文件 yum -y install httpd 2、安装raync服务 yum -y install rsync 3、修改主配置文件 &#xff08;/etc/rsyncd.conf&#xff09; uid root gi…

transformer的dataset下载失败load_dataset(“glue“,“mrpc“)

下载的时候会报错https://huggingface.co/datasets/glue/resolve/main/glue.py这个路径无法下载&#xff0c;但是浏览器是可以打开的 所以&#xff0c;先去官网手动下载文件 然后让模型去读取&#xff0c;默认是会读取TRANSFORMERS_CACHE中的内容&#xff0c;不过在c盘&#x…

Ex-ChatGPT本地部署+Azure OpenAI接口配置+服务器部署

Ex-ChatGPT项目分为 Ex-ChatGPT 和 WebChatGPTEnhance 两部分&#xff0c;Ex-ChatGPT启动后是个web服务&#xff0c;通过访问ip端口体验&#xff1b; WebChatGPTEnhance可编译生成一个浏览器插件&#xff0c;Chrome或者Microsoft edge浏览器可以安装该插件&#xff0c;点击该插…

【Python入门篇】——Python中循环语句(循环中断break和continue)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; Python入门&#xff0c;本专栏主要内容为Python的基础语法&#xff0c;Python中的选择循环语句…

MyBatis-Plus 可视化代码生成器来啦,让你的开发效率大大提速!!

前言 在基于Mybatis的开发模式中&#xff0c;很多开发者还会选择Mybatis-Plus来辅助功能开发&#xff0c;以此提高开发的效率。虽然Mybatis也有代码生成的工具&#xff0c;但Mybatis-Plus由于在Mybatis基础上做了一些调整&#xff0c;因此&#xff0c;常规的生成工具生成的代码…

【系统工具】Rundll32:Windows系统中的神奇工具,你知道吗?

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ Rundll32的使用使用方法 - cmd使用方法 - 运行窗口/任务管理器/资源管理器 2️⃣ 常见应用场景运行js或vbs的脚本代码执行命令绕过杀毒软件的作法&#xff1f;修改注册表增加一个服务修复Internet Explorer其它常见命令 3️⃣ 原理…

使用LoRA对大语言模型LLaMA做Fine-tune

使用LoRA对大语言模型LLaMA做Fine-tune 前言下载配置环境模型的训练 Fine-tune模型的使用 Inference参考 前言 目前有大量对LLM&#xff08;大语言模型&#xff09;做Fine-tune的方式&#xff0c;不过需要消耗的资源非常高&#xff0c;例如 Stanford Alpaca: 对LLaMA-7B做Fine-…