【CSAPP】Binarybomb 实验(phase_1-6+secret_phase)

news2024/10/2 10:40:33

Binarybomb 实验(phase_1-6+secret_phase)

实验内容

一个“binary bombs”(二进制炸弹,下文将简称为炸弹)是一个Linux可执行C程序,包含了7个阶段(phase1~phase6和一个隐藏阶段)。炸弹运行的每个阶段要求学生输入一个特定的字符串,若的输入符合程序预期的输入,该阶段的炸弹就被“拆除”,否则炸弹“爆炸”并打印输出 "BOOM!!!"字样。实验的目标是拆除尽可能多的炸弹层次。
每个炸弹阶段考察了机器级语言程序的一个不同方面,难度逐级递增:

  • 阶段1:字符串比较
  • 阶段2:for循环
  • 阶段3:switch分支
  • 阶段4:递归函数
  • 阶段5:数组元素按序访问
  • 阶段6:链表
  • 隐藏阶段:只有在阶段4的拆解字符串后再附加一特定字符串后才会出现(作为最后一个阶段)

为了完成二进制炸弹拆除任务,需要使用gdb调试器和objdump来反汇编炸弹的可执行文件,并单步跟踪调试每一阶段的机器代码,从中理解每一汇编语言代码的行为或作用,进而设法“推断”出拆除炸弹所需的目标字符串。这可能需要在每一阶段的开始代码前和引爆炸弹的函数前设置断点,以便于调试。

实验材料:bomb程序与bomb.c文件。
请添加图片描述

实验目标

正常运行bomb程序,不执行程序内的explode_bomb函数。

实验过程

  1. 创建答案文本文件solution.txt,并随意填入7行字符串,对应phase_1-6 与 secret_phase 的破解字符串。
    在这里插入图片描述
  2. 使用gdb对bomb程序进行调试,并打开可视化界面。
    打开gdb
    在这里插入图片描述
    打开可视化
    在这里插入图片描述
  3. 整体界面
    在这里插入图片描述

phase_1

实验步骤

  1. 在gdb设置断点
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    在这里插入图片描述

  2. 运行bomb程序,并定位到爆炸点
    运行
    在这里插入图片描述
    定位爆炸点
    在这里插入图片描述

  3. 分析爆炸点
    爆炸点跳转是通过判定strings_not_equal函数的返回值进行跳转。故我们查看参数%rsi中的值。
    在这里插入图片描述

  4. 修改solution.txt中,phase_1的字符串为Border relations with Canada have never been better.
    在这里插入图片描述

  5. 重新运行,过关
    在这里插入图片描述

phase_2

实验步骤

  1. 在gdb中设置断点
    在这里插入图片描述

  2. 运行bomb程序,并定位爆炸点。
    在这里插入图片描述

  3. 分析爆炸点
    通过函数名可知,phase_2需要我们输入6个数字。

  4. 修改solution.txt,phase_2的字符串随意输入6个数字。
    在这里插入图片描述

  5. 重新运行,并定位爆炸点。
    在这里插入图片描述

  6. 分析爆炸点
    炸弹爆炸直接原因是 %eax中的值 与 0x0(%rbp,%rbx,4) 的值不同,导致没有跳转,触发了下一条的explode_bomb
    根据前文mov %rsp,%rbp我们得出%rbp的值为%rsp的值。
    查看%rsp地址,发现%rsp为我们输入的6个数字,故%rbp为我们输入值的首地址。
    在这里插入图片描述
    再分析%rbx,很明显%rbx是1-5的一个遍历值,置于0x0(%rbp,%rbx,4)中,后者意义为遍历我们输入的第2-6个数字。
    在这里插入图片描述
    再来看最后一项%eax,先将%ebx设置为%ebx,再加上-0x4(%rbp,%rbx,4)的值,后者为我们遍历到的数字往前4个字节,即前一个数字。所以这里意思为,把我们输入数字按顺序0-5编号,当前数字必须等于当前编号+上一个数字。
    在这里插入图片描述

  7. 修改solution.txt,phase_2的字符串为0 1 3 6 10 15,即0,0+1,1+2,3+3,6+4,10+5。

  8. 重新运行,过关。
    在这里插入图片描述

phase_3

实验步骤

  1. 在gdb中设置断点
    在这里插入图片描述
  2. 运行程序,并定位到爆炸点。
    在这里插入图片描述
  3. 分析爆炸点
    爆炸原因为,__isoc99_sscanf 函数的返回值%eax小于等于1。我们查询百度得知 __isoc99_sscanf 函数的返回值为输入参数的数量。我们查看标注的地址0x5555554029cf,得知我们需要输入两个整数。
    在这里插入图片描述
  4. 修改solution.txt,phase_3的字符串随意输入两个整数。
    在这里插入图片描述
  5. 重新运行,并定位到爆炸点。
    在这里插入图片描述
  6. 分析爆炸点
    爆炸直接原因为%eax 和 0x4(%rsp) 的值不相等。根据前文mov $0x1c1,%eax可知%eax的值为0x1c1。再分析%rsp,查看%rsp的值,发现%rsp为我们输入数字的首地址,而0x4(%rsp)为输入的第二个数。故把第二个数修改为449(0x1c1)。
    在这里插入图片描述
  7. 修改solution.txt,phase_3的字符串的第二个数为449。
    在这里插入图片描述
  8. 重新运行,过关。
    在这里插入图片描述

phase_4

实验步骤

  1. 在gdb设置断点
    在这里插入图片描述

  2. 运行程序,定位到爆炸点
    在这里插入图片描述

  3. 分析爆炸点
    同phase_3,需要输入两个整数。

  4. 修改solution.txt,phase_4的字符串为随意两个整数
    在这里插入图片描述

  5. 重新运行程序,定位到爆炸点
    在这里插入图片描述

  6. 分析爆炸点
    爆炸直接原因为%eax的值不等于0xa。而%eax为func4函数的返回值。故我们需要func4返回10,即0xa。

  7. 分析func4
    根据前文,func4有三个参数%edx,%esi,%edi。值分别为0xe,0x0,(%rsp)。
    在这里插入图片描述
    查看%rsp,发现%rsp为我们输入的两个整数的地址。
    进入func4函数
    在这里插入图片描述
    我们首先查看返回
    在这里插入图片描述
    从中我们了解递归的终止条件为%edi和%ebx相等,返回值为%ebx的值。
    我们查看有关%ebx的代码。
    在这里插入图片描述
    我们将代码分模块,分别为操作模块和跳转模块
    在这里插入图片描述
    操作模块1,分析此段代码执行的操作如下。
    在这里插入图片描述
    跳转模块1,当%ebx大于%edi时跳转。执行操作为将%rbx-1赋给%edx执行func4,将结果累加到%ebx中,并返回。
    在这里插入图片描述
    跳转模块2,当%ebx小于%edi时跳转。执行操作为将%rbx+1赋给%esi执行func4,将结果累加到%ebx中,并返回。
    在这里插入图片描述
    我们需要返回值累加为10,%edx初始为14即0xe,%esi初始为0,%edi为我们输入的参数。故我们执行两次跳转模块1即可得到返回值10,7+3 = 10。所以%rdi应该为3。

  8. 修改solution.txt,phase_4字符串的第一个参数应为3。
    在这里插入图片描述

  9. 重新运行程序,并定位爆炸点。
    在这里插入图片描述

  10. 分析爆炸点
    爆炸原因为0x4(%rsp)的值不等于0xa,而%rsp为我们输入的参数的首地址。而0x4(%rsp)为我们输入的第二个参数,故需修改第二个参数为10,即0xa。

  11. 修改solution.txt,phase_4的字符串第二个参数为10。
    在这里插入图片描述

  12. 重新运行程序,过关。
    在这里插入图片描述

phase_5

实验步骤

  1. 在gdb设置断点
    在这里插入图片描述

  2. 运行程序,并定位爆炸点。
    在这里插入图片描述

  3. 分析爆炸点
    同phase_4,需要输入两个整数。

  4. 修改solution.txt,phase_5的字符串为随意两个整数。
    在这里插入图片描述

  5. 重新运行程序,并定位爆炸点。
    在这里插入图片描述

  6. 分析爆炸点
    爆炸的直接原因是%edx不等于15,即0xf。我们查看有关%edx的代码。
    在这里插入图片描述
    从中可以看出%edx是一个计数器,我们需要执行15次add $0x1,%edx。我们查看可以跳转到目标的代码:
    在这里插入图片描述
    其中跳转条件为%eax不等于15,即0xf,所以我们需要%eax不等于15,15次。我们查看其中有关%eax的代码。
    在这里插入图片描述
    其中查看%rsp发现是我们输入的参数地址,所以上部分的操作为将我们输入的第一个参数赋给%eax,并取出低4位。且%eax的值不等于15,否则进入爆炸点<phase_5+57>。而下部分为取出(%rsi,%rax,4)中的值给%eax。我们查看%rsi中的值:
    在这里插入图片描述
    所以我们需要执行15次mov (%rsi,%rax,4),%eax,最后一次结果为15。我们从15反推,15->6(24/4)->14(56/4)->2(8/4)->1(4/4)->10(40/4)->0(0/4)->8(32/4)->4(16/4)->9(36/4)->13(52/4)->11(44/4)->7(28/4)->3(12/4)->12(48/4)->5(20/4)。所以%rax第一次应该为5。

  7. 修改solution.txt,phase_5的字符串第一个参数为5。
    在这里插入图片描述

  8. 重新运行,定位到爆炸点。
    在这里插入图片描述

  9. 分析爆炸点
    爆炸直接原因为%ecx和0x4(%rsp)的值不相等,没有跳转而触发下一条的炸弹。%rsp为我们输入参数的地址,所以0x4(%rsp)为我们输入的第二个参数。我们直接查看%ecx的值:
    在这里插入图片描述
    所以我们第二个参数应该为115。

  10. 修改solution.txt,phase_5的字符串第二个参数为115。
    在这里插入图片描述

  11. 重新运行程序,过关。
    在这里插入图片描述

phase_6

实验步骤

  1. 在gdb设置断点
    在这里插入图片描述

  2. 运行程序,定位到爆炸点。
    在这里插入图片描述

  3. 分析爆炸点
    同phase_2,我们需要输入6个数字。

  4. 修改solution.txt,phase_6的字符串为随意6个数字。
    在这里插入图片描述

  5. 重新运行程序,定位到爆炸点。
    在这里插入图片描述

  6. 分析爆炸点
    爆炸的直接原因是无符号%eax大于5,而%eax的值是%r12的值-1。我们查看%r12的值:
    在这里插入图片描述
    发现%r12是我们输入参数的首地址。add $0x4,%r12代表%r12往后移4字节,即我们输入的下一个数。我们查看有关的跳转代码:
    在这里插入图片描述
    此处发现是对%ebx进行计数,当%ebx超过5便走一次<phase_6+45>,我们再查看有关%ebx的代码:
    在这里插入图片描述
    从此处可以看出%ebx与%r13d有关,我们再查看有关%r13d的代码:
    在这里插入图片描述
    发现%r13d也是一个计数,跳出条件为%r13d的值等于6。在前文查找%r13d的初始值:
    在这里插入图片描述
    所以%r13为1->5的遍历,每次遍历都会传值给%ebx进行%ebx->5的遍历,所以会执行5次add $0x4,%r12,即比较我们输入每个数字-1的结果无符号的小于等于5,即我们输入的每个数字必须是1-6。

  7. 修改solution.txt,phase_6的字符串为6个1-6间的数字。
    在这里插入图片描述

  8. 重新运行,并定位到爆炸点。
    在这里插入图片描述

  9. 分析爆炸点
    爆炸的直接原因是%eax与0x0(%rbp)的值相等,没有跳转,所以触发了下一条的炸弹。其中根据前文%rbp与%r12的值相同,而%eax的值为(%rsp,%rax,4)。其中%rax和%ebx的值相同,我们查看%rsp的值:
    在这里插入图片描述
    发现%rsp为我们输入参数的地址。根据前文的分析,可知当%rbp指向我们输入的第一个参数时,%rax会遍历1-5,即第一个数与其后面的所有数进行对比,不能相同。当%rbp指向我们输入的第二个参数时,%rax会遍历2-5,即第二个数与其后面的所有数进行对比,不能相同。总结,此段代码限制输入不能有重复元素。故我们需要输入1-6,并且不重复。

  10. 修改solution.txt,phase_6的字符串为6个1-6间的数字,并且不重复。
    在这里插入图片描述

  11. 重新运行,并定位到爆炸点。
    在这里插入图片描述

  12. 分析爆炸点
    爆炸的直接原因是%rbx的值大于%eax的值没有触发跳转,而执行了下一句的炸弹。查看有关%rbx的代码:
    在这里插入图片描述
    从此看出%rbx与0x20(%rsp)有关,查看与后者有关的代码:
    在这里插入图片描述
    而0x20(%rsp)与%rdx有关,再次查看有关代码:
    在这里插入图片描述
    从这可以看出%rdx是<node1>经过操作得到,查看node1中的值:
    在这里插入图片描述
    从<node1+8>的值是0x555555604220即<node2>的地址,看出这里存储了链表的6个节点,节点内存储的是数据和节点的编号。
    我们把代码分模块:
    在这里插入图片描述
    模块4,将%esi设置为0,并执行模块3
    模块3,%rsp是我们输入参数的首地址,mov (%rsp,%rsi,4),%ecx为取第%rsi+1个参数放到%ecx中,并将%eax设为1,将%rdx设为链表节点1的地址,若%ecx大于1执行模块1,否则执行模块2。
    模块1,我们了解%rdx是链表的结点,所以0x8(%rdx)的值是链表下一节点的地址。%eax是计数,当%eax不等于%ecx就继续执行mov 0x8(%rdx),%rdx。即找到编号为%ecx的链表节点,然后执行模块2。
    模块2,将取出的节点地址放到0x20(%rsp,%rsi,8)的位置,然后%rsi计数+1,当%rsi等于6时,跳出模块,否则按顺序执行模块3。
    总结,此段代码执行的功能为,将6个链表的结点,按我们输入参数的编号存储到0x20(%rsp)的位置。验证:
    在这里插入图片描述
    继续查看有关0x20(%rsp)的代码:
    在这里插入图片描述
    发现此段代码是根据我们输入的节点顺序,重新排列链表。%rbx为重排后链表的头结点。而%eax为当前节点的下一个节点地址。我们需要的链表是节点值从小到大排序的链表。所以我们应该输入的6个参数为5,2,6,3,1,4。

  13. 修改solution.txt,phase_6的字符串为5 6 2 3 1 4。
    在这里插入图片描述

  14. 重新运行程序,过关。
    在这里插入图片描述

secret_phase

secret_phase是隐藏了入口的,所以我们需要查看入口所在的地址,再拆除炸弹。

实验步骤

  1. 查看bomb汇编代码,查找调用secret_phase函数的代码。
    执行objdump -d bomb > bomb.s再打开bomb.s文件,搜索secret_phase。
    在这里插入图片描述
    所以入口在phase_defused函数中,我们返回gdb,对phase_defused函数进行调试。

  2. 在gdb中设置断点
    在这里插入图片描述

  3. 运行程序,并定位到转折点。
    在这里插入图片描述

  4. 分析转折点
    当我们执行到第6次phase_defused函数,我们不会直接按顺序ret,而是会跳转<phase_defused+50>执行另一段代码。此处的转折点是%eax的值不等于3,我们没有跳转,而顺序执行下文的<phase_defused+101>跳转到<phase_defused+29>,而+29的位置顺序执行就为函数结束位置。所以我们需要%eax等于3,以便能抵达secret_phase的位置。
    我们查看%rsi与%rdi两个参数:
    在这里插入图片描述
    发现3 10是phase_4的破解字符串:
    在这里插入图片描述
    而%d %d %s说明需要输入两个整数一个字符串。所以我们需要在phase_4的答案后面加上一个字符串。

  5. 修改solution.txt,phase_4字符串后面添加随意字符串。
    在这里插入图片描述

  6. 重新运行程序,并定位转折点。
    在这里插入图片描述

  7. 分析转折点
    跳转的原因是strings_not_equal函数的返回值不是0,即参数%rdi与参数%rsi不相同。我们查看%rdi与%rsi的值:
    在这里插入图片描述
    发现,%rdi是我们添加在phase_4答案后的字符串,所以我们修改该字符串为DrEvil。

  8. 修改solution.txt,phase_4的第三个参数改为DrEvil。
    在这里插入图片描述

  9. 重新运行程序,成功进入secret_phase。
    在这里插入图片描述

  10. 在gdb设置断点,开始破解
    在这里插入图片描述

  11. 运行程序,并定位到爆炸点。
    在这里插入图片描述

  12. 分析爆炸点
    爆炸原因为%eax无符号值大于1000,即0x3e8。而%eax是%rax的值-1,我们查看+24行的%rax,发现%rax的值为我们的输入值。所以这里限制我们只能输入1-1000。

  13. 修改solution.txt,secret_phase的字符串为随意1-1000的值。
    在这里插入图片描述

  14. 重新运行程序,并定位到爆炸点。
    在这里插入图片描述

  15. 分析爆炸点。
    爆炸的直接原因是fun7函数的返回值%eax不等于2,没有跳转,而触发了下文的炸弹。我们查看fun7函数:
    在这里插入图片描述
    我们首先了解fun7的参数%esi和%rdi,查看%esi:
    在这里插入图片描述
    发现%esi是我们输入的数字。查看%rdi:
    在这里插入图片描述
    发现%rdi是一个结构,其中储存了一个数据,和两个地址,这是二叉树的结构。我们再来分析fun7函数的终止条件:
    在这里插入图片描述
    我们从中可以看出,函数的终止有两处。一是红色方框内容,判断%rdi节点是否为空,为空就将0xffffffff赋给%eax,然后结束函数。我们需要%eax的值为2,所以我们不能走红色的终止;二是蓝色方框内容,我们要避开两个跳转,一个为%edx大于%esi,一个为%edx不等于%esi。所以我们需要的终止条件为,%edx等于%esi,而%edx的值为%rdi节点存储的数据,所以我们输入的值%esi应该为二叉树某个节点的数据。
    我们将代码分块:
    在这里插入图片描述
    模块1,当%edx大于%esi,就执行mov 0x8(%rdi),%rdi,并执行fun7,最后将%eax * 2。我的理解为,若节点数据大于我们的输入值,则进入左子树,继续执行func7。
    模块2,首先将%eax置零,当%edx不等于%esi,联系上文即%edx小于%esi,就执行mov 0x10(%rdi),%rdi并执行fun7,最后将%eax * 2 +1。所以我们需要执行一次模块2,将%eax从0->1。再执行一次模块1,将%eax从1->2,然后结束函数即可得到返回值%eax为2。
    我们查询节点数值,因为函数递归调用,所以我们先执行模块1(左子树),再执行模块2(右子树)。
    在这里插入图片描述
    所以我们应该输入的值为22,即0x16。

  16. 修改solution.txt,修改secret_phase字符串为22。
    在这里插入图片描述

  17. 重新运行程序,过关。
    在这里插入图片描述

实验总结

过关答案截图:
在这里插入图片描述

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

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

相关文章

【CANoe示例分析】0002_SOMEIPDemo

该工程由Vector官方提供,作为仿真SOME/IP节点的示例。Demo中介绍了两种仿真SOME/IP节点的方法,一种是基于arxml数据库的仿真,另一种是没有数据库(arxml、fibex)的仿真。 无论是哪种形式的仿真,如果想要通过CAPL程序接收或者发送SOME/IP信息,都需要添加交互 层的信息,这…

不懂就问:年薪百万的程序员是怎么做到的?

很多人对程序员的第一反应就是“工资高”。 从行业平均薪酬来看&#xff0c;“程序员”相关专业的收入确实更高一点。 但是&#xff0c;“程序员”内部薪资却存在着很大的差异&#xff0c;多数人月薪在1-2万&#xff0c;一线城市可以达到3-5万&#xff0c;而顶级程序员&#…

探索Java面向对象编程的奇妙世界(六)

⭐ 多态(polymorphism)⭐ 对象的转型(casting)⭐ 抽象类⭐ 接口 interface ⭐ 多态(polymorphism) 多态指的是同一个方法调用&#xff0c;由于对象不同可能会有不同的行为。现实生活中&#xff0c;同一个方法&#xff0c;具体实现会完全不同。 比如&#xff1a;同样是调用人“吃…

回归方程的显著性检验——F检验

回归方程的显著性检验——F检验 9.2 回归方程的显著性检验 (edu-edu.com.cn) 概念 记号&#xff1a; y i y_i yi​&#xff1a;真实值&#xff0c;观测值 y ˉ \bar{y} yˉ​&#xff1a;真实值的平均值 y ^ \hat{y} y^​&#xff1a;估计值&#xff0c;预测值 几个差&#x…

Activiti、Flowable与CCFlow的选型对比

前言 工作流是什么&#xff0c;这个问题我们就不在此进行解释了&#xff0c;这里我们主要讲解一下Activiti、Flowable和CCFlow三款工作流的对比&#xff0c;为大家选型时做一些参考。 Activiti和Flowable大家可能多少都听说过&#xff0c;都是国外的工作流引擎&#xff0c;都…

Axure教程—单色面积图(中继器)

本文将教大家如何用AXURE制作单色面积图 一、效果介绍 如图&#xff1a; 预览地址&#xff1a;https://icg26y.axshare.com/ 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87837919?spm1001.2014.3001.5503 二、功能介绍 简单填写中继器内容即…

软件设计师总结-含括学习方法和学习过程,可参考

目录 考前备战宏观    心路历程-感受    学习阶段-计划的安排 微观一、课本和视频的学习    本阶段的目的:    侧重点    涉及的学习方法&#xff08;最后有如何使用这些方法&#xff09;    学习结果 二、32小时通关辅助前面的知识点    本阶段的…

提升企业管理效率的利器——ADManager Plus

在当今信息时代&#xff0c;企业的规模和复杂性不断增长&#xff0c;管理各个方面变得愈发具有挑战性。而在企业管理中&#xff0c;活跃目录&#xff08;Active Directory&#xff09;起着至关重要的作用。它是一种用于组织内部的用户、计算机、组和其他对象进行集中管理的目录…

javascript中的this与函数讲解

前言 javascript中没有块级作用域&#xff08;es6以前&#xff09;&#xff0c;javascript中作用域分为函数作用域和全局作用域。并且&#xff0c;大家可以认为全局作用域其实就是Window函数的函数作用域&#xff0c;我们编写的js代码&#xff0c;都存放在Window函数内&#x…

Hack The Box-Redeemer关卡

TASK 1 任务 1 Which TCP port is open on the machine? 计算机上打开了哪个 TCP 端口&#xff1f; 6379TASK 2 任务 2 Which service is running on the port that is open on the machine? 计算机上打开的端口上运行哪个服务&#xff1f; redisTASK 3 任务 3 What typ…

java学习——java学习进度一String类1(学习记录——供回溯)

String 分割字符串 split( ) String s "1,2,3,4"; //未使用split分割前 System.out.println(s.length());//使用split分割后 String[] ssplit s.split(","); System.out.println(ssplit.length);split( , ) //两个参数都有的时候&#xff0c;第一个为用…

视频编辑软件:迅捷视频工具箱

这是一款功能强大、易于使用的视频编辑工具&#xff0c;支持视频剪辑、视频转换、音频转换、视频压缩、视频水印、字幕贴图等实用功能&#xff0c;可以帮助你制作出高质量的视频作品。&#xff08;传送门&#xff1a;https://www.xunjiepdf.com/xjspgjx&#xff09; 功能简介 …

Linux:CentOS:进程查看和控制

查看 ps 查看静态的进程统计信息top查看动态的进程排名信息pgrep根据特定条件查询进程 PID 信息pstree以树形结构列出进程信息 S ---休眠 R ---运行 Z ---僵死&#xff08;应予以手动终止&#xff09; < ---高优先级 N ---低优先级 …

FrameLayout+LinearLayout实现首页底部菜单

1.布局样式 2.main.xml代码 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_par…

Socket(二)

文章目录 1. Socket地址2. 代理服务器3. 获取Socket的信息4. 关闭还是连接5. toString() 1. Socket地址 SocketAddress类表示一个连接端点&#xff0c;这个一个空的抽象类&#xff0c;除了一个默认构造函数外&#xff0c;没有其他方法。当前只支持TCP/IP Socket&#xff0c;实…

在云服务器上部署简单的聊天机器人网站(源1.0接口版)

诸神缄默不语-个人CSDN博文目录 又不是不能用.jpg http://47.113.197.198:8000/chat 集成代码可参考&#xff1a;花月与剑/scholar_ease 之所以先用源1.0&#xff0c;一是因为我API都申请了&#xff0c;不用白不用&#xff1b;二是因为源1.0可以直接用国内网络连接&#xf…

终极AI工具包【第一章 如何学习ChatGPT(基础知识)】

第1章&#xff1a;如何学习ChatGPT&#xff08;基础知识&#xff09; 1、什么是ChatGPT ChatGPT是OpenAI开发的一种人工智能&#xff08;AI&#xff09;语言模型。它是在一个称为GPT&#xff08;生成预训练变压器&#xff09;的架构下构建的&#xff0c;目的是理解和生成人类语…

商城配置-shorp

商城配置 说明 商城配置主要分为三块&#xff0c;基础配置&#xff0c;平台配置&#xff0c;支付配置,所有配置请都检查配置一下&#xff0c;文档中只对部分配置进行说明 基础配置 基础配置说明 基础配置包括&#xff0c;商城信息&#xff0c;会员配置&#xff0c;分享配置&am…

考研算法复试刷题19天:Prim算法求最小生成树 【prim,最小生成树】

最小生成树 参考博客&#xff1a;图解&#xff1a;什么是最小生成树&#xff1f; - 知乎 (zhihu.com) 总结下来的过程就是&#xff0c;一张图&#xff0c;我们将他化为树的形式&#xff0c;也就是生成树。那么最小生成树有是啥呢&#xff1f;所谓一个 带权图 的最小生成树&a…

图片类主题TOB主题1.0_WordPress主题

WordPress tob主题是一款基于WordPress程序的专业图片类主题&#xff0c;在图片展示上做了很多工作&#xff0c;扁平化设计、自适应响应式布局、多设备支持、强大的主题功能配置&#xff0c;希望tob主题可以开启图片站新时代。 tob主题1.0版本更新内容&#xff1a; 新增首页置…