GDOUCTF2023-部分re复现
目录
[GDOUCTF 2023]Check_Your_Luck
[GDOUCTF 2023]Tea
[GDOUCTF 2023]doublegame
[GDOUCTF 2023]Check_Your_Luck
打开题目是一串代码,明显的z3约束器求解
直接上脚本
import z3
from z3 import Reals = 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] BYREFchar v4[44]; // [rsp+5Ch] [rbp+3Ch] BYREFchar v5[44]; // [rsp+88h] [rbp+68h] BYREFchar v6[22]; // [rsp+B4h] [rbp+94h] BYREFchar v7[22]; // [rsp+CAh] [rbp+AAh] BYREFchar v8[44]; // [rsp+E0h] [rbp+C0h] BYREFchar v9[44]; // [rsp+10Ch] [rbp+ECh] BYREFchar v10[44]; // [rsp+138h] [rbp+118h] BYREFchar v11[22]; // [rsp+164h] [rbp+144h] BYREFchar v12[22]; // [rsp+17Ah] [rbp+15Ah] BYREFchar v13[44]; // [rsp+190h] [rbp+170h] BYREFchar v14[44]; // [rsp+1BCh] [rbp+19Ch] BYREFchar v15[24]; // [rsp+1E8h] [rbp+1C8h] BYREFint 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] BYREFchar v22[100]; // [rsp+324h] [rbp+304h] BYREF_BYTE v23[828]; // [rsp+388h] [rbp+368h] BYREFchar 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}
相关文章:

GDOUCTF2023-部分re复现
目录 [GDOUCTF 2023]Check_Your_Luck [GDOUCTF 2023]Tea [GDOUCTF 2023]doublegame [GDOUCTF 2023]Check_Your_Luck 打开题目是一串代码,明显的z3约束器求解 直接上脚本 import z3 from z3 import Reals z3.Solver() vReal(v) xReal(x) yReal(y) wReal(w) zRea…...

Java学习17(IO模型详解)
1、何为IO? I/O(Input/Outpu) 即输入/输出 。 从计算机结构的角度来解读一下 I/O。 根据冯.诺依曼结构,计算机结构分为 5 大部分:运算器、控制器、存储器、输入设备、输出设备。 输入设备(比如键盘&am…...

Vue-全局过滤器以及进阶操作
前言 上篇文件讲述了,Vue全局过滤器的基本使用:Vue过滤器的基本使用 本篇将延续上文,讲述vue中过滤器的进阶操作 过滤器传参 如果有一天,多个地方使用过滤器,而且需要传递参数,那么可以这么写 多个过滤…...

财报解读:涅槃重生之后,新东方还想再造一个“文旅甄选”?
新东方逐渐走出了“微笑曲线”。 图源:新东方2023财年Q3财报 2023年4月19日,新东方披露了2023财年Q3财报(截至2023年2月28日止),营收7.5亿美元,同比增长22.8%;归母净利润为8165万美元ÿ…...
华为OD机试 - 过滤组合字符串(Python)
题目描述 每个数字关联多个字母,关联关系如下: 0 关联 “a”,”b”,”c” 1 关联 “d”,”e”,”f” 2 关联 “g”,”h”,”i” 3 关联 “j”,”k”,”l” 4 关联 “m”,”n”,”o” 5 关联 “p”,”q”,”r” 6 关联 “s”,”t” 7 关联 “u”,”v” 8 关联 “w”,”x” 9 …...

maven简单使用
实验课的作业用一大堆框架/库,统统要用maven管理。 头一次用,真痛苦。 所幸得以解决,maven真香~ 一步一步来。 1. maven 不是java人,只能说说粗浅的理解了。 简单来说,maven是一个管理项目的工具&…...

HTML学习笔记一
目录 HTML学习笔记 一、HTML标签 1、HTML语法规范 1.1标签的语法概述 1.2标签关系 2、HTML基本结构标签 2.1第一个HTML 2.2基本结构标签总结 3、开发工具 4、HTML常用标签 4.1标签的语义 4.2标题标签 4.3段落和换行标签 4.4文本格式化标签 4.5div和span标签 4.…...

人工智能十大流行算法,通俗易懂讲明白
人工智能是什么?很多人都知道,但大多又都说不清楚。 事实上,人工智能已经存在于我们生活中很久了。 比如我们常常用到的邮箱,其中垃圾邮件过滤就是依靠人工智能;比如每个智能手机都配备的指纹识别或人脸识别&#x…...

支持中英双语和多种插件的开源对话语言模型,160亿参数
一、开源项目简介 MOSS是一个支持中英双语和多种插件的开源对话语言模型,moss-moon系列模型具有160亿参数,在FP16精度下可在单张A100/A800或两张3090显卡运行,在INT4/8精度下可在单张3090显卡运行。MOSS基座语言模型在约七千亿中英文以及代码…...
SQL基础培训10-复杂查询原理
知识点: 1、SQL查询语句逻辑执行顺序 下面是一个查询语句的逻辑执行顺序(每段语句都标明了执行顺序号): 执行1:FROM 执行2:...

如何搭建信息存储中心?资源共享方案之搭建ftp个人服务器
serveru是一款由Rob Beckers开发的ftp服务器软件,全称为:serv-u ftp server,它功能强大又易于使用。ftp服务器用户通过ftp协议能在internet上共享文件。FTP协议是专门针对在两个系统之间传输大的文件开发出来的,它是TCP/IP协议的一…...

【LeetCode】188. 买卖股票的最佳时机 IV
188. 买卖股票的最佳时机 IV(困难) 思路 状态定义 一、首先确定要一天会有几种状态,不难想到有四种: a.当天买入了股票;b.当天卖出了股票;c.当天没有操作,但是之前是买入股票的状态ÿ…...

android studio RadioButton单选按钮
1.定义 <!--单选按钮--> <TextViewandroid:layout_marginTop"10dp"android:layout_width"match_parent"android:layout_height"wrap_content"android:text"请选择你的性别:"> </TextView> <RadioGrou…...
AI大模型快速发展,我们该如何应对?
文章目录 提问问题范例Prompt 公式 如何准确提问 随着人工智能技术的不断发展,聊天型大语言模型工具如 ChatGPT 在解决各种实际问题时具有越来越广泛的应用。这一技术的快速发展,不仅带来了更高的工作效率和更高的精度,同时也改变了人类的工作…...

java多线程BlockingDeque的三种线程安全正确退出方法
本文介绍两种BlockingDeque在多线程任务处理时正确结束的方法 一般最开始简单的多线程处理任务过程 把总任务放入BlockingDeque创建多个线程,每个线程内逻辑时,判断BlockingDeque任务是否处理完,处理完退出,还有任务就BlockingDe…...

从STM32F407到AT32F407(一)
雅特力公司的MCU有着性能超群,价格优越的巨大优势,缺点是相关资料少一些,我们可以充分利用ST的现有资源来开发它。 我用雅特力的STM32F437开发板,使用原子 stm32f407的开发板自带程序,测试串口程序,原设定…...

【数据结构】顺序表和链表基本实现(含全代码)
文章目录 一、什么是线性表1. 什么是顺序表动态开辟空间和数组的问题解释LeetCode-exercise 2. 什么是链表2.1链表的分类2.2常用的链表结构及区别2.3无头单向非循环链表的实现2.4带头双向循环链表的实现2.5循序表和链表的区别LeetCode-exercise 3. 快慢指针LeetCode-exercise 一…...

CMake : Linux 搭建开发 - g++、gdb
目录 1、环境搭建 1.1 编译器 GCC,调试器 GDB 1.2 CMake 2、G 编译 2.1 编译过程 编译预处理 *.i 编译 *.s 汇编 *.o 链接 bin 2.2 G 参数 -g -O[n] -l、-L -I -Wall、-w -o -D -fpic 3、GDB 调试器 3.1 调试命令参数 4、CMake 4.1 含义 4.2…...

大数据实战 --- 美团外卖平台数据分析
目录 开发环境 数据描述 功能需求 数据准备 数据分析 RDD操作 Spark SQL操作 创建Hbase数据表 创建外部表 统计查询 开发环境 HadoopHiveSparkHBase 启动Hadoop:start-all.sh 启动zookeeper:zkServer.sh start 启动Hive: nohup …...

三大本土化战略支点,大陆集团扩大中国市场生态合作「朋友圈」
“在中国,大陆集团已经走过30余年的发展与耕耘历程,并在过去10年间投资了超过30亿欧元。中国市场也成为了我们重要的‘增长引擎’与‘定海神针’。未来,我们将继续深耕中国这个技术导向的市场。”4月19日上海车展上,大陆集团首席执…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...