当前位置: 首页 > news >正文

HIT 计统实验2 二进制炸弹(gdb破解版) 拆弹过程

CSAPP 实验2是一个很好玩的实验,网上有很多参考资源写的都很好,本文增加了一些具体细节。

想要我的炸弹可以私信我。 还得看形式语言 , 炸弹6 7 有时间再拆

第1章 实验基本信息

1.1 实验目的

  • 熟练掌握计算机系统的ISA指令系统与寻址方式
  • 熟练掌握Linux下调试器的反汇编调试跟踪分析机器语言的方法
  • 增强对程序机器级表示、汇编语言、调试器和逆向工程等的理解

1.2 实验环境与工具

1.2.1 硬件环境

Intel 10850H x86_64

1.2.2 软件环境

Ubuntu 20.04

1.2.3 开发工具

Vim、gdb、visual studio

1.3 实验预习

认真学习gdb的用法与汇编语言相关知识

了解一些cmd指令,比如看计算器 cmd+calc

cmd命令以及用法大全_cmd命令操作_qq_38196334的博客-CSDN博客

第2章 实验环境建立

2.1 Ubuntu下CodeBlocks反汇编(10分)

CodeBlocks运行hello.c。反汇编查看printf函数的实现。

要求:C、ASM、内存(显示hello等内容)、堆栈(call printf前)、寄存器同时在一个窗口。

注意:如果想调试的话必须建立工程,血的教训!!!!

测试代码:

#include<stdio.h>
int m = 0;int r = 3;int sum(int x1,int x2,int x3,int x4, int x5,int x6,int x7,int x8){return x1+x2+x3+x4+x5+x6+x7+x8;
}int main(){m = m/r;m = sum(1,2,3,4,5,6,7,8);printf("%d\n",m);const char* a= "Hello-2021112114-lyx";printf("Hello-202111-xiaoyu");
}

进行调试:

 查看变量m的值:

如图所示(橙色荧光标注),由于数据在计算机中采用小端存储,所以是0000000..24(十六进制)
转换成十进制就是36

查看字符串2021112114-lyx:

方法1:字符串在字符串表里,你这个是字符串常量,它的值是个const char*,你如果想看可以用一个const char*指向它然后查一下这个地址

 方法2:通过rip查找,也就是查看PC的值,然后去访问那个地址,把字节开到最大就能找到字符串。

将rip的地址输入,把字节调到最大就能找到,这里显示的是printf中的参数,不是const char *的参数,一个是字符库一个是位于数据区和代码区 

本来想拿edb看虚拟地址,但是有保护机制,每次运行的虚拟地址不一样。

2.2 Ubuntu下EDB运行环境建立(10分)

用EDB调试hello.c的执行文件,截图,要求同2.1

gcc hello.c
edb --run a.out

 点完run 以后一直step into 不要问为什么QWQ

第3章 各阶段炸弹破解与分析

前几阶段的密码:防止笔误

I was trying to give Tina Fey more material.
0 1 1 2 3 5
3 g 207
14 7
5 115

每阶段30分,密码10分,分析20分,总分不超过80分

汇编器将汇编代码翻译成二进制指令

cd 到所在文件夹
gdb bomb
b phase_1 #设置断点
run
ni 单步运行一句 ni 2单步运行两句
layout asm 调试查看方便一些
objdump -d ./bomb > bomb.s
翻译成汇编代码

3.1 阶段1的破解与分析

密码如下:I was trying to give Tina Fey more material.(注意标点).

破解过程:

 调用了string not equal函数,如果不相等,就跳转到炸弹爆炸函数,推测比较的字符串在寄存器里,此外可以看到两个push将参数入栈,是为strings_not_equal()准备的。根据函数名,可以知道这个函数是在比较两个字符串是否相等,所以push的很有可能就是一个答案字符串所在地址(如果是程序自带的变量包括字符串等都会在.rodata部分,所以压栈时会直接压入对应地址,另一个来自标准输入的字符串地址。所以利用gdb查看输入和比较的字符串。

3.2 阶段2的破解与分析

密码如下:0 1 1 2 3 5 

破解过程:光看汇编代码就能破解。

 根据汇编代码推测,第一个参数的位置在$rbp-0x30(位置) 第二个参数在$rbp-0x2c(44)的位置根据规律依次减少四,存入参数地址。首先判断第一个和第二个数是不是0和1,ebx相当于计数器i记录循环的标志,-0x30(%rbp,%rax,4)相当于数组是输入的参数以偏移量的形式展示。$rdx和$ebx是相等的,ecx比eax少1,显示不同顺序的参数,由add    -0x30(%rbp,%rcx,4),%eax相当于一个斐波那契数列,递归的起点是0 1,递推式是fib(n) = fib(n-1)+fib(n-2)

0000000000401414 <phase_2>:401414:	55                   	push   %rbp401415:	48 89 e5             	mov    %rsp,%rbp401418:	53                   	push   %rbx401419:	48 83 ec 28          	sub    $0x28,%rsp40141d:	48 8d 75 d0          	lea    -0x30(%rbp),%rsi401421:	e8 c8 05 00 00       	call   4019ee <read_six_numbers>401426:	83 7d d0 00          	cmpl   $0x0,-0x30(%rbp)	        //第一个数是不是040142a:	75 06                	jne    401432 <phase_2+0x1e>    //不相等或者不为040142c:	83 7d d4 01          	cmpl   $0x1,-0x2c(%rbp)		//同理401430:	74 05                	je     401437 <phase_2+0x23>	//如果第二个参数不是1引爆炸弹401432:	e8 95 05 00 00       	call   4019cc <explode_bomb>401437:	bb 02 00 00 00       	mov    $0x2,%ebx		// i = 240143c:	eb 08                	jmp    401446 <phase_2+0x32>40143e:	e8 89 05 00 00       	call   4019cc <explode_bomb>401443:	83 c3 01             	add    $0x1,%ebx	//i = i+1=3  i=4 i = 5401446:	83 fb 05             	cmp    $0x5,%ebx	if(i!=5)401449:	7f 1e                	jg     401469 <phase_2+0x55>	//我们的目标是安全循环出来40144b:	48 63 d3             	movslq %ebx,%rdx//rdx = 2 rdx = 340144e:	8d 4b fe             	lea    -0x2(%rbx),%ecx//ecx = 0 ecx = 1 ecx = 2 ecx = 3401451:	48 63 c9             	movslq %ecx,%rcx401454:	8d 43 ff             	lea    -0x1(%rbx),%eax//eax = 1	eax = 2 eax = 3 ecx = 4401457:	48 98                	cltq   401459:	8b 44 85 d0          	mov    -0x30(%rbp,%rax,4),%eax//传入第二个参数 传入第三个参数40145d:	03 44 8d d0          	add    -0x30(%rbp,%rcx,4),%eax//a2'=a1+a2=1	a3'=a2+a3=1+a3  a4'=a3+a4 a5=a4+a5401461:	39 44 95 d0          	cmp    %eax,-0x30(%rbp,%rdx,4)//a3=a2'=1?		a4=a3'=a3+1?  a5 = a4'? a6=a5'=a4'+a5=2(a3+1)+a5?401465:	74 dc                	je     401443 <phase_2+0x2f>401467:	eb d5                	jmp    40143e <phase_2+0x2a>401469:	48 83 c4 28          	add    $0x28,%rsp40146d:	5b                   	pop    %rbx40146e:	5d                   	pop    %rbp40146f:	c3                   	ret    

3.3 阶段3的破解与分析

密码如下:3 g 207(答案不唯一)

破解过程:

gdb bomb
b phase_
run sol.txt
  •  首先当然还是先观察phase_3的汇编代码,看是不是调用了有关输入的参数的函数:在sscanf函数调用后检查$eax,因为sscanf在参数匹配成功后会将匹配成功的参数的个数放入eax中返回,所以检查eax是否大于2,即至少应匹配三个参数才能过第一个爆炸点.

  • 确定输入字符串的格式: %d %c %d 

  •  

                        推断出$ rbp - 0x4存的是第一参数,并且必须小于7,这里就以3为例

x/x 地址 #查看地址存的数据第一个x代表查看内存内容 第二个x代表以十六进制的形式显示

                                         猜测:判断第三个参数和0xcf也就是207是否相等

                  猜测rbp-0x9位置存放的是字符,再根据acii码对比可知103--g,第二个是比较ACII码

 3.4 阶段4的破解与分析

密码如下:14 7

破解过程:

gdb bomb 
b phase_4
r sol.txt #推荐把前几关的密码写入文件中
ni
layout asm
x/s 地址  #查看字符串形式的输入格式

破解过程相信大家已经轻车熟路了,首先查看输入的形式,输入两个数字,如果输入的数字个数不是2,就会引爆炸弹。

 根据寄存器的使用规则,arg1作为函数的第三个输入参数,他的存放地址由寄存器rdx来确定,对于第四个参数他的寄存地址由rcx确定,接下来我们要根据代码确定arg1和arg2的具体数值。

1.测试数据 99 88; 通过测试发现$rbp-0x4储存的是第一参数,下方的test是判断是不是等于0的操作。

2.接着单步运行发现不仅要大于0,而且还不能大于0xe也就是15 

3.紧接着,执行了三条赋值语句,可以推测三条mov指令是为fun4准备参数 

4.关于fun4如何执行我们之后再看,我们先看fun4执行完之后的代码

根据寄存器的使用规则,函数返回值必须放在rax中,所以返回值必须为7,否则会引爆炸弹。

第二个cmpl函数cmpl -x08(rbp),用来比较agr2和7的大小,所以可以确定第二个输入参数为7,我们进一步缩小范围,第一个数小于等于14第二个数是7

5.下面我们来分析一下函数fun4的代码:

                                                                 测试数据

(gdb) i r

         在调用函数之前查看寄存器 rax 存放第一个值 rdx =14 rsi = 0 rdi存放函数的第一个参数,如果相等那么mov    $0x0,%eax返回值是0不是7,就不符合要求,所以一定是在函数中跳转结束的。

看代码:

00000000004015be <func4>:            (edx=14 ecx =7 esi=0)4015be:	55                   	push   %rbp4015bf:	48 89 e5             	mov    %rsp,%rbp4015c2:	89 d1                	mov    %edx,%ecx    #此时ecx = edx=144015c4:	29 f1                	sub    %esi,%ecx    #ecx = ecx = 144015c6:	89 c8                	mov    %ecx,%eax    #eax = ecx = 144015c8:	c1 e8 1f             	shr    $0x1f,%eax   #逻辑右移eax >> 0x1f(31)逻辑移位 相当于左移一位 此时eax应该是0 因为不能保证精度4015cb:	01 c8                	add    %ecx,%eax   #eax = eax+ecx =144015cd:	d1 f8                	sar    %eax	   #移位的位数等于1时,可以省略 	对eax进行算数算数右移一位的操作,可以看成这个数除以2 eax = 74015cf:	01 f0                	add    %esi,%eax   #eax = 0+eax = 7	4015d1:	39 f8                	cmp    %edi,%eax   #7和第一个参数对比	4015d3:	7f 09                	jg     4015de <func4+0x20>#如果比第二个参数大话,edi[7,14]4015d5:	7c 13                	jl     4015ea <func4+0x2c>#如果小的话4015d7:	b8 00 00 00 00       	mov    $0x0,%eax4015dc:	5d                   	pop    %rbp4015dd:	c3                   	ret    4015de:	8d 50 ff             	lea    -0x1(%rax),%edx4015e1:	e8 d8 ff ff ff       	call   4015be <func4>4015e6:	01 c0                	add    %eax,%eax4015e8:	eb f2                	jmp    4015dc <func4+0x1e>4015ea:	8d 70 01             	lea    0x1(%rax),%esi4015ed:	e8 cc ff ff ff       	call   4015be <func4>4015f2:	8d 44 00 01          	lea    0x1(%rax,%rax,1),%eax4015f6:	eb e4                	jmp    4015dc <func4+0x1e>

第一轮调用:如果是jg eax = 7 ecx = 14 edx = 14  让rax+1

 4015ea:	8d 70 01             	lea    0x1(%rax),%esi4015ed:	e8 cc ff ff ff       	call   4015be <func4>

 只有函数返回值为1的时候递归才结束,此时返回值一定是eax = 2*0+1 = 1

要想让eax= 7只有调用7次,也就是eax增加七次所以7+7 = 14或者7-7=0;又因为前面的限制条件所以第一个参数不能为0,所以密码只能是14 7;

ecx = edx = 6 eax = edx = 6 eax = 0 eax = 6  eax = 3 eax = 3

3.5 阶段5的破解与分析

密码如下:5 115

破解过程:

老规矩我们先分析一下汇编代码

 确定参数地址和输入形式

 and一个都是1的数字,没有啥作用,作用主要是生成标志位判断是不是0。指令and    $0xf, %eax取得第一个参数的后四位,且要求第一个参数不能是15,edx为计数器,ecx为累加,根据当次循环eax的值去寻址mov    0x403200(,%rax,4),%eax取到数组中的下一个不连续的元素,结束循环的条件是eax取到15时edx计数到15次,第二个参数与ecx相等。查看地址    0x4031e0(,%rax,4)的元素,观察数组有唯一确定的跳转表将这些值累加得115 其实直接最后看看ecx就行

     3-12-7-11-4-13-6-9-4-8-0-10-1-2-14-6-15

                                         3-12-7-11-4-13-6-9-4-8-0-10-1-2-14-6-15

                                        最后和ecx比较是不是相等 

 参考:

CSAPP第二次实验 bomb二进制炸弹的破解_FatFat-Whale的博客-CSDN博客

汇编学习记录-两种架构汇编指令简单总结_此号已废20的博客-CSDN博客

B站九曲阑干 

哈工大各位大佬

相关文章:

HIT 计统实验2 二进制炸弹(gdb破解版) 拆弹过程

CSAPP 实验2是一个很好玩的实验,网上有很多参考资源写的都很好&#xff0c;本文增加了一些具体细节。 想要我的炸弹可以私信我。 还得看形式语言 &#xff0c; 炸弹6 7 有时间再拆 第1章 实验基本信息 1.1 实验目的 熟练掌握计算机系统的ISA指令系统与寻址方式熟练掌握Linu…...

echart 半环渐变仪表盘

实现效果如图&#xff1a; op配置项代码&#xff1a; let Chart this.$echarts.init(document.getElementById(dashboard-1));let option {// backgroundColor: #040d2e,series: [// 中间灰色轴线{type: gauge,radius: 150%, // 位置center: [50%, 90%],startAngle: 180,end…...

【springboot】自动加载分析

文章目录问题SpringBootApplication注解AutoConfigurationPackages.Registrar类AutoConfigurationImportSelector类springboot如何加载其他的starter总结问题 为什么我们在使用springboot的时候&#xff0c;只需要在maven中导入starter就能够使用呢&#xff1f;这里来分析一下…...

ChatGPT批量翻译-ChatGPT批量生成多国语言

ChatGPT翻译的准吗 ChatGPT是一种基于Transformer架构的自然语言处理技术&#xff0c;其翻译准确性取决于所训练的模型和数据集的质量。在特定的语料库和训练数据下&#xff0c;ChatGPT可以实现一定程度的准确翻译。但是&#xff0c;与人工翻译相比&#xff0c;ChatGPT的翻译质…...

Symble

ES6引入了一种新的原始数据类型 Symbol&#xff0c;表示独一无二的值。它是JavaScript语言的第七种数据类型&#xff0c;是一种类似于字符串的数据类型。 Symbol特点 Symbol 的值是唯一的&#xff0c;用来解决命名冲突的问题 Symbol值不能与其他数据进行运算 Symbol定义的对…...

能在家里赚钱的工作有哪些?适合普通人的兼职项目

当下对于普通人而言&#xff0c;想在社会上找到一份舒心安逸的工作很难&#xff0c;特别是在薪酬待遇这方面&#xff0c;更是低得让人心寒。那么&#xff0c;如果能有一份在家就可以做的事情&#xff0c;而且是收入也不少&#xff0c;那将是很多普通人的最佳选择。在这里&#…...

创建SaaS产品帮助中心的关键步骤

帮助中心是一款SaaS产品必不可少的一部分&#xff0c;为了帮助用户更好的解决产品相关问题&#xff0c;提高新用户的使用体验&#xff0c;并且引导用户更好的使用产品&#xff0c;那么应该怎样制作帮助中心呢&#xff0c;每个产品帮助中心都需要有自己的风格&#xff0c;根据产…...

高频算法:Leetcode53 最大子数组和

今天讲的是Leetcode第53题&#xff0c;最大子数组和 首先观察题目&#xff0c;题目需要我们找出具有最大和的连续子数组&#xff0c;直接拿题目中的示例来做一个演示&#xff0c;找一找什么规律下的连续子数组才能得到最大的和 先从-2开始&#xff0c;-2 1 -1 此时我们的和…...

如何编写接口自动化测试框架、

编写接口自动化测试框架需要注意以下几点&#xff1a; 接口选择&#xff1a;首先确定需要测试的接口&#xff0c;包括请求方式、URL、参数、返回值等信息。 框架设计&#xff1a;设计一个灵活的框架&#xff0c;可以根据接口类型&#xff08;RESTful API、SOAP API等&#xff…...

【Java面试八股文宝典之RabbitMQ篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day17

大家好&#xff0c;我是陶然同学&#xff0c;软件工程大三即将实习。认识我的朋友们知道&#xff0c;我是科班出身&#xff0c;学的还行&#xff0c;但是对面试掌握不够&#xff0c;所以我将用这100多天更新Java面试题&#x1f643;&#x1f643;。 不敢苟同&#xff0c;相信大…...

ESP32开发(1)----Espressif-IDE开发环境配置

Espressif-IDE开发环境配置前言一、ESP32-WROOM-32介绍二、IDE环境搭建三、建立第一个项目总结前言 最近得到一块ESP32-WROOM-32的开发板&#xff0c;没有原理图&#xff0c;但板子走线比较简单&#xff0c;看着板子上的布线大致猜一猜连接&#xff0c;然后试玩了一下&#xf…...

MyBatisPlus标准数据层开发

MyBatisPlus标准数据层开发2&#xff0c;标准数据层开发2.1 标准CRUD使用2.2 新增2.3 删除2.4 修改2.5 根据ID查询2.6 查询所有2.7 Lombok概念使用步骤步骤1:添加lombok依赖步骤2:安装Lombok的插件步骤3:模型类上添加注解2.8 分页功能步骤1:调用方法传入参数获取返回值步骤2:设…...

C/C++每日一练(20230412)

目录 1. 二维数组找最值 &#x1f31f;&#x1f31f; 2. 排序 &#x1f31f; 3. 二叉树展开为链表 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 二维…...

Leetcode.1379 找出克隆二叉树中的相同节点

题目链接 Leetcode.1379 找出克隆二叉树中的相同节点 easy 题目描述 给你两棵二叉树&#xff0c;原始树 original和克隆树 cloned&#xff0c;以及一个位于原始树 original中的目标节点 target。 其中&#xff0c;克隆树 cloned是原始树 original的一个 副本 。 请找出在树 …...

2022年团体程序设计天梯赛-总决赛

目录 一、L1-1 今天我要赢 二、L1-2 种钻石 三、L1-3 谁能进图书馆 四、L1-4 拯救外星人 五、L1-5 试试手气 六、L1-6 斯德哥尔摩火车上的题 七、L1-7 机工士姆斯塔迪奥 八、L1-8 静静的推荐 九、L2-1 插松枝 十、L2-2 老板的作息表 十一、L2-3 龙龙送外卖 十二、L…...

大数据技术之Sqoop——SQL to Hadoop

一、简介sqoop &#xff08;sql to hadoop&#xff09;是一款开源的工具,主要用于在 Hadoop&#xff08;Hive&#xff09;与传统的数据库&#xff08;mysql、postgresql...&#xff09;间进行数据的传递&#xff0c;可以将一个关系型数据库&#xff08;例如 : MSQL,Oracle,Post…...

Java议题

序号议题 解释MyBatis官网1mapper文件中什么时候使用 # 什么时候必须用 $ 1、关键字作为参数&#xff0c;使用"$"&#xff0c;两边不加""。 2、非关键字作为参数&#xff0c;使用"#"防注入。 其他情况优先使用"#" 2主键回填&#xff0…...

【阅读论文】USAD:多变量时间序列上的无监督异常检测

USAD : UnSupervised Anomaly Detection on Multivariate Time Series 摘要 IT系统的自动监控是Orange目前面临的挑战。考虑到其IT运营所达到的规模和复杂性&#xff0c;随着时间的推移&#xff0c;用于推断正常和异常行为的测量所需的传感器数量急剧增加&#xff0c;使得传统…...

Java多线程:ReentrantLock中的方法

公平锁与非公平锁 ReentrantLock有一个很大的特点&#xff0c;就是可以指定锁是公平锁还是非公平锁&#xff0c;公平锁表示线程获取锁的顺序是按照线程排队的顺序来分配的&#xff0c;而非公平锁就是一种获取锁的抢占机制&#xff0c;是随机获得锁的&#xff0c;先来的未必就一…...

RabbitMQ初识快速入门

RabbitMQ初识&快速入门1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯1.2.技术对比&#xff1a;2.快速入门2.1.安装RabbitMQ2.1.1 下载镜像2.1.2 安装MQ2.2.RabbitMQ消息模型2.3.导入Demo工程2.4.入门案例2.4.1.publisher实现2.4.2.consumer实现2.5.总结1.初识MQ…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...