红队打靶:ConnectTheDots打靶思路详解(vulnhub)

目录

写在开头

第一步:主机发现和端口扫描

第二步:FTP和NFS渗透(失败) 

第三步:web渗透 

第四步:jsfuck解码

第五步:再次FTP渗透与莫尔斯电码解码

第六步:vim读取断电swp文件

第七步:tar文件能力读取root.txt

第八步:提权

suit之polkit利用提权

Linux Polkit 权限提升漏洞利用提权

总结与思考 ​​​​​​​

写在开头

 本篇博客在自己的理解之上根据大佬红队笔记的视频进行打靶,详述了打靶的每一步思路,并非复现writeup,读者耐心看完,定会有所收获。本靶机的打靶过程还挺长的(下载就花费了挺长时间),也可能是因为有好多知识点我不够了解,同时最后采用了两种方式进行提权。靶机很有解密的性质,同时也涉及到了有关意外断点产生的swp交换文件读取知识点,与实际情况的渗透相似。靶机的难度不高,但涉及到的知识点较为密集,包括nfs挂载、jsfuck混淆、ftp多文件读取、文件图片隐写、莫尔斯电码解码、断电swp文件读取、polkit权限提升等,完整打靶思路详见:

「红队笔记」靶机精讲:CONNECT THE DOTS - 不懂jsfuck,polkit,图片隐写,莫尔斯码和断电隐患,你可能玩不转这台靶机。_哔哩哔哩_bilibili

 本文针对的靶机源于vulnhub,详情见:

Connect The Dots: 1 ~ VulnHub

  下载链接见:

https://download.vulnhub.com/connectthedots/Connect-The-Dots.ova

 本靶机的目标是拿到两个flag即可,即user.txt和root.txt。不过考虑到本靶机的特殊性,本文还是以拿到最终root权限为打靶成功的标志。靶机下载成功后用vmware打开,将网络链接设置为NAT模式。靶机启动之后如下:

第一步:主机发现和端口扫描

 常规思路,首先进行主机发现:

nmap -sn 10.10.10.0/24 

我kali的地址是10.10.10.128,扫出来靶机的ip是10.10.10.151,然后扫描所有端口,将结果保存在portscan:

得到开放的端口信息(说白了就是方便复制,用/作分隔符取第一位,并将换行符替换为,):

cat portscan.nmap | grep 'open' | awk -F '/' {'print $1'} | tr '\n' ','

然后详细扫描这些tcp端口,包括操作系统版本-O,服务版本-V,用默认脚本-sC进行扫描:

nmap -sT -sV -sC -O -p21,80,111,2049,7822,37381,39995,48903,53453 10.10.10.151

 信息量很大,重点看的是111和2049端口都涉及到nfs网络文件系统的挂载。同时ssh端口修改到了7822。后面的端口是动态端口,没什么有用信息。这里再用默认的漏洞扫描脚本进行尝试:

nmap --script=vuln -p21,80,111,2049,7822 10.10.10.151 

 漏洞脚本扫描其实没有太多的信息,发现了一个sql注入,还有一些目录枚举的内容。

第二步:FTP和NFS渗透(失败) 

 分析渗透思路。由于FTP可以算是低摘的果子,我们干脆从21端口入手,先对ftp进行匿名登陆尝试,再查看有没有nfs挂载的目录,接着再对web进行渗透,实在不行再考虑ssh。 先尝试登录ftp:

可惜无法匿名登录,看来ftp这条路走不通,我们再用showmount尝试查看有没有挂载目录(-e参数用于导出挂载目录):

showmount -e 10.10.10.151

 确实存在挂载目录/home/morris,这也说明这个靶机有一个用户名是morris,说不定以后我们能拿到这个账号的权限。此时我们新建一个目录mor,尝试能不能把靶机的开放目录挂载连接到mor(-t指定类型nfs):

mount -t nfs 10.10.10.151:/home/morris mor

 感觉还是存在很多信息的,但经过尝试,隐藏目录都没有进入权限,也没有查找到什么有用的信息。

 这里我看红队笔记大佬的视频,他尽然是可以进入.ssh目录的,很奇怪,按道理说这个所在组和其他组应该都没有读权限的。总之这条路是走不通的。

第三步:web渗透 

打开浏览器访问靶机ip,可以看到如下的界面,这个页面的加载略显卡顿:

 其实这个界面就是一些文字和图片。查看源代码也没什么收获。不过初看下面这段文字可能会有一些线索:

You know how our family have named us, right? Them naming me M and you N. Well, our names are entirely the same except the initials. Life is too short to save names in your memory when you're old, so why not! But do you know who did that? Our mother who was fond of the James Bond movies. She named me after her as M. Perhaps, she thinks that the director of the movie was too lazy to think of one. 

首先尽然有拼错的单词,可能是开发者打字太快了。然后这句话暗示了我们的名字只有首字母的不一样的,而我是“M”你是“N”。结合之前发现的一个账号morris,可以猜测存在另外一个用户名norris。当然此处仅仅是猜测,后面会证实。 这也看不出来啥,进行一个目录爆破吧:

gobuster dir -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -u http://10.10.10.151

还是有一些收获的,发现几个目录images,manual,javascript,mysite等,还有一个路径backups,先看一下这个backups:

 尽然是个奇怪的视频,播放着几张图片,可能存在隐写啥的。这里先暂时不管。然后发现images就是初始页面的图片目录,manual是apache的配置界面。javascript没有什么值得关注的内容。进入mysite目录:

 这个目录中有一个文件bootstrap.min.cs,这个文件名的后缀我还真不知道是啥,点开发现有一大串字符,感觉像是一种程序语言,分析这个文件,结合末尾的setInterval( function() {console.log(a)}, 3000);判断,可能与javascript相关:

第四步:jsfuck解码

 这里感觉类似CTF其实需要经验,就是我们看到的由一大堆[]()!+组成编码的字符其实是jsfuck,这是一种针对javascript程序的混淆方法。 和我们上一期打靶Narak中的brainfuck类似。

那么我们当然就要对这个jsfuck进行解码了。进行解码之前,应该先把完整的jsfuck内容复制下来。可以直接复制,并依次删除非jsfuck的字符,也可以像下面这样,在mysite目录下发现了register.html页面:

 查看源代码发现这个页面会调用含有jsfuck语句的bootstrap.min.cs:

而 bootstrap.min.cs文件中的jsfuck语句正是由变量b1,b2,...b10拼接而成,因此直接在这个页面的console控制台用console.log将所有的字符串变量拼接即可:

console.log(b1+b2+b3+b4+b5+b6+b7+b8+b9+b10)

然后我们搜索一个在线解码器,把拼接而成的超长jsfuck字符串进行解码:

JSFuck - Write any JavaScript with 6 Characters: []()!+ 

 解码成功了!出现了alert的提示信息:

You're smart enough to understand me. Here's your secret, TryToGuessThisNorris@2k19

TryToGuessThisNorris@2k19应该就是一个凭据,那账号是啥呢,根据推理应该是norris,这既源于开头web页面的提示,也源于密码本身就含有norris,总之我们尝试能否使用这个凭据登录ssh。(可能的用户就只有root/morris/norris三个,注意ssh端口修改为7822)经过尝试发现norris登录成功:

ssh norris@10.10.10.151 -p 7822

 成功拿到了user.txt:

第五步:再次FTP渗透与莫尔斯电码解码

 同时在当前目录下看到了ftp文件夹,为了方便我们将ftp内的文件下载到kali本地进行分析,因此我们在kali中再次通过norris账号密码TryToGuessThisNorris@2k19登录ftp成功:  

发现ftp中有文件夹files,进入目录,把里面的内容全都下载到本地:

 这里需要注意的是,如果目录下的文件不是文本.txt文件的话,需要先运行binary指令(即输入binary然后回车)转换为二进制格式,以保证通过FTP下载的文件不会损坏。此处又运行了prompt指令关闭了交互模式,就不用对每个下载都逐一确认了。

如上图所示,四个文件都下载到本地了:

 接下来我们使用file工具逐一查看,发现backups.bak是一个iso媒体文件,没找到什么有用信息,game.jpg.bak文件好像备注信息comment中有类似莫尔斯电码的东西:

用exiftools详细查看:

 我们可以将这段摩尔斯密码复制下来,找个在线网页尝试解密:

Morse Code Translator - Morse Decoder

 解密成功了:

 解密后内容如下:

HEY#NORRIS,#YOU'VE#MADE#THIS#FAR.#FAR#FAR#FROM#HEAVEN#WANNA#SEE#HELL#NOW?#HAHA#YOU#SURELY#MISSED#ME,#DIDN'T#YOU?#OH#DAMN#MY#BATTERY#IS#ABOUT#TO#DIE#AND#I#AM#UNABLE#TO#FIND#MY#CHARGER#SO#QUICKLY#LEAVING#A#HINT#IN#HERE#BEFORE#THIS#SYSTEM#SHUTS#DOWN#AUTOMATICALLY.#I#AM#SAVING#THE#GATEWAY#TO#MY#DUNGEON#IN#A#'SECRETFILE'#WHICH#IS#PUBLICLY#ACCESSIBLE.

说实话这么看可读性有点差,干脆存成一个文件morse_decode,然后把所有的#替换成空格再查看:

cat morse_decode | tr '#' ' '

 NORRIS, YOU'VE MADE THIS FAR. FAR FAR FROM HEAVEN WANNA SEE HELL NOW? HAHA YOU SURELY MISSED ME, DIDN'T YOU? OH DAMN MY BATTERY IS ABOUT TO DIE AND I AM UNABLE TO FIND MY CHARGER SO QUICKLY LEAVING A HINT IN HERE BEFORE THIS SYSTEM SHUTS DOWN AUTOMATICALLY. I AM SAVING THE GATEWAY TO MY DUNGEON IN A 'SECRETFILE' WHICH IS PUBLICLY ACCESSIBLE. 

 这段话意思说他的电池很快就没电了,他就要ger~了,于是火速给我们留下一个信息,他把关键的信息secretfile放在了公共的区域。那啥是公共的区域呢?最容易想到的就是web的目录/var/www/html。不过在此之前,我们还要查看其它两个文件:

  hits.txt.bak首先给出了一个网址,我们访问这个网址看看有啥信息:

 给了我们一句提示:

Remember! Keep your enumeration game strong!

记住!枚举一定要尽全力!

说白了就是再次强调不要遗漏信息。最后一个文件m.gif.bak没发现什么特殊的。

第六步:vim读取断电swp文件

进入web目录/var/www/gtml查找线索:

还真有secretfile,先查看secretfile:

 意思是:我知道你来到这里是找密码的。电池就要没电啦!下面的信息有些参考。

下面的信息在哪里?我们看到最后还有一个.secretfile.swp文件,直接cat是没有权限的:

​​​​​​​

不过这个页面在web端,我们可以把它wget下来:

 然后就可以查看了:

感觉cat还是有点乱,我们尝试用strings看一下其中的字符串信息:

 这里其实是非常巧妙的。由于swp文件是一种临时的交换文件,通常在特殊异常退出的情况时会产生。结合strings中看到的字符串中存在vim,再考虑到先前我们看到的好多提示都与快没电了!电池耗尽相关。因此我们大胆猜测这个文件就是vim编辑时断点异常退出产生的,我们可以使用vim -r参数读取损坏的swp文件:

vim -r .secretfile.swp

 这样子我们又得到了一串字符串blehguessme090,这很可能是又一个凭据,有可能是root或morris的凭据,通过尝试我们发现,这就是morris账户的凭据:

第七步:tar文件能力读取root.txt

下一步就是进行提权了。两个用户用哪个提权都没有倾向性,因此根据用户组的信息,我们还是选用norris进行提权(起码norris所在用户组有sudo):

 经过一番sudo -l,定时任务查找之后无果。决定使用getcap工具读取有没有文件具有特殊的文件能力

/sbin/getcap -r / 2>/dev/null

发现有打包工具tar,具有能力cap_dac_read_search+ep:

cap_dac_read_search+ep:这是指定文件的扩展文件权限标志。它包含两个部分:

  1. cap_dac_read_search:这是一种扩展文件权限标志,表示该文件具有读取和搜索(read/search)访问权限,通常用于文件系统的访问。具体来说,这个标志允许 tar 命令读取文件和搜索目录,而不需要使用者拥有完全的文件访问权限

  2. +ep:这部分表示该文件是一个具有执行权限(execute permission)的可执行文件。这意味着用户可以运行 /usr/bin/tar 命令,并且它将以正常的用户身份执行,而不需要特权(root权限)。+ep 的意思是执行和提升权限(effective privilege),这允许 tar 在不需要完全的 root 权限的情况下执行一些特定高权限的操作

 说白了,就是tar具有特殊高权限,我们使用tar时哪怕没有拥有文件的访问权限也可以正常读取和搜索。  那我们直接用tar把/root目录打包,然后再解压就可以看到flag即root.txt:

tar -zcvf  root.tar.gz /root

然后我们再解压即可读取root.txt:

tar -zxvf root.tar.gz

 至此就完成了靶机的要求,但我们其实并没有提权。因此作为后续操作,我们还是实现提权。

第八步:提权

提权有两种方法,先介绍红队笔记大佬的方法,suid提权。

suit之polkit利用提权

首先寻找有s位的文件:

find / -perm -u=s -type f 2>/dev/null

重点关注这个/usr/lib/policykit-1/polkit-agent-helper-1,该文件的属主和数组都是root,且具有s位权限,可以以属主的身份运行,应该可以提权:

 polkit是linux系统中针对文件权限管理的一套机制,而helper相当于是充当一个介于操作者与被操作文件的一个中介,会通过这个helper去调用执行文件。因此如果我们能够借助helper的高权限,以root的身份调用bash,即可实现提权。可以通过如下的命令实现触发polkit-agent-helper-1,并借用polkit-agent-helper-1的root高权限启动bash进行提权。

可以使用systemd-run -r启动伪终端,此时会通过polkit-agent-helper-1启动,而polkit-agent-helper-1具有高权限,因此就有可能实现提权。

完整命令如下:

systemd-run -t /bin/bash

 如图所示,输入norris的凭据TryToGuessThisNorris@2k19后提权成功:

 其中的红色字符正是polkit-agent-helper-1的作用。至此打靶完成。这里引用chatgpt的解释以下polkit和helper的机制:

polkit-agent-helper 是一个用于帮助执行基于 PolicyKit(即 Polkit)的授权请求的工具,它通常用于 Linux 操作系统中。

在 Linux 系统中,PolicyKit 是一个用于管理系统范围的特权访问的工具。当需要执行需要特权的操作时,通常会向 PolicyKit 发送授权请求。PolicyKit 会检查请求者的身份,并基于定义的授权策略(即 polkit 规则)来决定是否授权该请求。

polkit-agent-helper 就是作为一个代理工具,协助应用程序向 PolicyKit 发送授权请求,并处理来自 PolicyKit 的响应。当一个应用程序需要执行特权操作时,它会调用 polkit-agent-helper,该工具会弹出一个对话框,提示用户输入其凭证(如密码),然后将这些凭证发送给 PolicyKit 进行验证。如果用户提供的凭证被验证成功,PolicyKit 就会授权该请求。

因此,polkit-agent-helper 的提权原理可以简单概括为:通过代理向 PolicyKit 发送授权请求,并通过用户提供的凭证验证来获得特权访问。因为polkit-agent-helper所属用户是root且有s权限,那么启用更高级的bash时,就会利用特权提权

Linux Polkit 权限提升漏洞利用提权

此处存在一个漏洞,即Linux Polkit 权限提升漏洞,这个漏洞通杀很多老版本的linux靶机,可以直接在github上搜索CVE-2021-4034。

选择python编写的exp。你问我明明有C语言,也有go语言写的exp,为啥选python?因为我尝试了很多,发现靶机上没有gcc,也没有go语言的编译器,没法编译,但又python3,因此可以运行python的exp。总之我们应该想方设法把这个exp放到靶机上,github链接是joeammond/CVE-2021-4034: Python exploit code for CVE-2021-4034 (pwnkit) (github.com)

 奈何靶机连git都没有,没办法git clone,因此咱还是在kali上git clone,然后启动一个web服务,再在靶机上通过wget拿到这个exp:

git clone https://github.com/joeammond/CVE-2021-4034.git

 然后用python启动一个http服务,我这里就用1111端口了:

python -m http.server 1111

此时浏览器访问kali的ip:1111可以看到开放目录:

 回到靶机norris,把这个CVE-2021-4034.py用wget下载下来:

然后给这个脚本添加执行权限:

chmod +x CVE-2021-4034.py

  运行即可提权:

至此打靶完成。详细关于这个漏洞的描述可以参考:Linux Polkit权限提升漏洞复现&分析(CVE-2021-4034) - 知乎 (zhihu.com)

本文就懒得详细阐释了。

总结与思考 

  这个靶机知识点真多呀。涉及到ftp渗透、nfs挂载、目录爆破、jsfuck混淆破解、文件隐写、莫尔斯电码解码、vim读取断电swp文件、getcap查看文件能力、suid提权、polkit利用与pokit权限提升漏洞利用等等。感觉知识点很密集,重点是不能放弃。像jsfuck、莫尔斯电码解码以及上一篇博客narak打靶中的brainfuck(详见红队打靶:Narak打靶思路详解(vulnhub)-CSDN博客),都颇有CTF的感觉,需要了解这些知识点,否则哪怕看到了信息,也可能会以为是乱码而忽略了重要线索。同时这个靶机有关读取swp文件的部分也很有趣,前面就暗示我们快没电了,最后产生的swp文件也符合真实情况。最后还是总结一下打靶过程:

1.主机发现和端口扫描:常规思路,发现有ftp和nfs服务。以及常规的80web和ssh端口

2.FTP和NFS渗透:由于FTP和NFS相对好入手,先从这边查看,发现ftp无法匿名登录,此路不通,再尝试寻找开放目录,发现/home/morris,但无法访问。

3.web渗透:目录爆破发现敏感目录mysite,其中有关键信息bootstrap.min.cs

4.jsfuck解码,发现bootstrap.min.cs的内容是jsfuck,在线解码找到一个初始凭据TryToGuessThisNorris@2k19,经过尝试发现是norris的ssh密码。

5.再次FTP渗透与莫尔斯电码解码:登录norris的ssh,发现存在ftp,将ftp中的文件下载到本地后,发现了文件隐写,其中有莫尔斯电码,解码提示我们寻找公开目录,暗示我们访问web目录。

6.vim读取断电swp文件,经过web目录的搜索找到了.secretfile.swp文件,结合之前的断电线索,我们判断这是vim编辑时断点异常退出产生的文件,用vim -r参数修复会话,读取了另外一个凭据blehguessme090,经尝试发现这是morris账号的密码。

7.tar文件能力读取root.txt:发现tar具有特殊高权限,利用tar工具打包/root目录,再解压即可读取flag,即root.txt。

8.提权:介绍了两种方法,suit之polkit利用提权和Linux Polkit 权限提升漏洞利用提权。

 总结这个靶机真的太费劲了,也感谢红队笔记大佬的分享。

 到此这个靶机就讲解完毕了。打完这个靶机感觉还是挺有收获的,有很多新的知识点。靶机不难,总结不易,也有很多自己的思考,希望读者能够点赞关注多多支持!学渗透还是要实操呀。如果读者有什么打靶的问题也欢迎评论区留言指出,我一定知无不言!

 

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

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

相关文章

批量采集的时间管理与优化

在进行大规模数据采集时,如何合理安排和管理爬取任务的时间成为了每个专业程序员需要面对的挑战。本文将分享一些关于批量采集中时间管理和优化方面的实用技巧,帮助你提升爬虫工作效率。 1. 制定明确目标并设置合适频率 首先要明确自己所需获取数据的范…

Bazzite 发行版 1.0 发布,可让 Linux 游戏机实现 Steam Deck 桌面环境体验

导读近日消息,当下 Steam Deck 掌机的性能已经有所过时,不过许多玩家为了追求原生 SteamOS 体验依然选择购买该掌机,V社此前曾表示,“SteamOS 简化了在手持设备上玩 PC 游戏的过程”,玩家在用 Steam Deck 玩游戏时&…

BCSP-玄子Share-Java框基础_工厂模式/代理模式

三、设计模式 3.1 设计模式简介 软件设计中的三十六计是人们在长期的软件开发中的经验总结是对某些特定问题的经过实践检验的特定解决方法被广泛运用在 Java 框架技术中 3.1.1 设计模式的优点 设计模式是可复用的面向对象软件的基础可以更加简单方便地复用成功的设计和体系…

springcloud-Eureka

1.Eureka注册中心 1.1 简介与依赖导入 1.2 服务注册与发现 启动eureka模块 访问Eureka 将user-service,book-service,borrow-service作为eureka的客户端,先导包。三个导入方式一样。 配置文件,三个模块下都一样配置 然后分别启动三个模块 发现注册…

SpringMvc--CRUD

目录 一.什么是SpringMvc--CRUD 二.前期准备 公共页面跳转(专门用来处理页面跳转) 三.ssm之CRUD后端实现 配置pom.xml 双击mybatis-generator:generate自动生成mapper 编写generatorConfig.xml 项目结构 编写PagerAspect切面类 编写hpjyBiz接口类 编写hpjyBizImpl接…

JavaWeb_LeadNews_Day11-KafkaStream实现实时计算文章分数

JavaWeb_LeadNews_Day11-KafkaStream实现实时计算文章分数 KafkaStream概述案例-统计单词个数SpringBoot集成 实时计算文章分值来源Gitee KafkaStream 概述 Kafka Stream: 提供了对存储与Kafka内的数据进行流式处理和分析的功能特点: Kafka Stream提供了一个非常简单而轻量的…

Pytorch 多卡并行(1)—— 原理简介和 DDP 并行实践

近年来,深度学习模型的规模越来越大,需要处理的数据也越来越多,单卡训练的显存空间和计算效率都越来越难以满足需求。因此,多卡并行训练成为了一个必要的解决方案本文主要介绍使用 Pytorch 的 DistributedDataParallel&#xff08…

合宙Air724UG LuatOS-Air LVGL API控件-表格(Table)

表格(Table) 示例代码 --创建表格Table1 lvgl.table_create(lvgl.scr_act(),nil)--设置表格为4行5列lvgl.table_set_row_cnt(Table1,4)lvgl.table_set_col_cnt(Table1,5)--给每个单元格赋值lvgl.table_set_cell_value(Table1, 0, 0, "选手")l…

Android之RecyclerView仿ViewPage滑动

文章目录 前言一、效果图二、实现步骤1.xml主布局2.所有用到的drawable资源文件3.xml item布局4.adapter适配器5.javabean实体类6.activity使用 总结 前言 我们都知道ViewPageFragment滑动,但是的需求里面已经有了这玩意,但是在Fragment中还要有类似功能…

基于3D扫描和3D打印的产品逆向工程实战【数字仪表】

逆向工程是一种从物理零件创建数字设计的强大方法,并且可以与 3D 扫描和 3D 打印等技术一起成为原型设计工具包中的宝贵工具。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 3D 扫描仪可以非常快速地测量复杂的物体,并且在涉及现实生活参考时可以…

花生壳内网穿透+Windows系统,如何搭建网站?

1. 准备工作 在百度搜索“Win7下安装ApachePHPMySQL”,根据搜到的教程自行安装WAMP环境。 如果在网页上键入http://127.0.0.1/ 出现以下页面表示您的服务器已经建好,下一步就是关键,如何通过花生壳内网穿透,让外网的用户访问到您…

设计模式 - 责任链

一、前言 ​ 相信大家平时或多或少都间接接触过责任链设计模式,只是可能有些同学自己不知道此处用的是该设计模式,比如说 Java Web 中的 Filter 过滤器,就是非常经典的责任链设计模式的例子。 那么什么是责任链设计模式呢? ​ …

大数据课程L6——网站流量项目的SparkStreaming

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解网站流量项目的SparkStreaming概述; ⚪ 掌握网站流量项目的SparkStreaming实现 Wordcount 底层流程; ⚪ 掌握网站流量项目的SparkStreaming实现历史批次的累积处理; ⚪ 掌握网站流…

快速学会git版本管理——上传gitee仓库

首先在gitee右上角有一个新建仓库 创建之后打开自己想要上传的文件 右键打开 Git Bash Here 接下来会弹出git的窗口 首先先初始化仓库 用git命令 git init 然后用git add . 上传所有文件上传到暂存区(上一篇文章说过add是单个文件,add . 是所有文件) 没有显示错误 …

OpenCV_CUDA_VS编译安装

一、OpenCV 我这里是下载的OpenCV4.5.4,但是不知道到在vs里面build时一直报错,后面换了4.7.0的版本测试,安装成功。 Release OpenCV 4.5.4 opencv/opencv GitHub 这个里面有官方预编译好的OpenCV库,可以直接食用。 扩展包&am…

SQL4 查询结果限制返回行数

描述 题目:现在运营只需要查看前2个用户明细设备ID数据,请你从用户信息表 user_profile 中取出相应结果。 示例: iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543female20北京大学Beijin…

设计模式(1) - UML类图

1、前言 从这一节开始,我们将一起学习设计模式。我们的学习目标是什么呢? 了解常用设计模式以及它们的使用场景;分析实际工程中设计模式的使用,揣摩实际意图,了解作者设计思路;尝试运用设计模式迭代、重构…

css transition 指南

css transition 指南 在本文中&#xff0c;我们将深入了解 CSS transition&#xff0c;以及如何使用它们来创建丰富、精美的动画。 基本原理 我们创建动画时通常需要一些动画相关的 CSS。 下面是一个按钮在悬停时移动但没有动画的示例&#xff1a; <button class"…

MySQL下载安装环境变量配置,常用命令

一、下载安装 mysql官网 下载连接 这个是下载图形安装 https://dev.mysql.com/downloads/installer/ 这个是下载免图形安装 https://dev.mysql.com/downloads/mysql/ 担心个别宝宝没有账号&#xff0c;这边也提供一下&#xff0c;方便下载&#xff1a; 账户&#xff1a;1602404…

算法基础-数学知识-容斥原理、博弈论

容斥原理、博弈论 容斥原理890. 能被整除的数&#xff08;二进制状态压缩版本&#xff0c;复杂度多一个Om&#xff09;890. 能被整除的数&#xff08;dfs版本&#xff09; 博弈论无限制nim游戏AcWing 891. Nim游戏AcWing 892. 台阶-Nim游戏&#xff08;待补&#xff09; 集合版…