有趣的Hack-A-Sat黑掉卫星挑战赛——卫星平台内存dump
国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加,太空已经成为国家赖以生存与发展的命脉之一,凝聚着巨大的国家利益,太空安全的重要性日益凸显[1]。而在信息化时代,太空安全与信息安全紧密地结合在一起。
2020年9月4日,美国白宫发布了首份针对太空网络空间安全的指令——《航天政策第5号令》,其为美国首个关于卫星和相关系统网络安全的综合性政策,标志着美国对太空网络安全的重视程度达到新的高度。在此背景下,美国自2020年起,连续两年举办太空信息安全大赛“黑掉卫星(Hack-A-Sat)”,在《Hack-A-Sat太空信息安全挑战赛深度解析》一书中有详细介绍,本文介绍了Hack-A-Sat黑掉卫星挑战赛的利用维护接口dump内存(patch)这道赛题的解题过程。
题目介绍
We have an encrypted telemetry link from one of our satellites but we seem to have lost the encryption key. Thankfully we can still send unencrypted commands using our Cosmos interface (included). I've also included the last version of `kit_to.so` that was updated to the satellite. Can you help us restore communication with the satellite so we can see what error "flag" is being transmitted?
主办方告诉参赛者,这里有一条某颗卫星的加密遥测链路,但似乎丢失了加密密钥。幸运的是,仍然可以使用COSMOS接口发送未加密的命令。主办方还提供了该卫星使用的一个共享库文件kit_to.so,要求参赛者恢复与卫星的通信,以便可以看到正在传输什么错误的“flag”。
从题目描述中可以获取如下信息:
(1)与COSMOS有关,在下文会有这个系统的基本介绍。
(2)题目提供了两个文件,一个为kit_to.so,另一个为cosmos.tar.gz。
主办方给出了一个链接地址,使用netcat连接到题目给的链接后,会回显如下信息,从中可以发现本题目与cFS也有关,在下文也会有cFS系统的基本介绍。
Starting up CFS UDP Forwarding Service on tcp:172.17.0.1:19021
Booting...
Checking File System...
File System Check: Pass
CFE_PSP: Clearing out CFE CDS Shared memory segment.
CFE_PSP: Clearing out CFE Reset Shared memory segment.
CFE_PSP: Clearing out CFE User Reserved Shared memory segment.
2032-010-14:25:02.11734 POWER ON RESET due to Power Cycle (Power Cycle).
2032-010-14:25:02.11737 ES Startup: CFE_ES_Main in EARLY_INIT state
CFE_PSP: CFE_PSP_AttachExceptions Called
2032-010-14:25:02.11740 ES Startup: CFE_ES_Main entering CORE_STARTUP state
2032-010-14:25:02.11741 ES Startup: Starting Object Creation calls.
2032-010-14:25:02.11741 ES Startup: Calling CFE_ES_CDSEarlyInit
2032-010-14:25:02.11756 ES Startup: Calling CFE_EVS_EarlyInit
2032-010-14:25:02.11760 Event Log cleared following power-on reset
2032-010-14:25:02.11762 ES Startup: Calling CFE_SB_EarlyInit
2032-010-14:25:02.11779 SB internal message format: CCSDS Space Packet Protocol version 1
2032-010-14:25:02.11783 ES Startup: Calling CFE_TIME_EarlyInit
1980-012-14:03:20.00000 ES Startup: Calling CFE_TBL_EarlyInit
1980-012-14:03:20.00026 ES Startup: Calling CFE_FS_EarlyInit
1980-012-14:03:20.00042 ES Startup: Core App: CFE_EVS created. App ID: 0
EVS Port1 42/1/CFE_EVS 1: cFE EVS Initialized. cFE Version 6.7.1.0
EVS Port1 42/1/CFE_EVS 14: No subscribers for MsgId 0x808,sender CFE_EVS
1980-012-14:03:20.05079 ES Startup: Core App: CFE_SB created. App ID: 1
1980-012-14:03:20.05088 SB:Registered 4 events for filtering
EVS Port1 42/1/CFE_SB 1: cFE SB Initialized
EVS Port1 42/1/CFE_SB 14: No subscribers for MsgId 0x808,sender CFE_SB
1980-012-14:03:20.10107 ES Startup: Core App: CFE_ES created. App ID: 2
EVS Port1 42/1/CFE_ES 1: cFE ES Initialized
EVS Port1 42/1/CFE_SB 14: No subscribers for MsgId 0x808,sender CFE_ES
EVS Port1 42/1/CFE_ES 2: Versions:cFE 6.7.1.0, OSAL 5.0.1.0, PSP 1.4.0.0, chksm 918
EVS Port1 42/1/CFE_SB 14: No subscribers for MsgId 0x808,sender CFE_ES
EVS Port1 42/1/CFE_ES 91: Mission osk
EVS Port1 42/1/CFE_SB 14: No subscribers for MsgId 0x808,sender CFE_ES
EVS Port1 42/1/CFE_ES 92: Build 202201101424 root@425afb42bfc8
1980-012-14:03:20.15132 ES Startup: Core App: CFE_TIME created. App ID: 3
EVS Port1 42/1/CFE_TIME 1: cFE TIME Initialized
1980-012-14:03:20.20161 ES Startup: Core App: CFE_TBL created. App ID: 4
EVS Port1 42/1/CFE_TBL 1: cFE TBL Initialized. cFE Version 6.7.1.0
1980-012-14:03:20.25172 ES Startup: Finished ES CreateObject table entries.
1980-012-14:03:20.25177 ES Startup: CFE_ES_Main entering CORE_READY state
1980-012-14:03:20.25182 ES Startup: Opened ES App Startup file: /cf/cfe_es_startup.scr
1980-012-14:03:20.25230 ES Startup: Loading shared library: /cf/cfs_lib.so
CFS Lib Initialized. Version 2.2.0.01980-012-14:03:20.25299 ES Startup: Loading shared library: /cf/osk_app_lib.so
1980-012-14:03:20.25427 ES Startup: Loading shared library: /cf/expat_lib.so
EXPAT Library 2.1.0 Loaded
1980-012-14:03:20.25497 ES Startup: Loading file: /cf/kit_to.so, APP: KIT_TO
1980-012-14:03:20.25531 ES Startup: KIT_TO loaded and created
1980-012-14:03:20.25601 ES Startup: Loading file: /cf/kit_ci.so, APP: KIT_CI
1980-012-14:03:20.25627 ES Startup: KIT_CI loaded and created
EVS Port1 42/1/KIT_CI 100: KIT_CI Initialized. Version 1.0.0.0
1980-012-14:03:20.25684 ES Startup: Loading file: /cf/kit_sch.so, APP: KIT_SCH
1980-012-14:03:20.25720 ES Startup: KIT_SCH loaded and created
1980-012-14:03:20.25945 ES Startup: Loading file: /cf/mm.so, APP: MM
1980-012-14:03:20.25965 ES Startup: MM loaded and created
EVS Port1 42/1/MM 1: MM Initialized. Version 2.4.1.0
EVS Port1 42/1/KIT_SCH 15: Sucessfully Replaced table 0 using file /cf/kit_sch_msg_tbl.json
EVS Port1 42/1/KIT_TO 135: Removed 0 table packet entries
EVS Port1 42/1/KIT_TO 122: Loaded new table with 62 packets
EVS Port1 42/1/KIT_TO 15: Sucessfully Replaced table 0 using file /cf/kit_to_pkt_tbl.json
EVS Port1 42/1/KIT_TO 100: KIT_TO Initialized. Version 1.0.0.0
EVS Port1 42/1/KIT_SCH 15: Sucessfully Replaced table 1 using file /cf/kit_sch_sch_tbl.json
EVS Port1 42/1/KIT_SCH 101: KIT_SCH Initialized. Version 1.0.0.0
1980-012-14:03:20.30978 ES Startup: CFE_ES_Main entering APPS_INIT state
1980-012-14:03:20.30982 ES Startup: CFE_ES_Main entering OPERATIONAL state
EVS Port1 42/1/CFE_TIME 21: Stop FLYWHEEL
EVS Port1 42/1/KIT_SCH 136: Multiple slots processed: slot = 0, count = 2
EVS Port1 42/1/KIT_SCH 136: Multiple slots processed: slot = 1, count = 2
EVS Port1 42/1/KIT_SCH 136: Multiple slots processed: slot = 1, count = 2
EVS Port1 42/1/KIT_SCH 137: Slots skipped: slot = 2, count = 3
EVS Port1 42/1/KIT_SCH 136: Multiple slots processed: slot = 1, count = 2
EVS Port1 42/1/KIT_SCH 134: Major Frame Sync too noisy (Slot 1). Disabling synchronization.
编译及测试
为了检验下载的源代码是否正确,可以先编译、测试一下。进入HAS2020的patch目录下,运行下面的命令构建Docker镜像。
sudo make build
使用如下命令进行测试,测试结果如图3-12所示。从图3-12中可以发现正确地获取到了flag值。
sudo make test
图3-12 patch测试结果
相关背景知识
1.cFS
cFS(core Flight Software),是NASA公布的一个独立于平台和项目的可重用软件框架,cFS适用于NASA很多飞行项目和嵌入式软件系统的重用,可以节约成本。它主要包括如下四部分组件。
- core Flight Executive(cFE):核心飞行执行环境。
- Operating System Abstraction Layer(OSAL):操作系统抽象层。
- Platform Support Package(PSP):平台支持组件。
- cFS Applications:cFS应用程序
其中,cFE是核心,它不仅提供了1个可移植的飞行软件执行环境,还提供了6个核心服务,如图3-13所示。
图3-13 cFE提供的6个核心服务
- Executive Service(ES):执行服务,用于管理软件系统,并创建一个应用程序应用环境。
- Software Bus Service(SB):软总线服务,提供一个应用程序发布、订阅消息服务。
- Event Service(EVS):事件服务,用于发送、过滤、记录事件消息。
- Table Service(TBL):表服务,管理应用程序配置相关的表。
- File Service(FS):文件服务。
- Time Service(TIME):时间服务。
cFS的常见应用如表3-4所示。
表3-4 cFS的常见应用
应用名称(缩写) | 功 能 |
CFDP(CF) | 从/向地面站接收/发送文件 |
CheckSum(CS) | 对内存、表和文件进行数据完整性校验 |
Command Ingest Lab(CI) | 通过UDP/IP端口接收CCSDS 遥测指令包 |
Telemetry Output Lab(TO) | 发送CCSDS遥测帧 |
续表
应用名称(缩写) | 功 能 |
Data Storage(DS) | 为下行链路记录板载的星务、工程和科学数据 |
File Manager(FM) | 为地面站提供文件管理界面 |
HouseKeeping(HK) | 从其它应用程序收集和重新打包遥测数据 |
Health and Safety(HS) | 确保关键任务、后台服务等正常,检测CPU占用和计算CPU利用率 |
Limit Checker(LC) | 对阈值进行监测,在超出阈值时采取行动 |
Memory Dwell(MD) | 允许地面遥测远程内存位置的内容,主要用于调试 |
Memory Manager(MM) | 提供内存管理和dump的能力 |
Software Bus(SB) | 通过各种“插件”形式的网络协议传递软件总线消息 |
Scheduler(SCH) | 对板载活动进行调度 |
Stored Command(SC) | 板载指令序列 |
2.COSMOS
COSMOS是Ball Aerospace公司开发的一套指令和控制系统(又称C2系统),于2006年开始研发,2014年12月开源。COSMOS可用于控制嵌入式系统,这些系统可以是任何东西,从测试设备(电源、示波器、开关电源板、UPS设备等)到开发板(Arduinos、Raspberry Pi、Beaglebone等),再到卫星。
目前,COSMOS的最新版为V5版,其为B/S架构,依赖的软件包较多,安装部署较为复杂。本挑战题的解答使用经典的V4版即可。COSMOS V4架构如图3-14所示。
图3-14 COSMOSV4架构
图3-14中,测控指令服务端处于中心位置,COSMOS首先使用它通过不同的网络协议(TCP/IP、串行、UDP或自定义协议)连接到各类测控目标,然后通过实时指令和脚本工具部分发送测控指令,将从各类目标接收到的遥测数据送到实时遥测可视化工具部分进行显示,方便指挥决策。同时实时指令和脚本工具、实时遥测可视化工具支持通过配置文件与辅助工具、离线分析工具进行数据交互,方便运维管理和离线分析。图3-14中六边形框住的功能同时被OpenSatKit发行版使用。
3.OpenSatKit
经分析发现,HAS2020主办方提供的COSMOS是OpenSatKit 2.1套件中的一部分,没有必要单独安装COSMOS,使用OpenSatKit中的COSMOS即可。
OpenSatKit是为了降低cFS的学习、使用、开发门槛而集成的一个套件,该套件整合了3个工具——COSMOS、cFS、NASA的名为42的模拟器,可以说OpenSatKit是cFS的一个发行版,OpenSatKit包含的组件如图3-15所示。
图3-15 OpenSatKit包含的组件
题目解析
本题目提供了两个文件,一个为kit_to.so,另一个为cosmos.tar.gz(解压后为完整的COSMOS目录)。下面分析3.2.1节的回显信息。
首行的Starting up CFS UDP Forwarding Service on tcp:172.17.0.1:19021表明卫星端运行的软件系统为cFS。本行还表明了 CFS UDP Forwarding Service 在TCP的19021端口监听,其中172.17.0.1是Docker容器内部IP地址,需要根据实际情况修改为外部可访问的IP地址。
确定IP地址和端口后,根据 COSMOS 的使用手册,修改题目提供的COSMOS 目录下的 config/tools/cmd_tlm_server/cmd_tlm_server.txt文件,将下文中的IP地址和两个端口(一个读端口54321、一个写端口54321)修改为上一步确定的IP地址和端口。
INTERFACE LOCAL_CFS_INT tcpip_client_interface.rb 127.0.0.1 54321 54321 10 nil
由于笔者在本地就行测试,IP地址保留为127.0.0.1不变。修改后的内容为:
INTERFACE LOCAL_CFS_INT tcpip_client_interface.rb 127.0.0.1 19021 19021 10 nil
正常启动软件后,单击Command and Telemetry Server按钮,弹出如图3-16所示的窗口,单击OK,弹出如图3-17所示的Command and Telemetry Server窗口。
图3-16 Command and Telemetry Server Options窗口
图3-17 cFS Command and Telemetry Server窗口
若COSMOS正常连接到题目的challenge容器,图3-17中的两个Interface的连接状态Connected?应显示为true。
继续分析challenge的回显内容:
1980-012-14:03:20.25282 ES Startup: Loading file: /cf/kit_to.so, APP: KIT_TO
1980-012-14:03:20.25290 ES Startup: KIT_TO loaded and created
根据这两行的内容,结合cFS和COSMOS的相关知识,结合图3-15,推断这里的KIT_TO是cFS中的一个应用程序,在COSMOS中就是Targets界面中的KIT_TO。
下面对主办方提供的文件kit_to.so进行分析。这里使用Ghidra这个软件逆向工具对kit_to.so进行分析。用Ghidra打开kit_to.so后,发现kit_to.so包含了符号信息、调试信息,极大降低了逆向分析的难度。
由于题目要求找到传输的flag信息,最快捷的方法就是寻找与flag相关的符号信息,符号信息中明显存在一个相关项KIT_TO_SendFlagPkt,双击该项,跳转到其对应的位置,如图3-18所示。
图3-18 kit_to.so中的KIT_TO_SendFlagPkt
Ghidra自动对其进行了反编译,得到如下的代码:
void KIT_TO_SendFlagPkt(void)
{
char *flag;
flag = getenv("FLAG");
if (flag == (char *)0x0) {
flag = {defaultdefaultdefaultdefaultdefaultdefa ultdefaultdefaultdefaultdefaultdefaultdefa ultdefaultdefaultdefaultdefaultdefaultdefa ultdefaultdefaultdefaultdefaultdefault}";
}
memset(KitToFlagPkt.Flag,0,200);
strncpy(KitToFlagPkt.Flag,flag,200);
CFE_SB_TimeStampMsg(&KitToFlagPkt);
CFE_SB_SendMsg(&KitToFlagPkt);
return;
}
该段代码浅显易懂,函数KIT_TO_SendFlagPkt从环境变量中获取flag,若从环境变量中无法获取flag,则使用缺省的flag。这里为flag申请了200字节的内存空间。
在发送信息前,该函数通过strncpy(KitToFlagPkt.Flag, flag, 200)将flag存储在了KitToFlagPkt.Flag代表的某个地址上。找到这个具体的地址,对该地址后面的200字节进行内存转储就能够得到flag。
在题目的回显信息中有如下两行:
1980-012-14:03:20.25372 ES Startup: Loading file: /cf/mm.so, APP: MM
1980-012-14:03:20.25380 ES Startup: MM loaded and created
结合cFs的知识及表3-4可知,MM表示内存管理程序,其有个PEEK_MEM命令可以直接打印指定地址开始的内存内容。
打开COSMOS的Command Sender窗口,看看PEEK_MEM命令需要哪些参数,如图3-19所示。
图3-19 PEEK_MEM命令参数界面
前5行是CCSDS固定字段,不需要修改。剩下的参数有:
- DATA_SIZE:每次读取的比特数,可设置为8、16或32,这里每次打印单个字符,设置为8。若设置为16或32,会报内存未对齐的错误。
- MEM_TYPE:指定要读取的存储类型,这里为内存RAM,设置为1。
- PAD_16:用于结构填充,这里设置为0
- ADDR_OFFSET:相对符号地址的偏移量,若未设置符号地址,则为绝对地址。
- ADDR_SYMBOL_NAME:符号基址,设置为KitToFlagPkt。
5个参数中,只有ADDR_OFFSET待定,下面就来确定KitToFlagPkt.Flag相对KitToFlagPkt的偏移量。
在Ghidra的数据结构窗口中寻找相关数据结构,在kit_to_app.h下可找到数据结构KIT_TO_FlagPkt,双击打开,如图3-20所示。
图3-20 KIT_TO_FlagPkt数据结构图
由图3-20可知,Flag的偏移量为12字节。
打开COSMOS的Script Runner,编写如下的ruby脚本:
12.upto(212) { |off|
offset = off
cmd("MM PEEK_MEM with CCSDS_STREAMID 6280, CCSDS_SEQUENCE 49152, CCSDS_LENGTH 73, CCSDS_FUNCCODE 2, CCSDS_CHECKSUM 0, DATA_SIZE 32, MEM_TYPE 1, PAD_16 0, ADDR_OFFSET #{offset}, ADDR_SYMBOL_NAME 'KitToFlagPkt'")
}
脚本首行的12为flag在数据结构KIT_TO_FlagPkt中的偏移量,212=12+200,“upto”为ruby中的迭代语法。cmd中的各个参数值来自COSMOS的Command Sender窗口中的PEEK_MEM命令参数。
执行该脚本,终端将显示如下内容:
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C8C Size = 8 bits Data = 0x66
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C8D Size = 8 bits Data = 0x6C
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C8E Size = 8 bits Data = 0x61
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C8F Size = 8 bits Data = 0x67
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C90 Size = 8 bits Data = 0x7B
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C91 Size = 8 bits Data = 0x7A
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C92 Size = 8 bits Data = 0x75
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C93 Size = 8 bits Data = 0x6C
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C94 Size = 8 bits Data = 0x75
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C95 Size = 8 bits Data = 0x34
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C96 Size = 8 bits Data = 0x39
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C97 Size = 8 bits Data = 0x32
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C98 Size = 8 bits Data = 0x32
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C99 Size = 8 bits Data = 0x35
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C9A Size = 8 bits Data = 0x64
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C9B Size = 8 bits Data = 0x65
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C9C Size = 8 bits Data = 0x6C
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C9D Size = 8 bits Data = 0x74
EVS Port1 42/1/MM 7: Peek Command: Addr = 0xF3050C9E Size = 8 bits Data = 0x61
……(省略的内容)
将每行最后的十六进制数转换成字符,就得到了flag。
flag{zulu49225delta:GG1EnNVMK3-hPvlNKAdEJxcujvp9WK4rEchuEdlDp3yv_Wh_uvB5ehGq-fyRowvwkWpdAMTKbidqhK4JhFsaz1k}
相关文章:
有趣的Hack-A-Sat黑掉卫星挑战赛——卫星平台内存dump
国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加,太空已经成为国家赖以生存与发展的命脉之一,凝聚着巨大的国家利益,太空安全的重要性日益凸显[1]。而在信息化时代,太空安…...
OAK相机如何将yoloV8模型转换成blob格式?
编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 ▌前言 Hello,大家好,这里是OAK中国,我是助手…...
Python解题 - CSDN周赛第32期 - 运输石油(三维背包)
上期周赛因为最后一题出现bug,再加上都是经典的模板题,问哥就懒得写题解了。 本期也是有两道考过的题目,不过最后一题因为考到了背包问题的特殊类型,还是值得拿出来记个笔记。 第一题:传奇霸业 传奇霸业,是…...
JVM - G1垃圾收集器深入剖析
1、G1收集器概述 HotSpot团队一直努力朝着高效收集、减少停顿(STW: Stop The World)的方向努力,也贡献了从串行Serial收集器、到并行收集器Parallerl收集器,再到CMS并发收集器,乃至如今的G1在内的一系列优秀的垃圾收集器。 G…...
角度制与弧度制的相互转换np.deg2radnp.rad2deg
【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】角度制与弧度制的相互转换np.deg2radnp.rad2deg选择题以下关于python代码表述错误的一项是?import numpy as npprint("【执行】np.rad2deg(np.pi)")print(np.rad2deg(np.pi))print(&…...
【SAP Abap】X-DOC:SAP ABAP 语法更新之一(Open SQL新增特性)
SAP ABAP 语法更新之一(Open SQL新增特性)1、前言2、演示1、前言 自从 SAP 推出 SAP ON HANA,与之相随的 AS ABAP NW 7.40 版本以后,ABAP 语法也有了较多的更新,本篇对 Open Sql的语法更新部分做一个DEMO演示。 NW 7…...
【改进灰狼优化算法】改进收敛因子和比例权重的灰狼优化算法【期刊论文完美复现】(Matlab代码实现)
👨🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…...
Linux C代码获取线程ID
Linux C代码获取线程ID gettid可以获取线程id,但是通过man gettid可以看到下面这两句 也就是说glibc没有为这个gettid封装系统调用,需要使用syscall。 #define _GNU_SOURCE#include <unistd.h>#include <sys/syscall.h>#include <sys/types.h>pi…...
基本密码技术
AESAES取代DES,是一种对称加密技术,分为AES-128/192/256, 其分组长度固定为128b,若最后一个分组长度不够,需要补全至128b长度。所支持的秘钥长度分别为128b/192b/256b.分组密码模式AES是对明文进行分组之后逐块进行加密࿰…...
【力扣周赛#334】6369. 左右元素和的差值 + 6368. 找出字符串的可整除数组 + 6367. 求出最多标记下标
目录 6369. 左右元素和的差值 - 前缀后缀和 ac 6368. 找出字符串的可整除数组 - 操作余数ac 6367. 求出最多标记下标 - 二分答案 贪心 6369. 左右元素和的差值 - 前缀后缀和 ac class Solution {public int[] leftRigthDifference(int[] nums) {int nnums.length;int[] re…...
行测-判断推理-图形推理-位置规律-平移
位置平移,选D空白每次顺时针移动一格,黑色圆每次逆时针移动2格选C两个黑色⚪,每次顺时针移动2格白色⚪,先到对角位置,再顺时针移动一格选B三角形的底,顺时针移动三角形的顶点,在正方形的内部顺时…...
数据库基础知识(一)
目录 什么是数据库 表,列,行 主键 什么是SQL 什么是数据库 数据库(database):保存有组织的数据的容器(通常是一个文件或一组文件)。 数据库软件(DMBS):又名数据库管理系统。数据库是通过数据库软件创建和操纵的容器。因为你并…...
MyBatis 的工作原理解析
文章目录前言一、mybatis工作原理1.1 流程图1.2 步骤解析1.3 代码实现前言 本文记录 Mybatis 的工作原理,做到知识梳理总结的作用。 一、mybatis工作原理 Mybatis 的总体工作原理流程图如下图所示 1.1 流程图 1.2 步骤解析 Mybatis 框架在工作时大致经过8个步骤…...
终端软件架构说
目录 零:前言 一,基于服务的架构 二,基于多进程多线程的架构 三,以数据为中心的架构 四,类Android的分层架构设计 五,总结 零:前言 谈到架构,可能大家的第一感觉是信息系统的…...
LearnOpenGL-入门-你好,三角形
本人刚学OpenGL不久且自学,文中定有代码、术语等错误,欢迎指正 我写的项目地址:https://github.com/liujianjie/LearnOpenGLProject LearnOpenGL中文官网:https://learnopengl-cn.github.io/ 文章目录图形渲染管线基本介绍着色器…...
SOEM 源码解析 ecx_init_redundant
/* Initialise lib in redundant NIC mode* 在冗余网卡模式下初始化lib库* param[in] context context struct* 上下文结构体* param[in] redport pointer to redport, redundant port data* 指向冗余端口的指针ÿ…...
网页唤起 APP中Activity的实现原理
疑问的开端大家有没有想过一个问题:在浏览器里打开某个网页,网页上有一个按钮点击可以唤起App。这样的效果是怎么实现的呢?浏览器是一个app;为什么一个app可以调起其他app的页面?说到跨app的页面调用,大家是…...
【操作系统】概述
基本特征 1. 并发 并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。 并行需要硬件支持,如多流水线、多核处理器或者分布式计算系统。 操作系统通过引入进程和线程,使得程序能够并发运行 2. 共享 共享…...
Flume三种组件的选择对比
文章目录1.source2.channel3.sink1.source Source: 数据源:通过source组件可以指定让Flume读取哪里的数据,然后将数据传递给后面的 channel Flume内置支持读取很多种数据源,基于文件、基于目录、基于TCP\UDP端口、基于HTTP、Kafka的 等等、当然了&#x…...
响应性基础API
一.什么是proxy和懒代理?什么是proxy?proxy对象是用于定义基本操作的自定义行为(如:属性查找,赋值,枚举,函数调用等等)。什么是懒代理?懒代理:在初始化的时候不会进行全部代理,而是…...
剑指 Offer 25. 合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表 难度:easy\color{Green}{easy}easy 题目描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1: 输入:1->2->4, 1->3->4 输出:1…...
顿悟日记(一)
目录2023年1月顿悟日记:2023年2月24日顿悟日记:2023年2月25日顿悟日记:2023年2月26日顿悟日记:顿悟的经历是如此的奇妙,且让人亢奋的事情。 2023年1月顿悟日记: 1.我是面向对象还是面向过程? …...
前端卷算法系列(二)
前端卷算法系列(二) 回文数 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样…...
网络应用之HTTP响应报文
HTTP响应报文学习目标能够知道HTTP响应报文的结构1. HTTP响应报文分析HTTP 响应报文效果图:响应报文说明:--- 响应行/状态行 --- HTTP/1.1 200 OK # HTTP协议版本 状态码 状态描述 --- 响应头 --- Server: Tengine # 服务器名称 Content-Type: text/html; charsetUTF-8 # 内容类…...
常见的CSS技巧
1.禁止长按图片弹出菜单 img {-webkit-touch-callout: none; // 主要用于禁止长按菜单。主针对webkit内核的浏览器; } /*或者 user-select , 是css3的新属性,用于设置用户是否能够选中文本*/ .img {-webkit-user-select: none;-khtml-user-select: none…...
算法进阶-动态规划
经典例题 大家肯定想用递归做 思路大概就是这样 递归到最后一行就是对应的D(i,j) 然后往上推 但是这样会超时,因为存在大量的重复计算 比如调用第一行MasSum(7)需要调用MaxSum(3)和MaxSum(8) 但是调用第二行MaxSum(3)还要调用3行的MaxSum(8)和3行的MaxSum(1) 第二行…...
python的读写操作
一、使用open函数,可以打开一个已经存在的文件,或着创建一个新文件 语法如下: open(name, mode, encoding) name: 要打开的目标文件的字符串(可以包含文件所在的具体路径) mode: 打开文件模式:只读(r)、写入(w)、追加(a)等 e…...
Mybatis中添加、查询、修改、删除
在Mybatis中添加数据的操作 编写相对应的SQL语句,并完成相关数据的对应关系 编写测试用例 需要提交事务 sqlSession commit() 这里需要注意的是mybatis是默认的是手动提交事务,如果不写的话会进行回滚,添加操作就不会被执行 或者在 如果…...
C++---线性dp---传纸条(每日一道算法2023.2.26)
注意事项: 本题dp思路与 “线性dp–方格取数” 一致,下方思路仅证明为什么使用方格取数的思路是正确的。 题目: 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。 一次素质拓展活动中,班上同学安排坐成…...
浅谈 C/C++ 的输入输出
更好的阅读体验\huge{\color{red}{更好的阅读体验}}更好的阅读体验 文章目录0. 叠甲,过1. 谈谈输入输出缓冲区1.1 基本概念输入输出流标准输入输出流文件输入输出流1.2 输入输出缓冲区什么是输入输出缓冲区?为什么要设置输入输出缓冲区?C/C 的…...
林州网站建设服务/百度服务中心
2019独角兽企业重金招聘Python工程师标准>>> dSploitzANTI渗透教程之HTTP服务重定向地址 HTTP服务 HTTP服务主要用于重定向地址的。当用户创建一个钓鱼网站时,可以通过使用HTTP服务指定,并通过实施中间人攻击,使客户端访问该钓鱼网…...
店铺推广软文范文/seo教程seo入门讲解
一、眼功眼功俗称盯球功夫。它主要培养运动员在球场上拥有精准的洞察能力和击球意识的基础。眼功主要包括视觉反应、环视能力及视野。其中视觉反应尤为关键,它主要参照教练员提供的信息,同时观察对手各种不同动作,精准的判断出对手的下一个动作ÿ…...
网站开发的重要性/保定百度推广联系电话
概述曾经去网易面试的时候,面试官问了我一个问题,说下完订单后,如果用户未支付,需要取消订单,可以怎么做我当时的回答是,用定时任务扫描DB表即可。面试官不是很满意,提出:用定时任务…...
张家界做网站/百度sem代运营
🍡三个不相信 1.不相信翻译 PMP考题的中文翻译常常词不达意,当你产生怀疑时不要犹豫,看看上面的英文原文,你会立刻感到柳暗花明。 2.不相信经验 东西方在语言文字、文化、习惯、工作方式上都存在较大差异,所以你的工作经验很可能与出题人有很多不同,你需要入乡随…...
武汉网站建站公司/网站优化排名查询
今天唠点啥 上次发文看到有位朋友评论“来了,来了,他来了”,哈哈哈哈觉得挺逗。确实,老Amy今天又来啦[此处应该有掌声]~ 我就寻思着,上篇文章车都开稳了,今天要怎么假装“正经”的跟大家唠点。来吧朋友,让我们一起举…...
可以做简历的网站/厦门推广平台较好的
http://www.franche-comte.org/mini-site/cn/french-travel-castel-cheese-wine.html 转载于:https://www.cnblogs.com/gaozehua/archive/2011/09/07/2169764.html...