【CTF-Misc】GPS数据处理:WriteUp of “CatchCat”

发布时间:2023年12月29日

一、分析

最开始拿到txt文件还以为要对*号后面的数字做什么,后来发现直接用GPS数据解析库解析这串数据就好了。

其他WriteUp最快速的做法就是在网页上直接转可视化,由于我最近接触了ArcGIS,对ArcToolbox了解了一下,在此分享一个脱裤子放屁但扩展视野的做法,并分享一下相关地图格式。

题的链接:https://adworld.xctf.org.cn/challenges/list?rwNmOdr=1703836871057

我们拿到“CatchCat.txt”之后,先分析上面的数据格式;我首先会觉得这是GPS数据,用十六进制做不合适,所以直接解析GPS数据是最好的做法。

在这里插入图片描述
而且注意到GPGGA的数据前缀。

NMEA(National Marine Electronics Association,美国国家海洋电子协会),现在是GPS导航设备统一的RTCM标准协议。最常用的格式为"GGA",它包含了定位时间,纬度,经度,高度,定位所用的卫星数,DOP值,差分状态和校正时段等,其他的有速度,跟踪,日期等。NMEA实际上已成为所有的GPS接收机和最通用的数据输出格式,同时它也被用于与GPS接收机接口的大多数的软件包里。

字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GGA)GPS定位信息

字段1:UTC 时间,hhmmss.sss,时分秒格式

字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)

字段3:纬度N(北纬)或S(南纬)

字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)

字段5:经度E(东经)或W(西经)

字段6:GPS状态,0=未定位,1=非差分定位,2=差分定位,3=无效PPS,6=正在估算

字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)

字段8:HDOP水平精度因子(0.5 - 99.9)

字段9:海拔高度(-9999.9 - 99999.9)

字段10:地球椭球面相对大地水准面的高度

字段11:差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)

字段12:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)

字段13:校验值($与*之间的数异或后的值)

这是这串数据的组成格式。

二、题解

方法1:无脑转换

然后我们在这个网站:https://www.h-schmidt.net/NMEA/上面把txt转成KML文件。

KML,KML(Keyhole Markup Language,Keyhole 标记语言)最初是由Google 旗下的Keyhole 公司开发和维护的一种基于XML 的标记语言,利用XML 语法格式描述地理空间数据(如点、线、面、多边形和模型等),适合网络环境下的地理信息协作与共享。

等待自动下载,打开ArcMap,“地理处理”-“ArcToolbox”-“转换工具”-“由KML转出”-“KML转图层”,就可以直接转出一个地理图层。

在这里插入图片描述
竖着看就得到了flag(但不容易看清楚):

CatCTF{GPS_M1ao}

ArcGIS,ArcGIS产品线为用户提供一个可伸缩的,全面的GIS平台。ArcObjects包含了许多的可编程组件,从细粒度的对象(例如单个的几何对象)到粗粒度的对象(例如与现有ArcMap文档交互的地图对象)涉及面极广,这些对象为开发者集成了全面的GIS功能。ArcMap是一个用户桌面组件,具有强大的地图制作,空间分析,空间数据建库等功能。是美国环境系统研究所(Environment System Research Institute,ESRI)于1978年开发的GIS系统。

方法2:python可视化处理

利用python3提供的可视化能力,导入folium库和pynmea2库和os库完成数据的解析,导出一个html文件可供查看。

我直接上代码了:

import pynmea2

import folium

import os


def parse_file(file_path):# 定义一个数据预处理的函数
    txt_tables = []
    f = open(file_path, "r",encoding='utf-8')
    line = f.readline() # 读取第一行
    locations = []

    while line:
        text = line[0:]# 从$GPGGA开始读
        msg = pynmea2.parse(text)
        # print(msg.latitude)  #24.551053333333332
        # print(msg.longitude)  #118.1067375
        tmp = []
        if(msg.latitude == 0.0 or msg.longitude == 0.0):
            line = f.readline() # 读取下一行
            continue
        tmp.append(msg.latitude)
        tmp.append(msg.longitude)
        locations.append(tmp)
        line = f.readline() # 读取下一行
    return locations

locations=parse_file("C:\\Users\\xieyu\\day1titanic\\CatchCat.log")

#调用刚刚定义的函数,注意定义一个新变量传入处理好的数据,自己改路径,后面同理
#注意事先将txt文件改成log格式,这样最符合pynmea2的读取方式(我的做法,你也可以试试是否支持txt?)


def draw_gps(locations, output_path, file_name):
  
    m = folium.Map(locations[0], zoom_start=15, attr='default')  #中心区域的确定

    folium.PolyLine(    # polyline方法为将坐标用线段形式连接起来
        locations,    # 将坐标点连接起来
        weight=3,  # 线的大小为3
        color='orange',  # 线的颜色为橙色
        opacity=0.8    # 线的透明度
    ).add_to(m)    # 将这条线添加到刚才的区域m内
    
    # 起始点,结束点
    folium.Marker(locations[0], popup='<b>Starting Point</b>').add_to(m)
    folium.Marker(locations[-1], popup='<b>End Point</b>').add_to(m)
    
    m.save(os.path.join(output_path, file_name))  # 将结果以HTML形式保存到指定路径
   
draw_gps(locations,"C:\\Users\\xieyu\\day1titanic","index.html")#调用

证明一下代码的可用性:

在这里插入图片描述

三、相关地图格式

GPX格式:GPX(GPS eXchange Format, GPS交换格式)是一个XML格式,为应用软件设计的通用GPS数据格式。它可以用来描述路点、轨迹、路程。这个格式是免费的,可以在不需要付任何许可费用的前提下使用。它的标签保存位置,海拔和时间,可以用来在不同的GPS设备和软件之间交换数据。如查看轨迹、在照片的exif数据中嵌入地理数据。

WFS格式:WFS(Web Feature Service——Web要素服务)可以返回地理要素,地图由客户端绘制。

service=WFS    # 使用了WFS服务
version=1.1.0    #版本号为1.1.0
request=GetFeature   # 执行GetFeature操作
typename=topp:states   # GeoServer服务器中topp工作区的名为states的图层
featureid=states.12    # 获取要素的ID为12

WFS使用地理标记语言(Geography Markup Language,GML)返回数据。GML可以同时包含图形与属性信息。由于GML是基于XML的,因此比GeoJSON要冗长得多。

文章来源:https://blog.csdn.net/hustle28214/article/details/135294548
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。