国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加,太空已经成为国家赖以生存与发展的命脉之一,凝聚着巨大的国家利益,太空安全的重要性日益凸显[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挑战题测试输出
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:校验位。
地心惯性坐标系(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坐标,将该坐标输入终端即可。
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
看完文章http://jeffkreeftmeijer.com/2011/method-chaining-and-lazy-evaluation-in-ruby/,我开始寻找更好的方法链和惰性求值解决方案。我想我已经用以下五个规范概括了核心问题;谁能让他们全部通过?任何事情都可以:子类化、委托(delegate)、元编程,但不鼓励后者。最好将依赖性保持在最低限度:require'rspec'classFoo#EpiccodehereenddescribeFoodoit'shouldreturnanarraycorrespondingtothereverseofthemethodchai
大家好,我叫胡飞虎,花名虎仔,目前负责云效旗下产品Codeup代码托管的设计与开发。代码作为企业最核心的数据资产,除了被构建、部署之外还有更大的价值。为了帮助企业和团队挖掘更多源代码价值以赋能日常代码研发、运维等工作,云效代码团队在大数据和智能化方向进行了一系列的探索和实践(例如代码搜索与推荐),本文主要介绍我们如何通过直接打通源代码来提高研发与运维效率。随着微服务架构的流行,一个业务流程需要多个微服务共同完成。一旦出现问题,运维人员在面对数量多、调用链路复杂的情况下,很难快速锁定导致问题发生的罪魁祸首:代码。为了提高排查效率,目前常见的解决方案是:链路跟踪+日志分析工具相结合。即通过链路跟踪
我看到很多很酷的东西可以添加到我的Ruby控制台中。例如,一个好的列表是“My.irbrcforconsole/irb”。我用谷歌搜索,但我只找到了网络日志,上面写着人们在他们的.irbrc中添加了什么gem。没有人说在哪里可以找到它。我找不到“irbrc”。我打开了我的主文件夹,如果我输入IRB,它会转到Ruby控制台,但我找不到这个文件。谁能帮我找到它? 最佳答案 这是一个irbrc点文件,因此您需要在您的主目录中ls-a才能找到它。如果它不在那里,只需创建一个.irbrc文件。我的很简单,但这就是我的内容:require'ru
使用cucumber和capybara测试Rails应用。假设我无法更改标记,我可以使用capybara在充满类似td和select的页面中选择以下选择吗?LanguagesCommunication这似乎失败了(我假设是因为嵌套的“[”和“]”)。find("select[name=attributes[ruby][category]]")转义也不行。想法? 最佳答案 您可以尝试find('select',:name=>'attributes[ruby][category]')或find_field('attributes[rub
我有一个查询,它在同一个表中搜索两个单独的字段...寻找最有可能是特定城市但也可能是国家的位置...即需要两个字段。表格看起来像:CountryCityGermanyAachenUSAAmarilloUSAAustin结果:KeywordSideinfoAachenGermanyUSACountryAustinUSAGermanyCountry基本上我想知道是否有更简洁的方法来执行此操作,因为我必须使用两个单独的查询,然后将它们加在一起,对它们进行排序等(效果很好):defself.ajax(search)countries=Location.find(:all,:select=>'c
假设我有一个Ruby类,Flight。Flight上有一个attr_accessor:key。如果有一个此类的实例数组:flights=[flight1,flight2,flight3],我有一个“目标键”,比如说“2jf345”,我想根据它找到一个航类键,来自该数组-我应该使用哪种代码?这是我要使用的代码:航类[flights.map{|s|s.key}.index(target_key)]但是对于Ruby,似乎应该有更简单的方法。此外,上面的代码为我返回了一个错误-`[]':noimplicitconversionfromniltointeger(TypeError)。我认为这意味
即使来自javascript,这对我来说也很糟糕:irb>>a=['a','b','c']=>["a","b","c"]>>a.unshift(a.delete('c'))=>["c","a","b"]有没有更清晰的方法将元素放在数组的前面?编辑我的实际代码:if@admin_users.include?(current_user)@admin_users.unshift(@admin_users.delete(current_user))end 最佳答案 也许这对你来说更好看:a.insert(0,a.delete('c'))
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion什么可用的(最好的)基于rubyIP的地理定位gem/插件?它们在功能、性能和易用性方面如何相互比较(例如,它们是否与网络服务交互,或需要单独的数据库等)?希望有使用过的friend可以分享一下经验和建议。
我想知道如何使用Capistrano在Git中针对特定的提交SHA进行部署?应该是这样的capdeploy--version=经过大量搜索似乎无法找到这个问题的答案。 最佳答案 对于Capistrano2.9到3.0:cap-Srevision=80655da8d80aaaf92ce5357e7828dc09adb00993deploy对于旧版本的Capistrano,您可以通过执行以下操作来部署特定的gitcommit/tree/branch/tag:cap-sbranch=80655da8d80aaaf92ce5357e7828