GDOUCTF2023-部分re复现

news2024/11/26 10:35:41

目录

[GDOUCTF 2023]Check_Your_Luck

[GDOUCTF 2023]Tea

[GDOUCTF 2023]doublegame


[GDOUCTF 2023]Check_Your_Luck

打开题目是一串代码,明显的z3约束器求解

 直接上脚本

import z3
from z3 import Real

s = z3.Solver()
v=Real('v')
x=Real('x')
y=Real('y')
w=Real('w')
z=Real('z')

s.add(v * 23 + w * -32 + x * 98 + y * 55 + z * 90 == 333322)
s.add(v * 123 + w * -322 + x * 68 + y * 67 + z * 32 == 707724)
s.add(v * 266 + w * -34 + x * 43 + y * 8 + z * 32 == 1272529)
s.add(v * 343 + w * -352 + x * 58 + y * 65 + z * 5 == 1672457)
s.add(v * 231 + w * -321 + x * 938 + y * 555 + z * 970 == 3372367)
r = s.check()
print(r)
if repr(r) == 'sat':
    result = s.model()
    print(result)
else:
    print('无解')

flag:NSSCTF{4544_123_677_1754_777}

[GDOUCTF 2023]Tea

打开题目,查壳,无壳,分析代码

 function2是加密过程,进入查看

 可以发现是被魔改的xtea算法,算法进行了33轮,每次sum值不同,且i加密多异或了一个sum ,从function3中可以拿到加密后的数据。sub_140011339函数可以拿到key值

别忘了最后的输出还有一个小操作 

 

 写脚本解密

#include <stdio.h>
int main()
{
int v3; // [rsp+44h] [rbp+24h]
int i; // [rsp+64h] [rbp+44h]
unsigned int v5; // [rsp+84h] [rbp+64h]
int sum; // [rsp+C4h] [rbp+A4h]
unsigned int key[4] = {2233,4455,6677,8899 };
unsigned int a[10];
a[0] = 0x1A800BDA;
a[1] = 0xF7A6219B;
a[2] = 0x491811D8;
a[3] = 0xF2013328;
a[4] = 0x156C365B;
a[5] = 0x3C6EAAD8;
a[6] = 0x84D4BF28;
a[7] = 0xF11A7EE7;
a[8] = 0x3313B252;
a[9] = 0xDD9FE279;
for (i = 8; i >=0; i--)
{
v5 = 0;
sum = 0xF462900 * i;
for (int j = 0; j < 33; j++)
sum += 0xF462900;
v3 = i + 1;
do
{
sum -= 0xF462900;
a[v3] -= (sum + key[(sum >> 11) & 3]) ^ (a[i] + ((a[i] >> 5) ^ (16 * a[i])));
a[i] -= sum ^ (a[v3] + ((a[v3] >> 5) ^ (16 * a[v3]))) ^ (sum + key[sum & 3]);
++v5;
} while (v5 <= 32);
}
for (int k = 0; k < 10; ++k)
{
    for (int m = 3; m >= 0; m--)
        printf("%c", (a[k] >> (8 * m)));
}return 0;
}

注意:数据是unsigned int 型才可以得到flag。

[GDOUCTF 2023]doublegame

看到这个题目很懵,没得头绪,幸好有工作室的好学长指点。

可以看到刚打开是一个贪吃蛇游戏,需要将分数刷到很高(具体多少忘记了这里修改过分数的程序,可以在汇编窗口右键patching-change byte-进行修改操作 再点击editor-patch program-apply patcheds to input file)就可以,修改后何以很轻易的跳过第一个游戏

 另外补充一个,怎么让ida显示中文;可以在options-general-string中选择gbk

 没有可以右键insert添加,这样遇到中文数据就可以选择所有的中文数据 alt+a显示中文了。

现在进入第二个游戏,第二个游戏是一个走迷宫的游戏

void __noreturn sub_140012CF0()
{
  __int64 *v0; // rdi
  __int64 i; // rcx
  __int64 v2; // [rsp+20h] [rbp+0h] BYREF
  _WORD v3[22]; // [rsp+30h] [rbp+10h] BYREF
  char v4[44]; // [rsp+5Ch] [rbp+3Ch] BYREF
  char v5[44]; // [rsp+88h] [rbp+68h] BYREF
  char v6[22]; // [rsp+B4h] [rbp+94h] BYREF
  char v7[22]; // [rsp+CAh] [rbp+AAh] BYREF
  char v8[44]; // [rsp+E0h] [rbp+C0h] BYREF
  char v9[44]; // [rsp+10Ch] [rbp+ECh] BYREF
  char v10[44]; // [rsp+138h] [rbp+118h] BYREF
  char v11[22]; // [rsp+164h] [rbp+144h] BYREF
  char v12[22]; // [rsp+17Ah] [rbp+15Ah] BYREF
  char v13[44]; // [rsp+190h] [rbp+170h] BYREF
  char v14[44]; // [rsp+1BCh] [rbp+19Ch] BYREF
  char v15[24]; // [rsp+1E8h] [rbp+1C8h] BYREF
  int j; // [rsp+214h] [rbp+1F4h]
  int v17; // [rsp+234h] [rbp+214h]
  int v18; // [rsp+254h] [rbp+234h]
  int v19; // [rsp+274h] [rbp+254h]
  int v20; // [rsp+294h] [rbp+274h]
  char v21[100]; // [rsp+2C0h] [rbp+2A0h] BYREF
  char v22[100]; // [rsp+324h] [rbp+304h] BYREF
  _BYTE v23[828]; // [rsp+388h] [rbp+368h] BYREF
  char input; // [rsp+6C4h] [rbp+6A4h]
  int v25; // [rsp+6E4h] [rbp+6C4h]
  int v26; // [rsp+704h] [rbp+6E4h]

  v0 = &v2;
  for ( i = 448i64; i; --i )
  {
    *v0 = -858993460;
    v0 = (v0 + 4);
  }
  sub_14001141A(&unk_1400290A6);
  strcpy(v3, "000000000000000000000");
  strcpy(&v3[11], "0 0 0 0     0     0 0");
  strcpy(v4, "0 0 0 00000 00000 0 0");
  strcpy(&v4[22], "0 0               0 0");
  strcpy(v5, "0 000 000 0 000 0 0 0");
  strcpy(&v5[22], "0 0     0 0 0   0 0 0");
  strcpy(v6, "0 0 0 00000 000 000 0");
  strcpy(v7, "0 0 0     0   0 0    ");
  strcpy(v8, "0 000 0 0 000 0 0 0 0");
  strcpy(&v8[22], "0     0 0 0 0 0 0 0 0");
  strcpy(v9, "0 00000 000 000 0 0 0");
  strcpy(&v9[22], "0     0       0   0 0");
  strcpy(v10, "000 0 0 0 000 0 0 0 0");
  strcpy(&v10[22], "0 0 0 0 0 0 * 0 0 0 0");
  strcpy(v11, "0 0000000 0 000 00000");
  strcpy(v12, "@       0 0         0");
  strcpy(v13, "0 0 0 0 0 00000000000");
  strcpy(&v13[22], "0 0 0 0             0");
  strcpy(v14, "000 0 00000 0 000 000");
  strcpy(&v14[22], "0         0 0   0   0");
  strcpy(v15, "000000000000000000000");
  v12[4] = '0';                                 // 【12】【4】这里被墙堵住
  strcpy(v21, "Please to save the cat!");
  memset(&v21[24], 0, 0x4Cui64);
  strcpy(v22, "the score is saving cat's key!\n");
  memset(&v22[32], 0, 0x44ui64);
  qmemcpy(
    v23,
    "oh,the door open!\n恭喜你完成了第一个任务!请从头用最快的方式把猫带出去\n",
    0x47ui64);
  memset(&v23[71], 0, 729);
  printf("path\n");
  v25 = 0;
  v26 = 0;
  v17 = 15;
  v18 = 0;
  v19 = 7;
  v20 = 20;
  for ( j = 0; j <= 20; ++j )
    puts(&v3[11 * j]);
  printf("Please to save the cat!\n");          // 先救猫猫再逃出迷宫
  while ( v17 != v19 || v18 != v20 )            // 要先到达猫猫的位置
  {
    input = getchar();
    switch ( input )                            // 要从【15】【0】到【7】【20】
    {
      case 's':                                 // 下
        if ( *(&v3[11 * v17 + 11] + v18) != '0' )
        {
          *(&v3[11 * v17++] + v18) = 32;
          *(&v3[11 * v17] + v18) = 64;
        }
        break;
      case 'w':                                 // 上
        if ( *(&v3[11 * v17 - 11] + v18) != '0' )
        {
          *(&v3[11 * v17--] + v18) = 32;
          *(&v3[11 * v17] + v18) = 64;
        }
        break;
      case 'a':                                 // 左
        if ( *(&v3[11 * v17 - 1] + v18 + 1) != '0' )
        {
          if ( *(&v3[11 * v17 - 1] + v18 + 1) == '*' )
            v7[20] = 48;
          *(&v3[11 * v17] + v18--) = ' ';
          *(&v3[11 * v17] + v18) = '@';
        }
        break;
      default:
        if ( input == 'd' && *(&v3[11 * v17] + v18 + 1) != '0' )// 右
        {
          *(&v3[11 * v17] + v18++) = ' ';
          *(&v3[11 * v17] + v18) = '@';
        }
        break;
    }
    system("cls");
    for ( j = 0; j <= 20; ++j )
      puts(&v3[11 * j]);                        // 输出路径
    puts(&v21[100 * v25]);
    if ( v7[20] == '0' )                        // 救到猫后增加一个墙
    {
      v26 = sub_140011433(0i64);
      if ( v26 == 13376013 )                    // 得到key等于13376013
      {
        v25 = 1;
        v7[20] = ' ';                           // 输入正确的Key墙消失
        *(&v3[11 * v17] + v18) = ' ';
        v17 = 15;                               // 回到原点
        v18 = 0;
        v12[0] = '@';
        ++v25;
      }
      else
      {
        printf("error");
      }
    }
  }
  system("cls");
  Sleep(0x1F4u);
  Sleep(0xBB8u);
  function();
  exit(0);
}

迷宫先是要去救猫,救到猫时出现墙堵住路,输入正确的key,墙消失,回到原点,再逃出迷宫

可以看到最后function函数里显示flag为

The flag is HZCTF{md5(path)+score}

所以可以找到最后的路径为dddssssddwwwwddssddwwwwwwddddssaassddddwwwwddwwwwddd

再进行32位小写md5+分数即为flag

NSSCTF{811173b05afff098b4e0757962127eac13371337}

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

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

相关文章

cocosLua 之文本相关

Text 用于创建系统或ttf文本&#xff0c; 类结构&#xff1a; #mermaid-svg-bMIqhf5X7M9uF2Ba {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bMIqhf5X7M9uF2Ba .error-icon{fill:#552222;}#mermaid-svg-bMIqhf5X7…

走进社区客户端测试 | 得物技术

0.引言 社区 C 端质量体系建设思考&#xff1f; 询问一下 ChatGPT 1、关于社区客户端 1.1 社区端上功能 得物首页 搜索、发布、关注流、推荐流、沉浸式单列流、活动 tab、其他二级频道 tab 动态详情页 图文、视频、专栏、点评 私域 个人/他人主页、通讯录好友、微博好友…

不得不用ChatGPT的100个理由……

❝ 最近无论在哪&#xff0c;很多人都在吹ChatGPT无所不能&#xff0c;动不动就是AI要颠覆人类&#xff0c;很多人害怕有一天AI会取代自己&#xff0c;我认为明显是多虑了…… ❝ 当然&#xff0c;也有很多小白试用了ChatGPT之后&#xff0c;并没有感觉到他很强大&#xff0c;主…

车载以太网解决方案

近年来&#xff0c;为了满足智能网联汽车的开发要求&#xff0c;车载以太网技术开始逐渐进入人们的视野。而以太网技术已经成为下一代车载络架构的趋势之一&#xff0c;其发展之迅猛&#xff0c;使得各主机厂纷纷产生了浓厚的兴趣并投入研发。 一 为什么使用车载以太网 | 对高…

什么牌子台灯好用不伤眼睛?盘点国内值得入手的护眼灯

选择一款不伤眼睛的台灯主要看光照柔和、光照范围广&#xff0c;符合标准照度国A或国AA、显色指数Ra90以上、无眩光、RG0无危害蓝光、无可视频闪等&#xff0c;对于现在许多青少年的近视率增加&#xff0c;一旦近视就无法恢复&#xff0c;保护好眼睛&#xff0c;在学习阅读时&a…

SpringBoot使用ElasticSearch

ES官网&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch ES下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases#elasticsearch kibana官网&#xff1a;https://www.elastic.co/cn/downloads/kibana kibana下载地址&#xff1a;https://…

小红书笔记发布软件 批量上传视频

百收网SEO短视频矩阵发布丨9平台视频发布助手 软件简述&#xff1a;软件仅支持win系统&#xff0c; 软件使用的是网页版模拟协议软件不绑定电脑&#xff0c;任意换机&#xff0c;不限登录账号数量&#xff0c; 软件支持抖音&#xff0c;快手&#xff0c;视频号&#xff0c;西瓜…

P1034 [NOIP2002 提高组] 矩形覆盖

题目描述 在平面上有 &#xfffd;n 个点&#xff0c;每个点用一对整数坐标表示。例如&#xff1a;当 &#xfffd;4n4 时&#xff0c;44 个点的坐标分另为&#xff1a;&#xfffd;1(1,1)p1​(1,1)&#xff0c;&#xfffd;2(2,2)p2​(2,2)&#xff0c;&#xfffd;3(3,6)p3​…

设备树总结

设备树的概念: 设备树&#xff08;Device Tree:DT&#xff09;是用来描述设备信息的一种树形结构。设备树文件在linux内核启动的时候传递到内核被内核解析。设备树中每一个设备节点中的信息构成了一个属性链表&#xff0c;如果驱动想要使用这个设备信息&#xff0c;只需要在这…

UE4架构初识(五)

UE4仿真引擎学习 一、架构基础 1. GameInstance UE提供的方案是一以贯之的&#xff0c;为我们提供了一个GameInstance类。为了受益于UObject的反射创建能力&#xff0c;直接继承于UObject&#xff0c;这样就可以依据一个Class直接动态创建出来具体的GameInstance子类。 UGam…

Pytest接口自动化测试实战演练

结合单元测试框架pytest数据驱动模型allure 目录 api&#xff1a; 存储测试接口conftest.py :设置前置操作目前前置操作&#xff1a;1、获取token并传入headers&#xff0c;2、获取命令行参数给到环境变量,指定运行环境commmon&#xff1a;存储封装的公共方法connect_mysql.p…

C. Magic Ship(二分 + 前缀和)

Problem - C - Codeforces 你是一艘船的船长。最初你站在一个点(x1&#xff0c;y1)上&#xff08;很明显&#xff0c;海上的所有位置都可以用笛卡尔平面描述&#xff09;&#xff0c;你想要前往一个点(x2&#xff0c;y2)。 你知道天气预报——长度为n的字符串s&#xff0c;仅由…

实战详解Docker快速搭建部署ELK

一.安装前须知 以下步骤在 VMware 中的 centos 7 中操作&#xff0c;ip 地址为&#xff1a;192.168.161.128&#xff1b; 注意安装的时候最好统一版本&#xff0c;否则后面会出现许多问题&#xff0c;进官网搜索对应镜像&#xff0c;查看 Tags 标签下的版本&#xff0c;目前我…

记一次死锁问题

最近在做一个需求&#xff0c;碰到了死锁的问题&#xff0c;记录下解决问题的过程 背景 这个需求要改动一个接口&#xff0c;我这边称为A接口&#xff0c;原先的逻辑是A接口内部会调用c方法&#xff0c;c方法是一个dubbo方法&#xff0c; 现在需要再A接口里添加调用B方法&…

springcloud之Feign、ribbon设置超时时间和重试机制的总结

目录标题 超时时间ribbon和Feignribbon和Feign默认超时时间关于ribbon和Feign超时时间配置说明 关于hystrix默认超时时间与配置说明 ribbon的重试机制重试的次数hystrix超时时间举个例子 超时时间 feign/ribbon对应的是请求的时间 hystrix对应的是断路器的时间 一般情况下 都是…

【Linux】2. 常见指令

1. 操作系统的定义 在真正了解Linux操作系统之前&#xff0c;我们需要初步明确什么是操作系统 Linux下的基本指令 指令的作用是什么&#xff0c;其实就是相当于Windows的基本操作&#xff0c;Linux操作系统是以命令行显示的&#xff0c;而Windows则是以图形化界面的方式展现…

图像融合方向:《Deep Image Blending》论文理解

《Deep Image Blending》论文理解 论文&#xff1a;《Deep Image Blending》WACV 2020 链接&#xff1a;Deep Image Blending 本文目录 《Deep Image Blending》论文理解论文创新点具体实现思路文中使用的基准方法文章内容解析使用模型整体架构两阶段算法详情第1阶段第2阶段 损…

一款高效、可靠的自动化测试平台,提升效率、降低测试成本

一、开源项目简介 扬帆测试平台是一款高效、可靠的自动化测试平台&#xff0c;旨在帮助团队提升测试效率、降低测试成本。该平台包括用例管理、定时任务、执行记录等功能模块&#xff0c;支持多种类型的测试用例&#xff0c;目前支持API(http和grpc协议)、性能&#xff0c;并且…

轻量级服务器nginx:负载均衡

负载均衡就是让每个设备&#xff0c;以同样的概率&#xff0c;处理用户对于服务器的任务请求&#xff0c;默认采用的负载调度策略就是轮流询问&#xff0c;Nginx作为反向代理服务器安装在服务端&#xff0c;Nginx的功能就是把请求转发给后面的应用服务器. 这里写目录标题 一 负…

差分优化算法——DE

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 目录 一、DE1.步骤2.特点 二、DE Optimiza1.函数最小值问题2.差分进化算法求解2.Java 实现与结果绘图 一、DE 差分进化算法是一种基于群体智能的优化算法&#xff0c;由Storn和Price于1995年提出&#xff0c;最早用…