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 False


def 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_dir


def check_success(map, x, y):
    if map[x * 21 + y] == '2':
        return True
    else:
        return False


def 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 True

    next_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 False


def 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_dir


def check_success(map, x, y, z):
    if map[x * 64 + y * 8 + z] == 2:
        return True
    else:
        return False


def dfs(mapb, x, y, z, path):
    map = mapb.copy()
    if map[x * 64 + y * 8 + z] != 2:
        map[x * 64 + y * 8 + z] = 1
    if check_success(map, x, y, z):
        print(path)
        return True

    next_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算法‘‘

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】探索C++模板编程

文章目录 什么是C模板&#xff1f;模板的基本语法类型模板参数模板函数的示例类模板的示例总结 C模板是一种强大的编程工具&#xff0c;它可以实现泛型编程&#xff0c;使代码更加灵活和可重用。本篇博客将介绍C模板的基本语法、类型模板参数和模板函数的使用&#xff0c;并通过…

第20章:多线程

20.1 线程简介 在Java中&#xff0c;并发机制非常重要&#xff0c;程序员可以在程序中执行多个线程&#xff0c;每个线程完成一个功能&#xff0c;并与其他线程并发执行&#xff0c;这种机制被称为多线程。但是&#xff0c;并不是所有编程语言都支持多线程。 线程的特点&#…

集群 CPU 利用率均值达 45% ,揭秘小红书规模化混部技术实践

根据 Gartner 预测数据显示&#xff1a;2024 年全球 IT 支出预计将达到 5.1 万亿美元&#xff0c;比 2023 年增长 8 %。然而&#xff0c;该机构的另一项调查数据显示&#xff1a;全球数据中心服务器平均 CPU 利用率普遍低于 20%&#xff0c;存在巨大的资源浪费。据测算&#xf…

Python内置函数与标准库函数的解释示例

一、内置函数与标准库函数的区分 Python 解释器自带的函数叫做内置函数&#xff0c;这些函数可以直接使用&#xff0c;不需要导入某个模块。 Python 解释器也是一个程序&#xff0c;它给用户提供了一些常用功能&#xff0c;并给它们起了独一无二的名字&#xff0c;这些常用功能…

C语言——标识符

一、标识符是什么 标识符是C程序的最基本组成部分&#xff0c;例如&#xff1a;变量名称、函数名称、数据类型等等&#xff0c;都是一个标识符。标识符的要求是&#xff1a;必须由字母&#xff08;区分大小写&#xff09;、数字、下划线组成。而且&#xff0c;标识符的第一个字…

Django回顾【一】

一、Web应用程序 Web应用程序是一种可以通过Web访问的应用程序&#xff0c;程序的最大好处是用户很容易访问应用程序&#xff0c;用户只需要有浏览器即可&#xff0c;不需要再安装其他软件。应用程序有两种模式C/S、B/S。 C/S&#xff1a;客户端<----->服务端 例如My…

共筑关基安全防线,开源网安加入中关村华安关键信息基础设施安全保护联盟

近日&#xff0c;开源网安正式加入“中关村华安关键信息基础设施安全保护联盟”&#xff08;以下简称&#xff1a;关保联盟&#xff09;成为会员单位&#xff0c;进一步加强与行业内重要机构、企业的协同合作&#xff0c;推动关键信息基础设施安全保护领域的生态建设。 未来&am…

9.Spring 整合 Redis

引入依赖&#xff1a;spring-boot-starter-data-redis配置 Redis&#xff1a;配置数据库参数、编写配置类&#xff0c;构造 RedisTemplate访问 Redis&#xff1a; redisTemplate.opsForValue() redisTemplate.opsForHash() redisTemplate.opsForList() redisTemplate.opsForSe…

Codebeamer—软件全生命周期管理轻量级平台

产品概述 Codebeamer涵盖了软件研发的生命周期&#xff0c;在一个整合的平台内支持需求管理、测试管理、软件开发过程管理以及项目管理等&#xff0c;同时具有IToperations&DevOps相关的内容&#xff0c;并支持变体管理的功能。对于使用集成的应用程序生命周期管理&#xf…

LVS-DR实验

实验前准备 DR服务器&#xff1a;192.168.188.11 192.168.188.15 NFS服务器&#xff1a;192.168.188.14 Web服务器1&#xff1a;192.168.188.12 Web服务器2&#xff1a;192.168.188.13 Vip&#xff1a;192.168.188.188 客户端&#xff1a;192.168.188.200 配置负载均衡调度…

Stable Video Diffusion重磅发布:基于稳定扩散模型的AI生成视频

最近&#xff0c;stability.ai发布了稳定视频扩散&#xff0c;这是stability.ai第一个基于图像模型稳定扩散的生成视频基础模型。现在可以在研究预览中看到&#xff0c;这个最先进的生成人工智能视频模型代表着stability.ai在为每种类型的人创建模型的过程中迈出了重要的一步。…

C++学习之路(七)C++ 实现简单的Qt界面(消息弹框、按钮点击事件监听)- 示例代码拆分讲解

这个示例创建了一个主窗口&#xff0c;其中包含两个按钮。第一个按钮点击时会显示一个简单的消息框&#xff0c;第二个按钮点击时会执行一个特定的操作&#xff08;在这个例子中&#xff0c;仅打印一条调试信息&#xff09;。 功能描述&#xff1a; 创建窗口和布局&#xff1a;…

linux 内核线程

内核线程类似于用户进程&#xff0c;通常用于并发处理些工作&#xff0c;它是一种在内核空间实现后台任务的方式&#xff0c;并且可以参与时间片轮转调度。 内核线程可以进行繁忙的异步事件处理&#xff0c;也可以睡眠等待某事件的发生&#xff0c;内核线程可以访问内核函数和…

名词解释之EID和SR

大家在聊辅助驾驶时&#xff0c;经常会发现有名词叫SR&#xff0c;或者EID&#xff0c;理想的环境感知界面叫EID&#xff0c;而其他很多车型里大家管那个界面叫SR。我们下面具体看下这两个词具体指什么。 SR是“Situational Awareness”的缩写,意思是环境感知或场景认知。 SR系…

【2023CANN训练营第二季】——Ascend C自定义算子工程介绍及实验

一、自定义算子工程介绍与创建 自定义算子工程是一个包含用户编写的host侧和kerne|侧算子实现文件的&#xff0c;用于编译和安装自定义算子run包的工程框架。 CANN软件包中提供了工程创建工具msopgen&#xff0c;开发者可以输入算子原型定义文件生成Ascend C算子开发工程。 需…

每日一题--寻找重复数

蝶恋花-王国维 阅尽天涯离别苦&#xff0c; 不道归来&#xff0c;零落花如许。 花底相看无一语&#xff0c;绿窗春与天俱莫。 待把相思灯下诉&#xff0c; 一缕新欢&#xff0c;旧恨千千缕。 最是人间留不住&#xff0c;朱颜辞镜花辞树。 目录 题目描述&#xff1a; 思路分析…

JVM运行时数据区域、对象内存分配、内存溢出异常总结

深入理解java虚拟机第二章 二、运行时数据区域2.2.1 程序计数器2.2.2 Java虚拟机栈2.2.3 本地方法栈2.2.4 Java堆2.2.5 方法区2.2.6 运行时常量池2.2.7 直接内存 三、HotSpot虚拟机对象解密2.3.1 对象的创建对象如何分配内存&#xff1f;对象的创建如何处理并发问题&#xff1f…

浏览器触发下载Excel文件-Java实现

目录 1:引入maven 2:代码实现 3.导出通讯录信息到Excel文件 4.生成并下载Excel文件部分解释 1:引入maven 添加依赖:首先,在你的项目中添加EasyExcel库的依赖。你可以在项目的构建文件(如Maven的pom.xml)中添加以下依赖项:<dependency><groupId>com.alib…

vue3 setup语法糖,常用的几个:defineProps、defineEmits、defineExpose、

vue3和vue2组件之间传参的不同 <script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。 <script setup> 中的代码会在每次组件实例被创建的时候执行。 任何在 <script setup> 声明的顶层的绑定 (包括变量&#xff0c;函数声明&#xff0…

Spring中的循环依赖问题

目录 1、什么是Spring的循环依赖&#xff1f; 2、如何避免循环依赖问题&#xff1f; 3、Spring的三级缓存 小结 1、什么是Spring的循环依赖&#xff1f; Spring框架中的循环依赖问题是指两个或多个bean之间相互依赖&#xff0c;形成闭环&#xff0c;导致无法完成实例化的问…