ESCTF-逆向赛题WP

ESCTF_reverse题解

    • 逆吧腻吧
    • babypy
    • babypolyre
    • easy_re
    • re1
    • 你是个好孩子
    • 完结撒花 Q_W_Q

逆吧腻吧

  1. 下载副本后无壳,直接拖入ida分析分析函数逻辑:
  2. ida打开如下:
  3. 提取出全局变量res的数据后,编写异或脚本进行解密:
a=[0xBF, 0xA9, 0xB9, 
  0xAE, 0xBC, 
  0x81, 0x8D, 0xC9, 
  0x96, 0x99, 
  0xCA, 0x97, 0xC9, 
  0xA5, 0x8E, 
  0xCA, 0xA5, 0x88, 
  0x9F, 0x8C, 
  0x9F, 0x88, 0x89, 
  0x9F, 0x87]
for i in a:
    print(chr(i^0xFA),end="")
# ESCTF{w3lc0m3_t0_reverse}

babypy

  1. 拿到题目副本,发现时python的.exe文件。在这里插入图片描述
  2. 将python的.exe文件返回成源码需要用到pyinstxtractor.py这个脚本,使用如下命令:python pyinstxtractor.py 文件名.exe,和uncompyle6(或者在线网站)。还原python文件:
  3. 注意python version这一栏,标识了题目使用的python版本,后面给main.pyc文件还原时需要用到python相应版本的魔术字(版本号)。
  4. 在得到的文件夹中找到struct文件,查看器字节码E3前面的的16个字节(如果没有着需要自己根据相应python版本手动添加),上面显示python的版本为:3.8,器相应的版本为0x55,0x0d,0x0d,0x0a,将其添加到main文件的前8个字节(使用16进制编辑器):
  5. 随后使用在线网站(或者uncompyle6工具)进行反编译(修改main文件的后缀为.pyc)在线网站如下:
# Visit https://www.lddgo.net/string/pyc-compile-decompile for more information
# Version : Python 3.8

res = [
    146,
    58,
    34,
    106,
    210,
    118,
    54,
    242,
    106,
    154,
    60,
    164,
    14,
    154,
    176,
    108,
    44,
    60,
    66,
    194,
    56,
    194,
    66,
    106,
    194,
    4]
flag = input('Please input flag:')
for i in range(len(flag)):
    if (ord(flag[i]) * 1314 ^ 520) % 250 != res[i]:
        print('error!!!')
    print('yeah you get it Q_W_Q!')
    return None

  1. 最后编写脚本暴力破解,采用深度搜索的算法,根据生成的flag去指定筛选真正的flag:
def DFS(deep):
    if deep == 0:   #一个flag试探完毕
        for i in flag:
            print((i),end="")
        print()
    else:
        for j in range(65,128):
            if (j * 1314 ^ 520) % 250  == check[deep - 1]:
                flag[deep - 1] = chr(j)
                DFS(deep - 1)
check =[54,
    242,
    106,
    154,
    60,
    164,
    14,
    154,
    176,
    108,
    44,
    60,
    66,
    194,
    56,
    194,
    66,
    106,
    194]
flag = [0]*19
flag_1="ESCTF{"
DFS(len(check))
```![](https://img-blog.csdnimg.cn/direct/199a3935ef60449aa1a986f4fc4550c2.png#pic_center)
6. 可以看到其中又python_reverse等字样,直接用这个来指定:

def DFS(deep):
if deep == 0: #一个flag试探完毕
if flag[18]“e” and flag[17]“s” and flag[16]“r” and flag[15]“e” and flag[14]“v” and flag[13]“e” and flag[12]==“r”:
for i in flag:
print((i),end=“”)
print()
else:
for j in range(65,128):
if (j * 1314 ^ 520) % 250 == check[deep - 1]:
flag[deep - 1] = chr(j)
DFS(deep - 1)
check =[54,
242,
106,
154,
60,
164,
14,
154,
176,
108,
44,
60,
66,
194,
56,
194,
66,
106,
194]
flag = [0]*19
flag_1=“ESCTF{”
DFS(len(check))
``
8. 寻找到可能的flag提交:

babypolyre

  1. 拿到题目后无壳,直接拖入ida反汇编,从start函数直接跳到main函数:
  2. 明显的虚假控制流平坦化,这里简单讲一下什么是平坦化,平坦化就是将原本嵌套多层的语句,改为只用1个switch加while循环来实现,下面使用python语句来表现一个循环语句平坦化:
#原程序
res=[1,-1,2,-2,3,-3]
for i in range(len(res)):
    if res[i] < 0:
        res[i]<<=1
        res[i]+=10
        if res[1]&1==1:
            res[i]*=2
    else :
        res[i]^=13
        res[i]*=4
        # if res[1]
print(res)

res=[1,-1,2,-2,3,-3]
#手动添加平坦换后
i=0
while i<len(res):
    b=(int(res[i]<0)^1)+1
    while True:
        match b:
            case 0:
                break
            case 1:
                res[i]<<=1
                b=3
                
            case 2:
                res[i]^=13
                b=4
                
            case 3:
                res[i]+=10
                b=(res[i]&1)*5
                
            case 4:
                res[i]*=4
                break
                
            case 5:
                res[i]*=2
                break
    i+=1
print(res)


4. 其实现的功能仍然是一样的,只不过将一个循环里的多个语句放在了不同的子模块中,再通过子模块之间的相互控制,来达到原有程序的效果。详细的平坦换请看下面这篇文章:控制流平坦化
5. 知道控制流平坦化后,可以使用符号化执行来简化程序,使程序的可读性增强,便于反汇编,使用deflat.py脚本即可去除平坦化:命令如下
6. -f后是文件名,–addr后是要平坦化的函数首地址,执行后效果如下:汇编视图
7. 这里可以看到,去平坦化后的程序刻度性增强,不过其中还有一些出题人塞进去的虚假指令(恒真/假),永远不会执行。
8. 例如:第一个if语句后面的 ((((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054) & 1) != 0条件就永远为假**(n*(n-1))&1这个结果恒等于0,所以前面的条件恒假,即if语句里面的程序根本不会执行,类似的虚指令后面还有16个,需要清除:
9. 这里使用idapython脚本来快速去除,这里
脚本的逻辑**:将jnz指令的条件跳转修改为直接跳转,因为后面的jmp语句永远不会执行,后面的while循环同理,只会执行一次,因此利用脚本将jnz的条件跳转直接改为jmp进行直接跳转(顺跳),源程序相当于:

st = 0x0000000000400620 #main开始
end = 0x0000000000402144 #main结束
 
def patch_nop(start,end):
    for i in range(start,end):
        ida_bytes.patch_byte(i, 0x90)		#修改指定地址处的指令  0x90是最简单的1字节nop
 
def next_instr(addr):
    return addr+idc.get_item_size(addr)		#获取指令或数据长度,这个函数的作用就是去往下一条指令
    
 
 
addr = st
while(addr<end):
    next = next_instr(addr)
    if "ds:dword_603054" in GetDisasm(addr):	#GetDisasm(addr)得到addr的反汇编语句
        while(True):
            addr = next
            next = next_instr(addr)
            if "jnz" in GetDisasm(addr):
                dest = idc.get_operand_value(addr, 0)		#得到操作数,就是指令后的数
                ida_bytes.patch_byte(addr, 0xe9)     #0xe9 jmp后面的四个字节是偏移
                ida_bytes.patch_byte(addr+5, 0x90)   #nop第五个字节
                offset = dest - (addr + 5)  #调整为正确的偏移地址 也就是相对偏移地址 - 当前指令后的地址
                ida_bytes.patch_dword(addr + 1, offset) #把地址赋值给jmp后
                print("patch bcf: 0x%x"%addr)
                addr = next
                break
    else:
        addr = next
  1. 利用脚本修改后的汇编指令,反编译程序如下,去除掉后面16个虚指令:
  2. 前期准备结束,正式开始分析函数实现的功能,第一个循环的逻辑是将最后输入的回车符"\n"转化为0,第二个循环:将输入的字符串每8个一组(共64个bit)进行一下处理,大于零则左移1位(乘2),小于零则左移1位后与0xB0004B7679FA26B3异或。这里由于变量v4是64位的有符号数,左移根据其最高位来判定符号,1为负数,0为正数:
  3. 最后,Jami后的字符串与程序给定的数据相比较,因为8个字节一组,所以将程序给定的48个字节分为6组整合到一起:
  4. 最后解密脚本如下,脚本里面使用到的逻辑:原先的正数(最高位的符号位为0)左移1后一定是偶数(左移后低位自动用0补充),而原先的负数(最高位的符号位为1)左移1后(变为偶数)再与0xB0004B7679FA26B3(奇数)异或,结果一定是奇数,也就是说,最后结果(加密一次)里面的偶数原先一定是正数,而结果里面的奇数原先一定是负数,所以根据每次结果奇偶性即可判定上一次该值是否为正或者负,如果是负数则需要给最高位(第64为)补上1(补上因为加密是左移而溢出的1),为正数不用补(加密是左移溢出的是0,相当于没有溢出):
a=[0x7FE7E49BD585CC6C,0x520100780530EE16,0x4DC0B5EA935F08EC,0x342B90AFD853F450,
0x8B250EBCAA2C3681,0x55759F81A2C68AE4]
key=0xB0004B7679FA26B3
for res in a:
    for j in range(64): #循环64次
        tmp=res&1
        if tmp == 1:#判定是否为奇数(为奇数则上轮加密是为负数),在二进制下最低为为1则是奇数
            res ^= key
        res>>=1
        if tmp==1:
            res+=0x8000000000000000 #如果该次加密前是负数(),把左移漏掉的最高位1补回来

    #输出,大小端续转化输出
    k=0
    while k<8:
        print(chr(res&0xff),end="")
        res>>=8
        k+=1
#ESCTF{1229390-6c20-4c56-ba70-a95758e3d1f8}

easy_re

  1. 先用upx工具脱壳进行与脱壳,手动脱壳可以去看这篇:手动脱壳,完成后直接进入ida分析:
  2. 进入ida发现加密函数时典型的base64:
  3. 密文为ZL0pLwfxHmLQnEabfLiGPYiYJ2aQP205U5i8fd0i,找到base64的编码表即可,初步判断时下面这张表,直接拿去用网站解密发现不对,再返回来寻找其他表:在这里插入图片描述
  4. 最后再init函数里面调用的函数中找到下面这张表:
  5. 拿去用网站解密,解出flag:

re1

  1. 拿到题目,uxp工具脱壳后拉入ida分析,进入main函数分析,其主要逻辑为接受一个输入,然后判断一下长度大于12,然后对输入的flag进行分组,税后调用了j_encode函数,后续一个判断,似乎是调用了三个函数,但是双击键入发现函数并不存在:
  2. 这说明qword_140029370这个函数地址还需要其他函数来赋值过来(初始化生成函数):在这里插入图片描述
  3. 进入j_encode查看逻辑,发现其中存在一大段数据,并在最后对其进行批量异或操作后:在这里插入图片描述在这里插入图片描述
  4. 可见上面的三个循环异或操作是在还原函数,解题只需要还原出这三个函数,再分析器内部的逻辑即可得到flag,提取出代码中的数据后(其中又两段数据曹勇strcpy的形式,但里面各又一个ASIIC码为0的字符没有被显示,再汇编模式下可以看见):在这里插入图片描述
  5. 还原函数的脚本如下:
a=[
0x2E,
0xE5,
0x8A,
0x46,
0x2E,
0xEF,
0x6A,
0x42,
0x27,
0xDC,
0x41,
0x48,
0x61,
0x1A,
0x27,
0xE7,
0x94,
0x1E,
0x30,
0x52,
0x74,
0xED,
0x5A,
0x42,
0x22,
0x5F,0xB1,0x13,0x78,0xED,
0x1A,
0x42,0x62,0x27,0xDC,0x29,
0x5C,
3,
0xE1,0x27,0xE7,0x94,0x47,0x25,
3,
0xE1,0x22,0x5F,0xB1,
0x13,
0x6E,
0x2E,0x57,0xA6,0x2E,0xE5,0xA2,
0x46,
0xA5,0x2E,
0xE5,
0xA2,
0x46,
0x2E,
0x57,
0xA6,0x2E,0xE5,0x8E,0x67,0xA5
]
print(len(a))
for i in a:
    print('{:0>2}'.format(hex(i^0x66)[2:]),end=" ")

print()
b=[0x3F,
0xF4,
0x9B,
0x37,
0x3F,
0xFE,
0x7B,
0x53,
0xB0,
0x33,0x53,0x67,0x18,2,0x19,0x13,0xB0,0x33,0x53,0x63,0x28,0x18,2,5,0x3F,0xB0,0xB6,0x77,0x77,0x77,0x77,0x3F,0xB0,0xB5,0x7F,0x77,0x77,0x77,0x3F,0x46,0xB7,0x3F,0x46,0xAC,0xFD,0x73,0x7B,0xFD,0x2B,0x7B,0x67,0x4F,0xAF,2,0x67,0x3F,0x88,0xB6,0x3F,0x4E,0xA6,0xB,0x9A,0x3F,0x46,0xB7,0x3F,0xF4,0xB3,0x37,0xB4,0x3F,0xB0,0xB7,0x77,0x77,0x77,0x77,0x3F,0xF4,0x9F,0x76,0x3F,0xF4,0xB3,0x37,0xB4,
]
print(len(b))
for i in b:
    print('{:0>2}'.format(hex(i^0x77)[2:]),end=" ")
print()
c=[0x17,
0xDC,
0xB3,
0x1F,
0x17,
0xD6,
0x53,
0x7B,
0x98,
0x1b,
0x7b,
0x57,
0x30,
0x37,
0,
0x26,
0x98,
0x1B,
0x7b,
0x53,
0x30,
0x2a,
0,
0x39,
0xD4,
0x63,
0x7B,
0xD4,
 0x2B,
 0x7B,
 0x57,
 0x66,
 0xA8,
 0x2A,
 0x4A,
 0xD4,
 0x23,
 0x7B,
 0x5B,
 0xD4,
 0x2B,
 0x7B,
 0x53,
 0x66,
 0xA8,
 0x2A,
 0x56,
 0x17,
 0x98,
 0x9F,
 0x5F,
 0x5F,
 0x5F,
 0x5F,
 0xB4,
 0x52,
 0x17,
 0x98,
 0x9F,
 0x5F,
 0x5F,
 0x5F,
 0x5F,
 0x17,
 0xDC,
 0xB7,
 0x5E,
 0xB4,
 0x5F,
 0x17,
 0xDC,
 0x9B,
 0x1F,
 0x9C,]
print(len(c))
for i in c:
    print('{:0>2}'.format(hex(i^0x5f)[2:]),end=" ")


6. 将拿到的数据使用十六进制编辑器写入文件,再将文件拖入ida反编译分析汇编代码,其中有一个函数按F5显示源代码错误,就直接分析其汇编代码(也不长):
7. 上面函数应该使用了RCX寄存器和栈传递了参数,然后与解密后的数据进行比较,可以用脚本反向异或得到部分flag:

a=[0x7C072E27^0x12345678,0x87654321^0x87653A4F]
for i in range(len(a)):
    while a[i]:
        print(chr(a[i]&0xff),end="")
        a[i]>>=8


9. 函数2直接给出了部分flag字符串:在这里插入图片描述
10. 函数3,F5显示元代码错误,直接分析汇编代码,直接进行比较:在这里插入图片描述
11. 解密脚本如下:

a=[0x795F686F,0x665F756F]
for i in range(len(a)):
    while a[i]:
        print(chr(a[i]&0xff),end="")
        a[i]>>=8

在这里插入图片描述
12. 将得到的3各字符串拼接起来即可获得flag:oh_you_found_our_x3nny,包上ESCTF即可提交。

你是个好孩子

  1. 下载附件后你会得到3个文件,根据题目要求,将其还原成一个PE文件,具体的PE文件结构自行学习,这里只给出拼接回去的方法,用十六进制编辑器打开4个文件:将未命名4开头的两个字节mz改为大写,未命名2开头的两个字节pe改为大写,将未命名1开头的一个字节00去掉(这里我在节表的前面多塞入了一个字节需要去掉)。修改后将未命名2复制放在未命名4后面,接着继续放入未命名1,最后放入未命名3,保存未命名4并修改后缀为.exe,即可执行该PE文件,输出:在这里插入图片描述
  2. 拖入ida分析,发现无论输入什么都只会输出you are bad boy or girl,将其用ESCTF包上后提交,发现提交错误:在这里插入图片描述
  3. 根据题目的提示,应该是好孩子而不是坏孩子,将bad改为good,即"you are good boy or girl",再包上ESCTF进行提交发现正确,所以正确的flag为ESCTF{you are good boy or girl}在这里插入图片描述

完结撒花 Q_W_Q

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

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

相关文章

matlab和stm32的安装环境。能要求与时俱进吗,en.stm32cubeprg-win64_v2-6-0.zip下载太慢了

STM32CubeMX 6.4.0 Download STM32CubeProgrammer 2.6.0 Download 版本都更新到6.10了&#xff0c;matlab还需要6.4&#xff0c;除了st.com其他地方都没有下载的,com.cn也没有。曹 还需要那么多固件安装。matlab要求制定固件位置&#xff0c;然后从cubemx中也指定…

python3游戏GUI--开心打地鼠游戏By:PyQt5(附下载地址)

文章目录 一&#xff0e;前言二&#xff0e;游戏预览1.启动2.开始游戏3.游戏结束4.排行榜 三&#xff0e;游戏思路四&#xff0e;总结 一&#xff0e;前言 第一次用PyQt做游戏&#xff0c;有点小紧张呢。本次使用PyQt5制作一款简单的打地鼠游戏&#xff0c;支持基本游戏玩法、…

本地部署大模型的几种工具(下-相关比较)

比较项目chatglm.cppvllmOllamalmstudio功能特点通过C优化性能&#xff0c;支持多平台运行推理加速简化易用、本地运行大模型简化操作、本地运行大模型操作系统要求都可以&#xff0c;linux下运行更方便都可以&#xff0c;linux下运行更方便都可以&#xff0c;windows目前还是预…

2024华为产业链企业名单大全(附下载)

更多内容&#xff0c;请前往知识星球下载&#xff1a;https://t.zsxq.com/18fsVdcjA 更多内容&#xff0c;请前往知识星球下载&#xff1a;https://t.zsxq.com/18fsVdcjA

利用 Scapy 库编写 ARP 缓存中毒攻击脚本

一、ARP 协议基础 参考下篇文章学习 二、ARP 缓存中毒原理 ARP&#xff08;Address Resolution Protocol&#xff09;缓存中毒是一种网络攻击&#xff0c;它利用了ARP协议中的漏洞&#xff0c;通过欺骗或篡改网络中的ARP缓存来实施攻击。ARP协议是用于将IP地址映射到物理MAC…

【Leetcode每日一题】 动态规划 - 解码方法(难度⭐)(43)

1. 题目解析 题目链接&#xff1a;91. 解码方法 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 这是一道类似斐波那契数列的题目~ 当我们遇到一个类似斐波那契数列的问题时&#xff0c;我们通常会想到使用动态规划&…

网络安全学习路线(2024)

国家和企业越来越重视网络安全了&#xff0c;现在也有很多很厂商加招网络安全岗位&#xff0c;同时也有很多对网络安全感兴趣的朋友&#xff0c;准备转行或从事网络安全。 通常&#xff0c;网络安全的内容包括&#xff1a; 网络安全技术、网络安全管理、网络安全运作&#xff…

【MySQL数据库】数据类型和简单的增删改查

目录 数据库 MySQL的常用数据类型 1.数值类型&#xff1a; 2.字符串类型 3.日期类型 MySQL简单的增删改查 1.插入数据&#xff1a; 2.查询数据&#xff1a; 3.修改语句&#xff1a; 4.删除语句&#xff1a; 数据库 平时我们使用的操作系统都把数据存储在文件中&#…

谷歌关键词优化十招搞定提升你的存在感-华媒舍

在当今的数字化时代&#xff0c;谷歌已成为我们生活中不可或缺的一部分。作为世界上最大的搜索引擎之一&#xff0c;谷歌每天处理着海量的搜索请求。要在谷歌上获得更多的曝光和存在感&#xff0c;关键词优化是必不可少的。本文将向您介绍十招搞定谷歌关键词优化的方法&#xf…

力扣刷题44-46(力扣0062/0152/0198)

62. 不同路径 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff0c;机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。问总共有多少条不同的路径&#xff1f; 思路&#xff1a; 其实就是问(0,0)->(m-1,n-1)一共有几条路。 第一个…

web自动化测试系列-selenium的安装和运行(一)

目录 web自动化系列之如何安装selenium 1.web自动化中的三大亮点技术 2.web自动化能解决什么问题 &#xff1f; 3.为什么是selenium ? 4.selenium特点 5.selenium安装 6.下载浏览器及驱动 7.测试代码 web自动化系列之如何安装selenium web自动化 &#xff0c;一个老生…

【No.17】蓝桥杯图论上|最短路问题|Floyd算法|Dijkstra算法|蓝桥公园|蓝桥王国(C++)

图的基本概念 图&#xff1a; 由点(node&#xff0c;或者 vertex)和连接点的边(edge)组成。图是点和边构成的网。 树&#xff1a;特殊的图树&#xff0c;即连通无环图树的结点从根开始&#xff0c;层层扩展子树&#xff0c;是一种层次关系&#xff0c;这种层次关系&#xff0…

【C++】哈希应用之位图

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.位图的概念 2.位…

一道很有意思的题目(考初始化)

这题很有意思&#xff0c;需要你对初始化够了解才能解出来 &#xff0c;现在我们来看一下吧。 这题通过分析得出考的是初始化。关于初始化有以下知识点 &#xff08;取自继承与多态&#xff08;继承部分&#xff09;这文章中&#xff09; 所以根据上方那段知识点可知&#xf…

【linux网络(一)】初识网络, 理解四层网络模型

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. 初识网络…

【Java程序设计】【C00361】基于Springboot的考勤管理系统(有论文)

基于Springboot的考勤管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及idea&…

RWTH-PHOENIX Weather数据集模型说明和下载

RWTH-PHOENIX Weather 2014 T数据集说明: 德国公共电视台PHOENIX在三年内(2009 年至 2011 年) 录制了配有手语翻译的每日新闻和天气预报节目,并使用注释符号转录了 386 个版本的天气预报。 此外,我们使用自动语音识别和手动清理来转录原始德语语音。因此,该语料库允许训练…

电脑控制面板在哪?5招教你快速打开!

“我在执行一个任务时要进入电脑的控制面板中查看&#xff0c;但是我不知道电脑的控制面板在哪&#xff0c;谁能帮帮我呀&#xff1f;” 电脑控制面板是一个系统文件夹&#xff0c;它提供了各种对计算机系统进行设置和管理的工具。控制面板允许用户查看并操作基本的系统设置&am…

SAP ABAP-BOPF基础训练-01简介与架构

1. 介绍-Introduction ① BOPF是什么&#xff1f;BOPF(the Business Object Processing Framework)&#xff1a;业务对象处理框架 提供了一种增量和模块化的方法&#xff0c;以符合企业面向服务体系结构(eSOA)的方式实现业务对象&#xff1b; 部分平台基础层&#xff0c;软件组…

【笔记】深入理解JVM机制

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 JVM 运⾏流程图 JVM 中内存区域划分 方法区 / 元数据区 堆 栈 程序计数器 本地方法栈 内存区域总结 JVM 中类加载过程 …