有趣的Hack-A-Sat黑掉卫星挑战赛——定位卫星Jackson

news2024/9/29 16:14:06

国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加,太空已经成为国家赖以生存与发展的命脉之一,凝聚着巨大的国家利益,太空安全的重要性日益凸显[1]。而在信息化时代,太空安全与信息安全紧密地结合在一起。

2020年9月4日,美国白宫发布了首份针对太空网络空间安全的指令——《航天政策第5号令》,其为美国首个关于卫星和相关系统网络安全的综合性政策,标志着美国对太空网络安全的重视程度达到新的高度。在此背景下,美国自2020年起,连续两年举办太空信息安全大赛“黑掉卫星(Hack-A-Sat)”,在《Hack-A-Sat太空信息安全挑战赛深度解析》一书中有详细介绍,本文介绍了Hack-A-Sat黑掉卫星挑战赛的定位卫星Jackson这道赛题的解题过程。

题目介绍

Let's start with an easy one, I tell you where I'm looking at a satellite, you tell me where to look for it later.

主办方告诉参赛者在哪里看到了一颗卫星,需要参赛者告诉主办方在哪里还可以看到这个卫星。给出的资料有:

(1)压缩包stations.zip,其中文件就是一个stations.txt文件,是TLE文件,关于TLE文件的格式说明在前文已有介绍,为了便于读者阅读,本节会再次给出简要介绍。

(2)给出了一个链接地址,使用netcat连接到题目给的链接后,会给出进一步提示,如图7-1所示(其中的坐标是随机的,时间也是随机的)。

图7-1 jackson题目的提示信息

连接后,会告诉参赛者当前看到这个卫星的时刻、卫星的地心惯性坐标系(ECI)坐标,接着会依次给出3个新的时刻,要求参赛者给出在哪里还可以看到这个卫星,输入具体的经纬度坐标。3次都输入正确后,会给出flag值。

编译及测试

这道挑战题的代码位于jackson目录下,查看challenge、solver目录下的Dockerfile,发现其中用到的是python:3.7-slim,为了加快题目的编译进度,在jackson目录下新建一个文件sources.list,内容如下:

deb https://mirrors.aliyun.com/debian/deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib
deb-src https://mirrors.aliyun.com/debian/deb-src https://mirrors.aliyun.com/debian/ bullseye main non-free contrib
deb https://mirrors.aliyun.com/debian-security/deb https://mirrors.aliyun.com/debian-security/ bullseye-security main
deb-src https://mirrors.aliyun.com/debian-security/deb-src https://mirrors.aliyun.com/debian-security/ bullseye-security main
deb https://mirrors.aliyun.com/debian/deb https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
deb-src https://mirrors.aliyun.com/debian/deb-src https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
deb https://mirrors.aliyun.com/debian/deb https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib

将sources.list复制到jackson、challenge、solver目录下,修改challenge、solver目录下的Dockerfile,在所有的FROM python:3.7-slim下方添加:

ADD sources.list /etc/apt/sources.list

打开终端,进入jackson所在目录,执行命令:

sudo make build

此时如果使用make test命令进行测试,会提示错误,如图7-2所示。

图7-2 执行make test命令时的错误信息

查询run.log,得到如下错误信息:

Traceback (most recent call last):
File "challenge.py", line 22, in <module>
ts = load.timescale()
File "/opt/venv/lib/python3.7/site-packages/skyfield/iokit.py", line 314, in timescale
data = self('deltat.data')
File "/opt/venv/lib/python3.7/site-packages/skyfield/iokit.py", line 203, in __call__
download(url, path, self.verbose)
File "/opt/venv/lib/python3.7/site-packages/skyfield/iokit.py", line 528, in download
raise e2
OSError: cannot get ftp://cddis.nasa.gov/products/iers/deltat.data because <urlopen error ftp error: TimeoutError(110, 'Connection timed out')>

Try opening the same URL in your browser to learn more about the problem.
If you want to fall back on the timescale files that Skyfield ships with,
try `.timescale(builtin=True)` instead.

错误原因是需要到NASA的CDDIS的ftp下载其中的文件,但是无法打开该链接。CDDIS(Crustal Dynamics Data Information System,地壳动力学数据信息系统)最初是为NASA的地壳动力学项目(Crustal Dynamics Project,CDP)提供中央数据库而开发的,建立于1982年,是一个专用数据库,用于归档和分发与空间大地测量相关的数据集。

CDDIS主要归档和分发如下数据:

  • 全球导航卫星系统GNSS的广播星历和精密星历:包括美国的GPS、俄罗斯的GLONASS、中国的北斗等。

  • 激光测距:包括人造卫星激光测距和月球激光测距。

  • 甚长基线干涉测量(Very Long Baseline Interferometry,VLBI)。

  • 星基多普勒轨道确定和无线电定位组合系统(Doppler Orbitography and Radio-positioning Integrated by Satellite,DORIS)。

但是,从2020年10月31日起,因美国政府安全要求不再允许CDDIS通过传统的未加密匿名ftp提供数据,所有数据仍然可用,但是必须通过HTTPS或ftp-ssl进行访问,所以上述代码会报错。本节为了简化,直接修改challenge、solver两个python文件中的所有:

load.timescale()

将其改为

load.timescale(builtin=True)

这里使用的是Python的Skyfield库,不带参数时,将从上述ftp地址下载国际地球自转服务(International Earth Rotation Service,IERS),这个服务的内容很多,其中一项是世界时,参考run.log中的错误提示,这里将其参数改为内置的,就表示不再从NASA的ftp上读取数据。

再次使用make test命令进行测试,会顺利通过,输出信息如图7-3所示。

图7-3 jackson挑战题测试输出

相关背景知识

1.卫星星历TLE文件介绍

TLE是两行轨道根数(TLE),覆盖了气象卫星、海洋卫星、地球资源卫星、教育卫星等应用卫星。以北斗的某颗卫星TLE数据为例,如下:

BEIDOU 2A
1 30323U 07003A 07067.68277059 .00069181 13771-5 44016-2 0 587
2 30323 025.0330 358.9828 7594216 197.8808 102.7839 01.92847527 650

第一行主要元素解析如下:

(1)30323U:30323是北美防空司令部给出的卫星编号,U代表不保密,我们看到的都是U,否则我们就不会看到这组TLE了。

(2)07003A:国际编号,07表示2007年,003表示这一年的第3次发射,A表示这次发射编号为A的物体,其他还有B、C、D等。国际编号就是2007-003A。

(3)07067.68277059:表示这组轨道数据的时间点,07表示2007年,067表示第67天,即3月8日。

(4)68277059:表示这一天里的时刻,大约是16时22分左右。

(5)58:表示关于这个空间物体的第58组TLE。

(6)7:最后一位是校验位。

第二行主要元素解析如下:

(1)30323:北美防空司令部给出的卫星编号。

(2)025.0330:轨道倾角。

(3)358.9828:升交点赤经。

(4)7594216:轨道偏心率。

(5)197.8808:近地点幅角。

(6)102.7839:平近点角,表示在给出这组TLE时,卫星在轨道的什么位置。

(7)01.92847527:每天环绕地球的圈数。其倒数就是周期。可以看出,该北斗卫星目前的周期大约是12h。

(8)65:发射以来飞行的圈数。

(9)0:校验位。

2.地心惯性坐标系ECI介绍

地心惯性坐标系(Earth Center Inertial Coordinates,ECI),原点是地球质心,z轴是地球平均自转极点,x轴是春分点(每年春分点均会发生变动,参考J2000.0),y轴由右手系决定。

题目解析

这道题目的解法还是比较直观的,使用Python提供的Skyfield、NumPy库,可以分为两步:

(1)已知在某个时刻目标卫星的ECI坐标,依据此信息,从给出的station文件中找到目标卫星对应的TLE。

(2)已知目标卫星的TLE,那么就可以计算任意时刻的ECI坐标。

关键代码如下:

from pwn import *
import numpy as np
from skyfield.api import load
import astropy.units

# 加载TLE文件,读出所有的卫星信息,保存在satellites 中
satellites = load.tle_file('./stations.txt')

......

# 下面代码中的t就是题目中给出的观察到目标卫星的那个时刻;eci_coords就是题目中给出的t时刻目标
# 卫星的ECI坐标;通过遍历给出的TLE,取出在t时刻与给定坐标最接近的卫星
match = satellites[np.argmin([np.linalg.norm(s.at(t).position.km-eci_coords) for s in satellites])]

......

# 通过Skyfield可以获取在题目给出的新时刻new_t时的卫星ECI坐标
x,y,z = match.at(new_t).position.km

其中match存储的就是目标卫星的TLE,其计算过程如下:

(1)遍历station中的所有卫星。

(2)对其中的每颗卫星计算其在时刻t的坐标,坐标系是ECI,单位是km。

(3)将上一步得到的坐标与目标卫星在t时刻的坐标相减,然后调用np.linalg.norm函数计算结果的范数,默认就是x、y、z轴坐标差值的平方和再开根号。假设当前从station中取出的卫星坐标是(x,y,x),目标卫星坐标是(x0,y0,z0),那么实际计算的就是如下:

(4)将station中所有卫星进行上述运算,取出范数最小的卫星,这个卫星就是目标卫星。

(5)知道了目标卫星的TLE,就可以通过Skyfield可以获取在题目给出的新时刻new_t时目标卫星的ECI坐标,将该坐标输入终端即可。

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

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

相关文章

图解LeetCode——剑指 Offer 53 - I. 在排序数组中查找数字 I

一、题目 统计一个数字在排序数组中出现的次数。 二、示例 示例 1 【输入】nums [5,7,7,8,8,10], target 8 【输出】2 示例 2: 【输入】nums [5,7,7,8,8,10], target 6 【输出】0 提示&#xff1a; 0 < nums.length < 10^5-10^9 < nums[i] < 10^9nums 是一…

基于Java+SpringBoot+SpringCloud+Vue前后端分离医院管理系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建、毕业项目实战、项目定制✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《S…

一文总结 JUC 并发编程

文章目录一、JUC 并发编程二、协调锁1. Synchronized2. Synchronized 锁下线程通信3. Lock 锁4. Lock 锁实例 - ReentrantLock5. 读写锁 - ReadWriteLock三、CAS & 原子类1. CAS2. 原子类2.1 基础原子类2.2 数组类型原子类2.3 引用型原子类四、线程1. Callable 和 Future2.…

Filter防火墙(8)

实验目的 1、了解个人防火墙的基本工作原理&#xff1b; 2、掌握Filter防火墙的配置。 预备知识防火墙 防火墙&#xff08;Firewall&#xff09;是一项协助确保信息安全的设备&#xff0c;会依照特定的规则&#xff0c;允许或是限制传输的数据通过。防火墙可以是一台专属的硬…

Linux防火墙(7)

实验目的 通过该实验了解Linux防火墙iptables实现原理&#xff0c;掌握iptables基本使用方法&#xff0c;能够利用iptables对操作系统进行加固。预备知识基本原理 netfilter/iptables&#xff08;简称为iptables&#xff09;组成Linux平台下的包过滤防火墙&#xff0c;具有完成…

拉普拉斯矩阵的定义,常见的几种形式以及代码实现?

拉普拉斯矩阵 拉普拉斯矩阵(Laplacian matrix) 也叫做导纳矩阵、基尔霍夫矩阵或离散拉普拉斯算子,主要应用在图论中,作为一个图的矩阵表示。对于图 G=(V,E),其Laplacian 矩阵的定义为 L=D-A,其中 L 是Laplacian 矩阵, D=diag(d)是顶点的度矩阵(对角矩阵),d=rowSum(A),…

【Java 面试合集】简述下Java的三个特性 以及项目中的应用

简述下Java的特征 以及项目中的应用 1. 概述 上述截图中就是Java的三大特性&#xff0c;以及特性的实现方案。接下来就每个点展开来说说 2. 封装 满足&#xff1a;隐藏实现细节&#xff0c;公开使用方法 的都可以理解为是封装 而实现封装的有利手段就是权限修饰符了。可以根据…

【MT7628】开发环境搭建-安装Fedora12

1.下载Fedora安装镜像 1.1链接地址 http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/12/Fedora/i386/iso/ 1.2选择如下截图的软件包下载 1.3下载完成的软件包名称

06分支限界法

文章目录八数码难题普通BFS算法全局择优算法&#xff08;A算法&#xff0c;启发式搜索算法&#xff09;单源最短路径问题装载问题算法思想&#xff1a;队列式分支限界法优先队列式分支限界法布线问题最大团问题批处理作业调度问题分支限界法与回溯法的区别&#xff1a; &#x…

已解决sc delete MongoDB卸载MongoDB拒绝访问。

已解决sc delete MongoDB卸载MongoDB拒绝访问。 文章目录报错问题报错翻译报错原因解决方法联系博主免费帮忙解决报错报错问题 粉丝群里面的一个小伙伴遇到问题跑来私信我&#xff0c;想卸载MongoDB数据库&#xff0c;但是发生了报错&#xff08;当时他心里瞬间凉了一大截&…

select 与 where、order by、limit 子句执行优先级比较

当 select 和 其他三种语句的一者或者多者同时出现时&#xff0c;他们之间是存在执行先后顺序的。 他们的优先级顺序是&#xff1a;where > select > order by > limit 目录 1、select 与 where 2、select 与 order by 3、order by 与 limit 4、优先级证明 1、s…

低噪声与功放选型购买

低噪声与功率放大器的区别&#xff1f;购买时怎么区分&#xff1f; 低噪放 低噪放&#xff0c;低噪声射频放大器。作用就是要求噪声系数很低&#xff0c;放大电压信号。一般放在系统第一级&#xff0c;因为噪声系数低&#xff0c;接收放大的信号有很好的的信噪比。如天线的接…

大数据框架之Hadoop:入门(六)常见错误及解决方案

1&#xff09;防火墙没关闭、或者没有启动YARN INFO client.RMProxy: Connecting to ResourceManager at hdp101/192.168.10.101:80322&#xff09;主机名称配置错误 3&#xff09;IP地址配置错误 4&#xff09;ssh没有配置好 5&#xff09;root用户和vagrant两个用户启动集…

设计模式--适配器模式 Adapter Pattern

设计模式--适配器模式 Adapter Pattern适配器模式 Adapter Pattern1.1 基本介绍1.2 工作原理类适配器模式对象适配器模式接口适配器模式小结适配器模式 Adapter Pattern 1.1 基本介绍 &#xff08;1&#xff09;适配器模式将某个类的接口转换成为客户端期望的另一个接口表示&…

普通人如何改变自己的命运?

【Morty】普通人改变命运的秘密&#xff01;我的观点可能会颠覆你的认知_哔哩哔哩_bilibili 非常感谢UP&#xff0c;你的每个视频我都看了&#xff0c;给我启示最大的是《为什么你总是那么穷》&#xff0c;这些年一直走背运&#xff0c;加上20年创业失败了&#xff0c;已经身无…

LAMP架构介绍及配置

LAMP架构介绍及配置一、LAMP简介与概述1、LAMP平台概述2、LAMP各组件主要作用3、构建LAMP平台二、编译安装Apache htpd服务1、将所需软件包上传到/opt目录下2、解压以下文件3、移动两个文件并改名4、安装所需工具5、编译安装6、做软连接&#xff0c;使文件可执行7、优化配置文件…

面试题:Java锁机制

java对象包含了三个部分&#xff1a;对象头&#xff0c;实例数据和对齐填充。对象头又存放了&#xff1a;markWord和class point。classpoint &#xff1a;指向方法区&#xff0c;当前对象的类信息数据。markword&#xff1a;存储了很多和当前对象运行时的数据&#xff1a;例如…

【Spark分布式内存计算框架——Spark Core】7. RDD Checkpoint、外部数据源

第五章 RDD Checkpoint RDD 数据可以持久化&#xff0c;但是持久化/缓存可以把数据放在内存中&#xff0c;虽然是快速的&#xff0c;但是也是最不可靠的&#xff1b;也可以把数据放在磁盘上&#xff0c;也不是完全可靠的&#xff01;例如磁盘会损坏等。 Checkpoint的产生就是…

六、mybatis与spring的整合

Spring整合Mybaits的步骤 引入依赖 在Spring整合Mybaits的时候需要引入一个中间依赖包mybatis-spring <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version> </dependency&g…

通过抓包分析gPRC协议

通过抓包分析gPRC协议 前言 gRPC 是一个高性能、开源和通用的 RPC 框架&#xff0c;面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本&#xff0c;分别是&#xff1a;grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C, Node.js, Python, Ruby, Objective-C, PHP 和 …