当前位置: 首页 > news >正文

XCTF-Misc1 USB键盘流量分析

m0_01

附件是一个USB流量文件
在这里插入图片描述

分析

1.键盘流量

USB协议数据部分在Leftover Capture Data域中,数据长度为八个字节,其中键盘击健信息集中在第三个字节中。
在这里插入图片描述

usb keyboard映射表:USB协议中HID设备描述符以及键盘按键值对应编码表
在这里插入图片描述

2.USB流量提取

USB协议的数据部分在 Leftover Capture Data 域中,可使用tshark提取流量
tshark -r xxx.pcapng -T fields -e usb.capdata > usbdata.txt
在这里插入图片描述

3.处理data文件,提取键盘信息

由于得到的USB文件中含有空行,常见的usbdata中以两字节加冒号的格式(如例子)。
在这里插入图片描述例子例子
对文件进行处理:

#1.使用脚本删除空行
with open('usbdata.txt', 'r', encoding='utf-8') as f:lines = f.readlines()
lines = filter(lambda x: x.strip(), lines)
with open('usbdata.txt', 'w', encoding='utf-8') as f:f.writelines(lines)#2.将上面的文件用脚本分隔,加上冒号;
f=open('usbdata.txt','r') 
fi=open('out.txt','w')
while 1:a=f.readline().strip() if a:if len(a)==16:#键盘流量的话len为16鼠标为8 out=''for i in range(0,len(a),2):if i+2 != len(a):out+=a[i]+a[i+1]+":" else:out+=a[i]+a[i+1] fi.write(out) fi.write('\n') else: break 
fi.close()#3.最后用脚本提取
# print((line[6:8])) #输出6到8之间的值
#取出6到8之间的值
mappings = { 0x04:"A",  0x05:"B",  0x06:"C", 0x07:"D", 0x08:"E", 0x09:"F", 0x0A:"G",  0x0B:"H", 0x0C:"I",  0x0D:"J", 0x0E:"K", 0x0F:"L", 0x10:"M", 0x11:"N",0x12:"O",  0x13:"P", 0x14:"Q", 0x15:"R", 0x16:"S", 0x17:"T", 0x18:"U",0x19:"V", 0x1A:"W", 0x1B:"X", 0x1C:"Y", 0x1D:"Z", 0x1E:"1", 0x1F:"2", 0x20:"3", 0x21:"4", 0x22:"5",  0x23:"6", 0x24:"7", 0x25:"8", 0x26:"9", 0x27:"0", 0x28:"\n", 0x2a:"[DEL]",  0X2B:"    ", 0x2C:" ",  0x2D:"-", 0x2E:"=", 0x2F:"[",  0x30:"]",  0x31:"\\", 0x32:"~", 0x33:";",  0x34:"'", 0x36:",",  0x37:"." }
nums = []
keys = open('out.txt')
for line in keys:if line[0]!='0' or line[1]!='0' or line[3]!='0' or line[4]!='0' or line[9]!='0' or line[10]!='0' or line[12]!='0' or line[13]!='0' or line[15]!='0' or line[16]!='0' or line[18]!='0' or line[19]!='0' or line[21]!='0' or line[22]!='0':continuenums.append(int(line[6:8],16)) 
keys.close()
output = ""
for n in nums:if n == 0 :continueif n in mappings:output += mappings[n]else:output += '[unknown]'
print ('output :\n' + output)

在这里插入图片描述

运行脚本,将对应的USB转换出来是一串数字
在这里插入图片描述

4.云影解码

这一串数字,我也不知道是啥,搜吧

云影密码(01248码)

  • 这种加密方式仅使用01248这5种数字来进行,其中0用来唯一表示间隔,其他数字用加法和表示替换密文。再使用数字1-26表示字母A-Z。
    如:18 = 1+8 = 9 = I,1248 = 1+2+4+8 = 15 = O
  • 特点:密文中仅存在01248,加密对象仅有字母。
  • 加密方式:

题目:12401011801180212011401804

  • 注意(3个及以上数字时):虽然是相加,但是可以在数字内不按顺序相加,如124可写成(12)4和1(24)结果分别是7和16,只要保证不大于26即可
  • 第一步分割:即124 、1、118、118、212、114、18、4
  • 第二步基本翻译:例如124可以表示7,也可以表示16(但不可能是34,因为不会超过26),所以可以放弃来翻译其他没有异议的,可得:124、a、s、s、w、o、18、d
  • 第三步推测得出明文:可以推测后面的18表示r,前面的为p最合适。
    所以最后明文:password(密码)

解密脚本:

##with open(r'F:/桌面/tmp/2.txt','r') as f:
##    data = f.read()
##    print(data)data = "884080810882108108821042084010421"
list = data.split('0')
print(list)datalist=[]
def dlist(list):d = 0for i in list:for j in i:d += int(j)datalist.append(d)d=0return datalist
datalist = dlist(list)def str(datalist):s=''for i in datalist:s += chr(i+64)return s
print(str(datalist))

在这里插入图片描述
最终得到flag

参考链接:
https://blog.csdn.net/ON_Zero/article/details/130528679
https://www.cnblogs.com/yuanchu/p/13492904.html
CTF密码学总结 https://blog.csdn.net/xiao__1bai/article/details/121089114

http://www.lryc.cn/news/275330.html

相关文章:

  • 毛概笔记。
  • postman使用方法指南,最全面的教程
  • 工业物联网上篇——什么是IIOT?
  • 【JavaEE】Java多线程状态-- 多线程篇(10)
  • 坐标转换 | EXCEL中批量将经纬度坐标(EPSG:4326)转换为墨卡托坐标(EPSG:3857)
  • STM32学习笔记二十:WS2812制作像素游戏屏-飞行射击游戏(10)探索游戏平衡
  • Windows 搭建ninja 编译c++的环境
  • 环形链表【链表】【哈希】
  • Hive实战:网址去重
  • 206.【2023年华为OD机试真题(C卷)】最大N个数与最小N个数的和(JavaPythonC++JS实现)
  • 【刷题日记】青少年CTF-Misc(一)
  • 《未知星途:自我掌握命运》
  • 一个简单的KNN实现方法
  • Vue实现加减法验证码
  • PDF最强处理工具-StirlingPDF
  • SpringCloud系列篇:入门讲解Spring Cloud是什么
  • GEE:随机数
  • H266/VVC率失真优化与速率控制概述
  • thinkphp6入门(14)-- 多关联模型查询
  • MT8766安卓核心板规格参数_MTK8766核心板模块方案定制
  • k8s的声明式资源管理(yaml文件)
  • Qt中图片旋转缩放操作
  • LeetCode 2125. 银行中的激光束数量【数组,遍历】1280
  • 关于图像分割任务中按照比例将数据集随机划分成训练集和测试集
  • 回文链表【链表】
  • Linux Perf 介绍
  • 【论文阅读】Variational Graph Auto-Encoder
  • 如何把电脑中的项目快速传进Github中?
  • Plantuml之nwdiag网络图语法介绍(二十九)
  • MyBatis接口的方法上使用,定义对应的 SQL 操作