【南方科技大学】CS315 Computer Security 【Lab6 IoT Security and Wireless Exploitation】

目录

  • Introduction (Part 1: OS Security for IoT )
  • Software Requirements
  • Starting the Lab 6 Virtual Machine
  • Setting up the Zephyr Development Environment
    • Download the Zephyr Source Code
    • Installing Requirements and Dependencies
    • Setting the Project’s Environment Variables
    • Installing the Zephyr Software Development Kit
  • Building and Running an Application with Zephyr
    • Sample Hello World Application
    • Building a Sample Application
    • Running a Sample Application
  • Exploiting Buffer Overflows in Zephyr Applications
    • Application Stack Frame on Zephyr
  • Assignments for Lab 6 Part 1
  • Introduction (Part 2: Wireless Exploitation & Defenses)
  • Software Requirements
  • Setup an Access Point
  • Capturing Wireless Packets via Wireshark
  • Capturing the Four-way Handshake
  • Cracking WPA2 WiFi Passphrase Using Kali Linux
  • Assignments for Lab 6 Part 2

Introduction (Part 1: OS Security for IoT )

物联网(IoT)是一项将影响我们日常生活的新兴技术。据报道,到2025年,连接的物联网设备将达到1000亿,因此物联网的影响将是令人印象深刻的,而安全性是其中的重要组成部分。出于本实验的目的,我们将重点关注物联网设备的操作系统安全性。

有许多新开发的物联网操作系统。例如,Contiki 是一个物联网开源操作系统。 Contiki 将微型低成本、低功耗微控制器连接到互联网。 2015 年 5 月,谷歌发布了 Brillo,一个物联网操作系统。 Brillo是Google推出的一款用于构建互联设备的解决方案,基于Android系统开发。 Zephyr 是另一个专为物联网设备设计的实时操作系统。 Zephyr开源项目由Linux基金会于2016年2月宣布。在本实验室中,我们使用Zehpyr作为研究示例来探索物联网设备的操作系统安全性。具体来说,我们将利用应用程序中的缓冲区溢出漏洞并了解 Zephyr OS 的安全功能。完成实验作业后,您将需要回答以下问题:

Zephyr 有哪些安全功能?

应用程序是否与操作系统内核共享相同的地址空间?

Zephyr 是否具有防御机制,例如不可执行堆栈或地址空间布局随机化(ASLR)?

教科书攻击(例如缓冲区溢出或堆喷射)对 Zephyr 有效吗?

Software Requirements

所有必需的文件都在提供的虚拟机映像中打包和配置。

The VMWare Software
http://apps.eng.wayne.edu/MPStudents/Dreamspark.aspx

The Ubuntu 14.04 Long Term Support (LTS) Version
http://www.ubuntu.com/download/desktop

Zephyr: Real Time OS for IoT – A Linux Foundation Collaborative Project https://www.zephyrproject.org/downloads

Starting the Lab 6 Virtual Machine

在本实验中,我们使用 Ubuntu 作为虚拟机映像。选择名为“Lab6”的虚拟机。
在这里插入图片描述
使用用户名 Student 和密码 [TBA in the class] 登录 Ubuntu 映像。以下是登录后的屏幕截图。
在这里插入图片描述

Setting up the Zephyr Development Environment

您可以从 Zephry 项目网站找到详细文档:

https://docs.zephyrproject.org/latest

Download the Zephyr Source Code

该代码托管在 Linux 基金会,其 Gerrit 后端支持通过 git 进行匿名克隆。

我们可以使用 git 命令查看 Zephyr 源代码。可以看到主目录下有zephyr-project文件夹。

https://www.zephyrproject.org/

请注意,如果您想在自己的机器上尝试,则需要安装 git。请注意,我们的实验室映像已在以下位置下载了 Zephyr 源代码:~/zephyr-project/

Installing Requirements and Dependencies

如果您使用自己的笔记本电脑或台式机进行实验,则需要通过执行以下命令来安装依赖项。在我们的 Ubuntu 映像上,我已经为您安装了它们。

$ sudo apt-get install git make gcc gcc-multilib g++ g+±multilib

Setting the Project’s Environment Variables

$ cd zephyr-project
$ source zephyr-env.sh
在这里插入图片描述

Installing the Zephyr Software Development Kit

Zephyr 的 SDK 包含在所有支持的架构上构建内核所需的所有必要工具和交叉编译器。此外,它还包括主机工具,例如自定义 QEMU 和用于构建主机工具的主机编译器(如果需要)。 SDK 支持以下架构:IA-32、ARM 和 ARC。

接下来,您需要按照以下步骤在 Ubuntu Linux VM 上安装 SDK。

Step 1. 从 zephyr 网站下载 SDK 自执行脚本。镜像已下载脚本;文件名为 zephyr-sdk-0.8.2-i686-setup.run。请参阅下面的屏幕截图。
在这里插入图片描述
Step 2. 运行安装脚本
$ chmod a+x zephyr-sdk-0.8.2-i686-setup.run
$ sudo ./zephyr-sdk-0.8.2-i686-setup.run

下面的截图显示了步骤1和2的执行情况。我们可以看到Zephyr SDK的默认目录安装在/opt/zephyr-sdk目录下。由于我之前已经在镜像中安装了 SDK,因此您会看到一条消息,询问您是否要删除现有目录 /opt/zephyr。只需选择yes。
在这里插入图片描述
Step 3 要使用 Zephyr SDK,请导出以下环境变量并使用安装 SDK 的目标位置。您只需将以下行添加到 ~/.bashrc 文件中即可。
$ vim ~/.bashrc
Add these two lines into the file
export ZEPHYR_GCC_VARIANT=zephyr
export ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk
$ source ~/.bashrc
下面的屏幕截图显示了步骤 3。
在这里插入图片描述

Building and Running an Application with Zephyr

您已成功设置 Zephyr 的开发环境。本节提供构建包含应用程序的 Zephyr 内核并运行它的所有步骤。我们使用 Hello World 示例应用程序作为示例。您还可以创建自己的应用程序并运行它。

Sample Hello World Application

首先,让我们看一下 Zephyr 的示例应用程序是什么样的。转到 Hello World 示例的源目录。
$ cd ~/zephyr-project/samples/hello_world/src
$ vim main.c
下面的屏幕截图显示了 Hello World 应用程序的源代码。
在这里插入图片描述

Building a Sample Application

要构建 Hello World 示例应用程序,您只需执行以下命令即可:
$ cd ~/zephyr-project/samples/hello_world/
$ make
在这里插入图片描述
上面的 make 屏幕截图将使用应用程序 Makefile 中定义的默认设置构建 hello_world 示例应用程序。您可以通过使用受支持的平台之一定义变量 BOARD 来针对不同的平台进行构建,例如:

$ make BOARD=arduino_101

下图为执行后的结果
在这里插入图片描述
下面的屏幕截图显示了 Zephyr 项目支持的主板,包括 Intel Galileo Gen1 和 Gen2。出于本实验的目的,我们将在 x86 QEMU 上测试该应用程序。您还可以输入:

$ make help

这将获取受支持的板和其他有用命令的完整列表。
在这里插入图片描述
微内核和超微内核的示例项目可在 ~/zephyrproject/samples 中找到,每个示例都具有微内核和超微内核特定的构建。应用程序构建成功后,可以在应用程序根目录下的outdir子目录中找到结果。构建系统生成的 ELF 二进制文件默认命名为 zephyr.elf。下面的屏幕截图显示了 outdir 目录中的文件列表。
在这里插入图片描述

Running a Sample Application

要对 hello world 应用程序进行快速测试,我们可以通过执行以下命令来使用 QEMU 和 x86 仿真板配置 (qemu_x86):

$ cd ~/zephyr-project/samples/hello_world
$ make BOARD=qemu_x86 qemu
在这里插入图片描述
上面的屏幕截图显示了使用 QEMU 执行 hello world 应用程序。

我们可以看到“Hello World!”在终端中打印出来。要退出 QEMU,我们可以输入

‘Ctrl+a, x’

在这里插入图片描述

Exploiting Buffer Overflows in Zephyr Applications

首先,让我们编写一个包含缓冲区溢出漏洞的 Zephyr 应用程序。将 hello world main.c 程序更改为以下代码,如屏幕截图所示。

$ gedit main.c

在这里插入图片描述
在这里插入图片描述
从源代码中我们可以看到overflow()函数中嵌入了一个缓冲区溢出漏洞。然后,我们将一个长字符串传递给overflow()函数,该字符串将覆盖堆栈上的返回地址,程序将因返回地址无效而崩溃。接下来,让我们编译该应用程序并运行它,看看会发生什么。

如前所述,要构建应用程序,您只需执行以下命令即可:

$ cd ~/zephyr-project/samples/hello_world
$ make

要使用 QEMU 和 x86 仿真板配置 (qemu_x86) 运行应用程序,请执行以下命令:

$ cd ~/zephyr-project/samples/hello_world
$ make BOARD=qemu_x86 qemu

正如我们所料,应用程序由于返回地址无效而崩溃。
在这里插入图片描述
此外,QEMU 也会崩溃,您将看到一个弹出窗口,如下图所示。
在这里插入图片描述
我们可以看到EIP寄存器的值为0x7420676e。为了在利用缓冲区溢出漏洞后执行一些有意义的事情,我们需要控制EIP寄存器。接下来,调整main.c中的输入字符串,将EIP寄存器更改为0x41414141。请注意,0x41 是字符“A”的 ASCII 值。

我们可以简单地编辑 main() 函数,如下图所示
在这里插入图片描述
要重新编译应用程序,您需要重新运行zephyr环境脚本zephyrevn.sh。

$ cd ~/zephyr-project
$ source ./zephyr-env.sh

然后您可以重新编译该应用程序并运行它。您将看到 EIP 寄存器将为 0x41414141,如下图所示。
在这里插入图片描述
在这里插入图片描述
要重新编译应用程序,您需要重新运行zephyr环境脚本zephyrevn.sh。
$ cd ~/zephyr-project
$ source ./zephyr-env.sh

Application Stack Frame on Zephyr

为了做更有意义的事情,例如在堆栈上执行 shell 代码,我们需要了解应用程序的堆栈框架。我们在实验 2 中完成了类似的任务。如前所述,对于每个 Zephyr 应用程序,编译二进制文件都存储在名为 outdir 的目录中。我们可以进入该目录并使用 objdump 工具反汇编应用程序二进制文件并了解其堆栈框架。

$ cd ~/zephyr-project/samples/hello_world/outdir/qemu_x86/src
$ objdump –d main.o

下面的屏幕截图显示了 main.o 二进制文件的反汇编结果。
在这里插入图片描述

Assignments for Lab 6 Part 1

1.阅读上面的实验室说明并完成所有任务。
2.回答引言部分中的问题,并证明你的答案。简单的是或否的回答不会获得任何学分。
2.1 Zephyr 有哪些安全功能?
2.2 应用程序与操作系统内核共享相同的地址空间吗?
2.3 Zephyr 是否有防御机制,例如不可执行堆栈或地址空间布局随机化 (ASLR)?
2.4 教科书攻击(例如缓冲区溢出或堆喷射)对 Zephyr 有效吗?
3. 将EIP寄存器更改为值0xdeadbeef,并显示应用程序崩溃时EIP值的屏幕截图。

Extra Credit (10pt): 在堆栈上执行 shell 代码。 shell 代码可以启动 shell 或打印 hello 字符串。

Introduction (Part 2: Wireless Exploitation & Defenses)

在本实验室中,学生将探索执行无线攻击并了解潜在防御的方法。将涵盖的攻击包括检查和修改无线卡参数、更改无线传输通道、洪泛攻击以及破解 WPA2 保护网络的密钥。

Software Requirements

所有必需的文件都在提供的虚拟机映像中打包和配置。

The VMWare Software
http://apps.eng.wayne.edu/MPStudents/Dreamspark.aspx

The Kali Linux, Penetration Testing Distribution
https://www.kali.org/downloads/

Wireshark: Network protocol analyzer
https://www.wireshark.org/#download

Aircrack- ng: a suite of tools to assess WiFi network security
http://aircrack-ng.en.softonic.com/

Setup an Access Point

在本实验中,我们使用 TP-LINK 无线 N300 家用路由器作为示例,但相同的概念或想法也适用于其他路由器。接下来,它解释了设置接入点的服务集标识符(SSID)和安全机制的基本步骤。如果您以前做过此操作,请跳过本节。下图是我们在教室使用的TP-LINK无线N300家庭路由器。
在这里插入图片描述
Step 1: 将笔记本电脑或台式机连接到路由器。

此步骤取决于路由器。某些路由器需要使用以太网电缆来物理连接路由器。其他一些路由器可能能够使用其服务集标识符 (SSID) 通过无线进行连接。对于我们在教室中使用的路由器,需要物理连接到路由器的 LAN 端口之一。 (注意:考虑这两种类型的路由器的安全影响。)

Step 2: 打开基于 Web 的设置页面

打开Web浏览器,在地址栏中输入登录IP或主机名,即可登录Web管理页面。通常,您可以从路由器的背面找到IP地址或主机名。我们的路由器的IP地址是192.168.1.1,主机名是http://www.tplinkwifi.net

Step 3: 输入用户名和密码登录

输入默认用户名和密码即可登录。对于我们的路由器,其默认用户名和密码是 admin 和 [Same-Password-As-Kali-Linux]。

下图是我们使用的路由器的登录页面。
在这里插入图片描述
Step 4. 配置SSID
在我们的路由器中,转到无线 -> 无线设置。您可以在此处重命名您的无线网络(即 SSID)。我们路由器的 SSID 是“Hack3r”
在这里插入图片描述
Step 5 配置密码和无线安全。
在我们的路由器中,转到无线 -> 无线安全。然后您可以配置路由器的安全性。在下面的截图中,我们将安全协议配置为WPA/WPA2,使用AES作为加密方式,密码为“password”。还可以使用其他安全协议,例如 WEP。
在这里插入图片描述

Capturing Wireless Packets via Wireshark

要捕获无线数据包,您的计算机上需要安装无线网卡。无线网络接口有两种:一种是内部网卡。大多数笔记本电脑都有一个内置网卡;另一种是外部网卡。下图为外部网络。这是 Alfa Network 的 Wi-Fi USB 适配器(1000mW 高功率无线 G 802.11g,带 5dBi 天线)。
在这里插入图片描述
一旦您拥有无线网卡,您就可以运行数据包嗅探工具来捕获数据包,就像我们在实验 1 中所做的那样。

Step 1 启动 Wireshark 程序。

为了嗅探数据包,您可能需要通过在终端中键入 $ sudowireshark 来授予 Wireshark root 权限。下面是我的 iMac 桌面上 Wireshark 界面的屏幕截图。

在这里插入图片描述
Step 2 选择WiFi接口

单击 Wireshark 程序中的“捕获”->“选项”。寻找 WiFi 接口。通常,接口名称为 wlan0,但根据您的配置,它可能是不同的名称。例如,我的 iMac 上的 WiFi 接口名称是“WiFi:en1”。

Step 3 启用监控模式或混杂模式

在监控模式下,它捕获其距离范围内所有 SSID 的所有数据包。请注意,监控模式与混杂模式不同。为了本实验的目的,我们需要捕获所有流量,以便我们需要启用监视模式或混杂模式。

下面的屏幕截图显示了我的 iMac 上的 Wireshark 程序在监视器模式下的捕获接口的配置。您需要启用监控模式并将链路层头配置为802.11。
在这里插入图片描述
下面的屏幕截图显示了我的 iMac 上的 Wireshark 程序中混杂的捕获接口的配置。您需要启用混杂模式并将链路层头配置为每数据包信息。
在这里插入图片描述
Step 4 开始捕捉
单击捕获接口窗口中的开始并开始捕获。下面的屏幕截图显示了 Wireshark 程序在监视模式下捕获时的界面。
在这里插入图片描述

Capturing the Four-way Handshake

要破解 WPA/WPA2 密码,我们首先需要捕获包含以下内容的四次握手:

Step 1 开始捕获所有流量

这就是我们在上一步中所做的。只需将 Wireshark 程序进入监控模式并运行

Step 2 使用其密码连接到接入点

使用您的手机或笔记本电脑连接到接入点。出于本实验的目的,我们教室中的路由器的 SSID 是“Hack3r”。

Step 3 停止Wireshark程序并识别四次握手

按停止按钮停止Wireshark中的捕获;在过滤器中输入关键字“EAPOL”来识别四次握手。下面的屏幕截图显示了示例。

在这里插入图片描述
Step 4 保存捕获的流量

单击文件 -> 另存为选项将捕获的流量保存到 pcap 文件。下面的屏幕截图显示了示例。保存的pcap文件名为:test.pcap

在这里插入图片描述

Cracking WPA2 WiFi Passphrase Using Kali Linux

在本实验中,我们使用 Kali Linux 来破解 WPA2 WiFi 密码。选择名为“Lab7”的虚拟机映像。

在这里插入图片描述
使用用户名 root 和密码 [TBA in the class] 登录 Kali 镜像。以下是登录后的屏幕截图。

在这里插入图片描述
Step 1 将 test.pcap 文件复制到 Kali Linux 中

在我们的 Kali Linux 映像中,有 test-instructor-monitor.pcap 和 testinstructor-promiscously 文件的副本。如果您没有 test.pcap 的副本,也可以使用这些文件。

Step 2 使用aircrack-ng破解密码

Aircrack-ng 是一个网络软件套件,由用于 802.11 无线 LAN 的检测器、数据包嗅探器、WEP 和 WPA/WPA2-PSK 破解器以及分析工具组成。 Kali Linux 已默认安装它。

您可以输入 $ man aircrack-ng 查看该工具的手册页

在这里插入图片描述
运行以下命令来破解密码

$ aircrack-ng -w /usr/share/wordlists/fern-wifi/common.txt ~/Desktop/test-instructormonitor.pcap

-w: specify the path to the wordlist

接下来是 pcap 文件。下面的屏幕截图显示了命令的执行情况。
在这里插入图片描述
然后,我们为 WPA2 握手选择索引。我们可以通过SSID来识别索引。从截图中我们可以看到“Hack3r”的索引为5。

输入5后,我们可以看到aircrack已经成功破解密码,如下图所示。

在这里插入图片描述
下面是破解monitor模式捕获的pcap文件的截图。
在这里插入图片描述
选择1作为目标网络接口后,如下图所示,密码已被破解。
在这里插入图片描述

Assignments for Lab 6 Part 2

1.阅读上面的实验室说明并完成所有任务。
2.回答引言部分中的问题,并证明你的答案。简单的是或否的回答不会获得任何学分。
2.1 监控模式和混杂模式有什么区别
2.2 我们从本实验中学到了有关设置 WiFi 密码的哪些经验教训?
3. 将路由器更改为不同的密码,然后使用 Wireshark 和 Aircrach-ng 破解密码。显示结果的屏幕截图。

Extra Credit (3pt): 发送广播解除身份验证数据包以强制客户端重新连接。然后您就可以捕获四次握手。

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

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

相关文章

《a16z : 2024 年加密货币现状报告》解析

加密社 原文链接:State of Crypto 2024 - a16z crypto译者:AI翻译官,校对:翻译小组 当我们两年前第一次发布年度加密状态报告的时候,情况跟现在很不一样。那时候,加密货币还没成为政策制定者关心的大事。 比…

Ubuntu 安装 npm

1. 升级apt sudo apt-get update 2. 安装nodejs sudo apt install nodejs 3. 安装npm sudo apt-get install npm 4. 查看版本 node -v npm -v 完成安装!

记一次AWS服务器扩容

1、首先通过下列命令列出设备详情,可以看到红色框起来的部分有160G,需要把新增的20G扩容到根目录(139.9)上 lsblk查看文件系统 df -h2.执行sudo growpart /dev/xvda 1即可把20G的空间扩容到根目录上 扩容成功 但是可以看到并未生效 3.列出文件系统格…

ue5实现数字滚动增长

方法1 https://www.bilibili.com/video/BV1h14y197D1/?spm_id_from333.999.0.0 b站教程 重写loop节点 方法二 写在eventtick里

NVR小程序接入平台/设备EasyNVR多品牌NVR管理工具/设备的多维拓展与灵活应用

在数字化安防时代,NVR批量管理软件/平台EasyNVR作为一种先进的视频监控系统设备,正逐步成为各个领域监控解决方案的首选。NVR批量管理软件/平台EasyNVR作为一款基于端-边-云一体化架构的国标视频融合云平台,凭借其部署简单轻量、功能多样、兼…

什么是DICOM文件?——认识DICOM:医学影像与信息管理的标准化利器

目录 引言 什么是DICOM? DICOM的组成 DICOM的功能 DICOM的应用 DICOM的种类 DICOM的生成过程 DICOM的发展 总结 引言 在现代医学中,影像处理和管理是不可或缺的一环。从MRI、CT、X射线到超声波,医学影像为诊断和治疗提供了丰富的信息…

iOS 本地存储地址(位置)

前言: UserDefaults 存在沙盒的 Library --> Preferences--> .plist文件 CoreData 存在沙盒的 Library --> Application Support--> xx.sqlite 一个小型数据库里 (注:Application Support 这个文件夹已开始是没有的,只有当你写了存储代码,运行之后,目录里才会出…

django个人博客管理系统-计算机毕业设计源码27633

目 录 1 绪论 1.1 研究背景和意义 1.2国内外研究现状 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 系统流程…

任务看板是什么?如何选择合适的任务看板工具?

一、任务看板是什么? 任务看板是一种可视化的项目管理工具,它通常以板状的形式呈现,将任务以卡片的形式展示在不同的列中,每一列代表任务的不同状态。例如,待办事项、进行中、已完成等。任务看板能够帮助团队成员清晰…

使用 Flask 实现简单的登录注册功能

目录 1. 引言 2. 环境准备 3. 数据库设置 4. Flask 应用基本配置 5. 实现用户注册 6. 实现用户登录 7. 路由配置 8. 创建前端页面 9. 结论 1. 引言 在这篇文章中,我们将使用 Flask 框架创建一个简单的登录和注册系统。Flask 是一个轻量级的 Python Web 框架…

合合信息亮相2024中国模式识别与计算机视觉大会,用AI构建图像内容安全防线

近日,第七届中国模式识别与计算机视觉大会(简称“PRCV 2024”)在乌鲁木齐举办。大会由中国自动化学会(CAA)、中国图象图形学学会(CSIG)、中国人工智能学会(CAAI)和中国计…

pytorh学习笔记——cifar10(六)MobileNet V1网络结构

基础知识储备: 一、深度可分离卷积(Depthwise Separable Convolution) MobileNet的核心是深度可分离卷积(Depthwise Separable Convolution),深度可分离卷积是卷积神经网络(CNN&#xf…

IDM下载器 (Internet Download Manager) v6.42.2 中文免激活绿色版

Internet Download Manager (IDM下载器) 是一款先进的下载工具,可以提升您的下载速度高达5倍,支持续传,IDM可以让用户自动下载某些类型的文件,它可将文件划分为多个下载点以更快速度下载,并列出最近的下载,方便访问文件。相对于其…

Web刷题日记1---清风

[GDOUCTF 2023]EZ WEB 题目网站在NSSCTF 这个题目有一个新的知识点,对于我来说比较的少见吧,第一次遇见。em...是什么呢?后面再说 进入靶场,比较突兀,点了这个button后,提示flag在附近 查看源码,有提示…

C#从零开始学习(用户界面)(unity Lab4)

这是书本中第四个unity Lab 在这次实验中,将学习如何搭建一个开始界面 分数系统 点击球,会增加分数 public void ClickOnBall(){Score;}在OneBallBehaviour类添加下列方法 void OnMouseDown(){GameController controller Camera.main.GetComponent<GameController>();…

【踩坑随笔】Mask_RCNN基于服务器环境跑通Demo成功版

踩过的坑一个接一个&#xff0c;最后放弃在window环境下去尝试了&#xff0c;看到的大多有效的教程也都是ubuntu系统下的&#xff0c;鉴于我的电脑空间不够造了而且安双系统操作不当可能会导致本来的系统崩溃&#xff0c;所以干脆直接服务器租卡了&#xff0c;本文的环境亲测成…

10分钟使用Strapi(无头CMS)生成基于Node.js的API接口,告别繁琐开发,保姆级教程,持续更新中。

一、什么是Strapi&#xff1f; Strapi 是一个开源的无头&#xff08;headless&#xff09; CMS&#xff0c;开发者可以自由选择他们喜欢的开发工具和框架&#xff0c;内容编辑人员使用自有的应用程序来管理和分发他们的内容。得益于插件系统&#xff0c;Strapi 是一个灵活的 C…

【数据结构和算法】三、动态规划原理讲解与实战演练

目录 1、什么是动态规划&#xff1f; 2、动态规划实战演练 2.1 力扣题之爬楼梯问题 &#xff08;1&#xff09;解题思路1: &#xff08;2&#xff09;解题思路2: &#xff08;3&#xff09;动态规划&#xff08;DP&#xff09;&#xff1a;解题思路 &#xff08;4&#x…

【R + Python】iNaturalist 网站图片下载 inat api

文章目录 一、iNaturalist 简介二、R语言API&#xff1a;rinat三、示例3.1 获取观测数据3.2 绘制可视化图像函数用法 3.4 在区域网格中搜索3.5 下载图片3.51 提取图片 url3.52 下载图片: R语言3.53 下载图片: python 四、获取详细rinat包的文档 一、iNaturalist 简介 &#x1…

毕业设计选题:基于Python的招聘信息爬取和可视化平台

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 采集的数据列表 招聘数据大屏 摘要 本系统通过对网络爬虫的分析&#xff0c;研究智…