GDOUCTF2023-Reverse WP

文章目录

  • [GDOUCTF 2023]Check_Your_Luck
  • [GDOUCTF 2023]Tea
  • [GDOUCTF 2023]easy_pyc
  • [GDOUCTF 2023]doublegame
  • [GDOUCTF 2023]L!s!
  • [GDOUCTF 2023]润!

[GDOUCTF 2023]Check_Your_Luck

image-20231128094404871

根据 if 使用z3约束求解器。

EXP:

from z3 import *
# 创建整数变量
v, w, x, y, z = Ints('v w x y z')
# 创建Z3求解器
solver = Solver()
solver.add(v * 23 + w * -32 + x * 98 + y * 55 + z * 90 == 333322)
solver.add(v * 123 + w * -322 + x * 68 + y * 67 + z * 32 == 707724)
solver.add(v * 266 + w * -34 + x * 43 + y * 8 + z * 32 == 1272529)
solver.add(v * 343 + w * -352 + x * 58 + y * 65 + z * 5 == 1672457)
solver.add(v * 231 + w * -321 + x * 938 + y * 555 + z * 970 == 3372367)# 检查是否存在解
if solver.check() == sat:model = solver.model()output_str = f"flag{{{model[v]}_{model[w]}_{model[x]}_{model[y]}_{model[z]}}}"print(output_str)
else:print("方程组无解")
# flag{4544_123_677_1754_777}

[GDOUCTF 2023]Tea

image-20231128094815207

64bit的文件。IDA64打开

image-20231128095030838

根据字符串定位

image-20231128095118816

image-20231128103247829

这里的v7是错误的,后面进行了修改。

之后对v8和v7进行操作。

image-20231128103321373

一个XTEA的加密,找到密文,提取出来

image-20231128103406832

加密的逻辑大概就是,明文的第一位和第二位进行XTEA加密,之后加密后的第二位继续和第三位XTEA,依次下去,逆向一下就好。

写个EXP解密:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>void decrypt (uint32_t* v,uint32_t* k,int wheel) {uint32_t v0=v[0], v1=v[1], i;uint32_t delta=0xF462900;uint32_t sum = delta*(33+wheel);for (i=0; i<33; i++) {sum -= delta;v1 -= (((v0 * 16) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11 ) & 3]);v0 -= (((v1 * 16) ^ (v1 >> 5)) + v1) ^ (sum + k[(sum & 3)])^sum;}v[0]=v0; v[1]=v1;
}int main()
{uint32_t enflag[] = {444599258, 4154859931, 1226314200, 4060164904, 359413339, 1013885656, 2228535080, 4045045479, 856928850, 3718242937};uint32_t key[4] = {2233,4455,6677,8899};for(int i=8;i>=0;i-=1){uint32_t temp[2];        temp[0] = enflag[i];temp[1] = enflag[i+1];int wheel = i;decrypt(temp,key,wheel);enflag[i] = temp[0];enflag[i+1] = temp[1];}for (int i = 0; i < 10; i++){for (int j = 3; j>=0; j--){printf("%c", (enflag[i] >> (j * 8)) & 0xFF);}}return 0;
}
//HZCTF{hzCtf_94_re666fingcry5641q  q}
//HZCTF{hzCtf_94_re666fingcry5641qq}

[GDOUCTF 2023]easy_pyc

pyc文件,用uncompyle6反编译

image-20231128103658740

image-20231128103839706

一个简单的rsa加密。

EXP:

d = inverse(e,(p-1)*(q-1))
n = p*q
m = pow(c,d,n)
print(long_to_bytes(m))
# flag{IfYouWantItThenYouHaveToTakeIt}

[GDOUCTF 2023]doublegame

image-20231128104028527

通过查找字符串定位到关键函数。

image-20231128104120885

函数点进去看一看,最后发现都没有什么用。回去查看一下字符串,发现一个GAME OVER。

image-20231128104800098

找到了。第一个game。如果分数大于13371337就进行第二个游戏,即score。

if下面的函数。

image-20231128104905640

一个迷宫题,用dfs解:

maze = ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', ' ', '0', ' ', '0', ' ', '0', ' ', ' ', ' ', ' ', ' ', '0', ' ', ' ', ' ', ' ', ' ', '0', ' ', '0', '0', ' ', '0', ' ', '0', ' ', '0', '0', '0', '0', '0', ' ', '0', '0', '0', '0', '0', ' ', '0', ' ', '0', '0', ' ', '0', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0', ' ', '0', '0', ' ', '0', '0', '0', ' ', '0', '0', '0', ' ', '0', ' ', '0', '0', '0', ' ', '0', ' ', '0', ' ', '0', '0', ' ', '0', ' ', ' ', ' ', ' ', ' ', '0', ' ', '0', ' ', '0', ' ', ' ', ' ', '0', ' ', '0', ' ', '0', '0', ' ', '0', ' ', '0', ' ', '0', '0', '0', '0', '0', ' ', '0', '0', '0', ' ', '0', '0', '0', ' ', '0', '0', ' ', '0', ' ', '0', ' ', ' ', ' ', ' ', ' ', '0', ' ', ' ', ' ', '0', ' ', '0', ' ', ' ', ' ', ' ', '0', ' ', '0', '0', '0', ' ', '0', ' ', '0', ' ', '0', '0', '0', ' ', '0', ' ', '0', ' ', '0', ' ', '0', '0', ' ', ' ', ' ', ' ', ' ', '0', ' ', '0', ' ', '0', ' ', '0', ' ', '0', ' ', '0', ' ', '0', ' ', '0', '0', ' ', '0', '0', '0', '0', '0', ' ', '0', '0', '0', ' ', '0', '0', '0', ' ', '0', ' ', '0', ' ', '0', '0', ' ', ' ', ' ', ' ', ' ', '0', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0', ' ', ' ', ' ', '0', ' ', '0', '0', '0', '0', ' ', '0', ' ', '0', ' ', '0', ' ', '0', '0', '0', ' ', '0', ' ', '0', ' ', '0', ' ', '0', '0', ' ', '0', ' ', '0', ' ', '0', ' ', '0', ' ', '0', ' ', ' ', ' ', '0', ' ', '0', ' ', '0', ' ', '0', '0', ' ', '0', '0', '0', '0', '0', '0', '0', ' ', '0', ' ', '0', '0', '0', ' ', '0', '0', '0', '0', '0', ' ', ' ', ' ', ' ', '0', ' ', ' ', ' ', '0', ' ', '0', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0', '0', ' ', '0', ' ', '0', ' ', '0', ' ', '0', ' ', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', ' ', '0', ' ', '0', ' ', '0', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0', '0', '0', '0', ' ', '0', ' ', '0', '0', '0', '0', '0', ' ', '0', ' ', '0', '0', '0', ' ', '0', '0', '0', '0', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0', ' ', '0', ' ', ' ', ' ', '0', ' ', ' ', ' ', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0']maze[21*7+20] = '2'
# maze[x * 21 + y]
def check_point_valid(map, x, y):if (x >= 0) and (x <= 20) and (y >= 0) and (y <= 20):return (map[x * 21 + y] != '0') and ((map[x * 21 + y] == ' ') or (map[x * 21 + y] == '2'))else:return Falsedef gen_nex(map, x, y):all_dir = []# if check_point_valid(map, x - 1, y, z):# all_dir.append((x - 1, y, z, 'q'))# if check_point_valid(map, x + 1, y, z):# all_dir.append((x + 1, y, z, 'u'))if check_point_valid(map, x + 1, y):all_dir.append((x + 1, y, 's'))if check_point_valid(map, x - 1, y):all_dir.append((x - 1, y, 'w'))if check_point_valid(map, x, y - 1):all_dir.append((x, y - 1, 'a'))if check_point_valid(map, x, y + 1):all_dir.append((x, y + 1, 'd'))return all_dirdef check_success(map, x, y):if map[x * 21 + y] == '2':return Trueelse:return Falsedef dfs(mapb, x, y, path):map = mapb.copy()if map[x * 21 + y] != '2':map[x * 21 + y] = '0'if check_success(map, x, y):print(path)return Truenext_point = gen_nex(map, x, y)for n in next_point:pathn = path + n[2]dfs(map, n[0], n[1], pathn)outpus = ""
dfs(maze, 15, 0, outpus)

可以解出俩条路径,用最短的,dddssssddwwwwddssddwwwwwwddddssaassddddwwwwddwwwwddd

再加上一个MD5加密,

image-20231128113204670

最后加上分数得到flag。

HZCTF{811173b05afff098b4e0757962127eac13371337}


[GDOUCTF 2023]L!s!

image-20231128113400183

俩个文件。

用Bindiff 检查文件差异性

image-20231128113520312

IDA分析后会留下一个i64或idb文件。

image-20231128113603145

Ctrl+6 快捷键打开,(有些可能没插件)

image-20231128113640972

image-20231128113705095

绿色的是匹配度最高的。这里可以发现只有一个有差异。应该就是经过修改的地方。

image-20231128113752938

发现是 extract_dirs_from_files这个函数。

用IDA打开另一个文件,找到这个函数,比对俩个函数,

image-20231128113944452

发现这里多出了一部分内容。

可以看到就只是做了一个异或而已。

EXP:

enc = [ 0x04, 0x16, 0x0F, 0x18, 0x0A, 0x37, 0x2E, 0x7D,0x22, 0x28, 0x25, 0x2A, 0x2A, 0x13, 0x7D, 0x3F,0x13, 0x2D, 0x13, 0x39, 0x3F, 0x7F, 0x2A, 0x39,0x20, 0x13, 0x38, 0x7C, 0x7C, 0x20, 0x31, 0x00]
for j in range(100):flag = []for i in range(len(enc)):flag.append(chr(enc[i]^j))print(''.join(flag))
# HZCTF{b1ndiff_1s_a_us3ful_t00l}L

[GDOUCTF 2023]润!

image-20231128114747225

UPX壳,看到EP Section UPX标志被修改了。

image-20231128114835213

用WInhex修改回来。

image-20231128114909407

image-20231128114939139

image-20231128115004700

一个迷宫题,不过是三维迷宫。

image-20231128115225050

一开始init处创建了一次迷宫(一层)后面moving里面每u一次都会layer++。这里layer就是楼的意思。

用动态调试,输入uuuuuuuuuuuuuuuuuuu连续创建迷宫,把迷宫copy出来;

EXP:

maze = [0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 2]# maze[x * 64 + y * 8 + z]
def check_point_valid(map, x, y, z):if (x >= 0) and (x <= 7) and (y >= 0) and (y <= 7) and (z >= 0) and (z <= 7):return (map[x * 64 + y * 8 + z] != 1) and ((map[x * 64 + y * 8 + z] == 0) or (map[x * 64 + y * 8 + z] == 2))else:return Falsedef gen_nex(map, x, y, z):all_dir = []if check_point_valid(map, x - 1, y, z):all_dir.append((x - 1, y, z, 'n'))if check_point_valid(map, x + 1, y, z):all_dir.append((x + 1, y, z, 'u'))if check_point_valid(map, x, y - 1, z):all_dir.append((x, y - 1, z, 'w'))if check_point_valid(map, x, y + 1, z):all_dir.append((x, y + 1, z, 's'))if check_point_valid(map, x, y, z - 1):all_dir.append((x, y, z - 1, 'a'))if check_point_valid(map, x, y, z + 1):all_dir.append((x, y, z + 1, 'd'))return all_dirdef check_success(map, x, y, z):if map[x * 64 + y * 8 + z] == 2:return Trueelse:return Falsedef dfs(mapb, x, y, z, path):map = mapb.copy()if map[x * 64 + y * 8 + z] != 2:map[x * 64 + y * 8 + z] = 1if check_success(map, x, y, z):print(path)return Truenext_point = gen_nex(map, x, y, z)for n in next_point:pathn = path + n[3]dfs(map, n[0], n[1], n[2], pathn)outpus = ""
dfs(maze, 0, 0, 0,  outpus)

解出来ssddssuuwwddndduuussdussasauudd

CTF-Reverse 迷宫地图类题目分析‘‘DFS和BFS算法‘‘

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

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

相关文章

万字解析设计模式之迭代器模式、备忘录模式

一、迭代器模式 1.1概述 迭代器模式是一种行为型设计模式&#xff0c;它允许在没有暴露其底层表现形式的情况下遍历集合对象。迭代器模式提供一种通用的遍历机制&#xff0c;可以遍历任何类型的集合&#xff0c;包括数组、列表、树等。通过这种模式&#xff0c;可以实现一种通…

【华为OD】在第一人称射击游戏中,玩家通过键盘的 A 、 S 、 D 、 W 四个按键控制游戏人物分别向左、向后、向右、向前进行移动,从而完成走位

在第一人称射击游戏中,玩家通过键盘的 A 、 S 、 D 、 W 四个按键控制游戏人物分别向左、向后、向右、向前进行移动,从而完成走位。假设玩家每按动一次键盘,游戏人物会向某个方向移动一步,如果玩家在操作一定次数的键盘并且各个方向的步数相同时, 此时游戏人物必定会回到原…

宝塔面板的使用

记录一下&#xff1a; 后台是SpringBoot项目&#xff0c;前台是Vue项目&#xff0c;前后端分离&#xff0c;要用宝塔布署上腾讯云服务器。 后台&#xff1a;配置文件的数据写云端的。有关localhost的要改成云服务器的公网IP。执行package命令&#xff0c;双击。将打包出来的j…

大数据-之LibrA数据库系统告警处理(ALM-37013 MPPDBServer实例SOCKET异常)

告警解释 当操作系统的其它进程占用GTM实例监听端口号或双机端口号时&#xff0c;产生该告警。 告警属性 告警ID 告警级别 可自动清除 37013 严重 是 告警参数 参数名称 参数含义 ServiceName 产生告警的服务名称 RoleName 产生告警的角色名称 HostName 产生告…

C 语言-循环嵌套-函数

C 语言 - 循环嵌套、函数 1. 循环嵌套 1.1 作用 循环 套 循环。 1.2 使用 需求1&#xff1a; 打印以下图形&#xff1a; * * * * * * * * * * * * * * * *代码&#xff1a; 1、使用循环打印 #include <stdio.h> int main(int argc, char const *argv[]) {for (int i…

云原生CI/CD流水线发布

文章目录 前言k8s组件与操作流程k8s组件创建pod k8s代码&&打包k8s yamldeploymentservicek8s volumesdemo CIgitlabCI runner CD配置git repository安装argo创建argo cd的配置yamlargocd和helm结合argocd hookargocd 发布 RBACoperatorhelmprometheus && grafn…

曝光!WPS用户信息或被盗用,紧急行动,迅软DSE数据加密应时而动!

WPS摊上大事了&#xff01;有用户发现&#xff0c;在WPS更新的一版用户隐私政策中&#xff0c;明确提到&#xff1a;“我们将对您主动上传的文档材料&#xff0c;在处理后作为AI训练的基础材料使用。”换句话说&#xff0c;WPS有可能“白嫖”用户的文档信息&#xff0c;用于投喂…

CVE-2020-11651(SaltStack认证绕过)漏洞复现

简介 SaltStack是使用Python开发的一个服务器基础架构集中化管理平台,底层采用动态的连接总线,使其可以用于编配,远程执行, 配置管理等等。 Salt非常容易设置和维护,而不用考虑项目的大小。从数量可观的本地网络系统,到跨数据中心的互联网部署,Salt设计为在任意数量的…

npm run build打包jquery项目

build.js 文件代码如下 const fs require(fs); const path require(path);// 指定要打包的HTML文件路径和输出目录路径 var pathName "./"; const outputDir dist;// 匹配html文件 var ipReg /\.(htm|html|js|version)$/i;// 创建输出目录&#xff08;如果不存…

顺序表总结

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 &#x1f324;️arraylist的简…

JAVA多线程总结

一、概念&#xff1a; 1、什么是多任务 多任务就是在同一时间做多件事情&#xff0c;如边吃饭边玩手机等。看起来是多个任务都在做&#xff0c;本质上我们的大脑在同一时间依旧只做了一件件事情 2、什么是程序 程序是指令和数据的有序集合&#xff0c;其本身没有任…

洗地机应该怎么选?希亦、必胜、米博、添可、小米洗地机实测推荐

作为一个常年测评智能家居的博主&#xff0c;关于洗地机的测评使用这些年也积累了不少的体验感受。以至于常被周边的朋友问到&#xff0c;洗地机到底是不是真的好用&#xff1f;洗地机有什么优点吗&#xff1f;选购的时候应该怎么选呢&#xff1f;洗地机什么牌子比较好呢&#…

chatglm3 vllm部署推理;api访问使用

用fastchat部署暂时有各种问题,参考:https://github.com/lm-sys/FastChat/pull/2622 本篇用vllm运行测试可以使用 1、vllm运行 python -m vllm.entrypoints.api_server --model /***/chatglm/chatglm3-6b/

【C语言】深入理解数据类型转换与运算

文章目录 1.数据类型转换在分析源程序之前&#xff0c;我们需要了解几个基本概念&#xff1a;现在来分析源程序中的变量及其对应的十进制真值以及扩展操作方式&#xff1a; 1.1. short si -32768;1.2. unsigned short usi si;1.3. int i si;1.4. unsigned ui usi; 2&#x…

【开源】基于JAVA的农村物流配送系统

项目编号&#xff1a; S 024 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S024&#xff0c;文末获取源码。} 项目编号&#xff1a;S024&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2…

深度学习18

卷积层 查看每个数据 使用tensorboard查看 池化层 使用数据集进行训练 创建实例&#xff0c;使用tensorboard进行显示 最大池化保留了图片信息&#xff0c;神经网络训练的数据量大大减小&#xff0c;可以加快训练 非线性激活 非线性激活为神经网络加入了一些非线性的特质…

Java学习:网络编程

一、TCP编程 1.服务器端建立通讯&#xff08;ServerSocket的使用&#xff09; 服务器建立通讯ServerSocket。服务器建立Socket等待客户端连接并接收。建立IO输入流读取客户端发送的数据和向客户端发送数据。 具体代码&#xff1a; import java.io.BufferedReader; import ja…

CTFSHOW sqll注入

号过滤绕过 号和不加通配符的 like 是一样的。 还可以使用 < >号来绕过&#xff0c;<> 在mysql中等于! 如果在加一个! 双重否定代表肯定 就是了 空格过滤绕过 /**/ &#xff0c;()&#xff0c;&#xff0c;tab&#xff0c;两个空格 or and xor not 过滤绕过 a…

java JDBCUtils 使用静态代码块连接数据库 全程值保持一次连接

\src\com\data\entity\JDBCUtils.java 使用静态代码块连接数据库 全程值保持一次连接 package com.data.entity;import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DriverManagerDataSource;import javax.sql.DataSource;pub…

正点原子linux应用编程——入门篇2

系统信息与系统资源 本章重点学习如何通过Linux系统调用或C库函数获取系统信息&#xff0c;譬如获取系统时间、日期 以及设置系统时间、日期等&#xff1b;除此之外&#xff0c;还会学习Linux系统下的/proc虚拟文件系统&#xff0c;包括/proc 文件系统是什么以及如何从/proc文…