MISC学习实录(二)

MISC学习实录(二)

因为在MiGuo的MISC课上睡大觉,所以被MiGuo惩罚来学MISC ε(┬┬﹏┬┬)3

USB流量分析

USB流量主要是鼠标流量和键盘流量

鼠标流量

USB协议鼠标数据部分在Leftover Capture Data域中,数据长度为四个字节。 其中, 第一个字节代表按键,当取0x00时,代表没有按键,为0x01时,代表按左按键,为0x02时,代表当前按键为右键; 第二个字节可以成是一个signed byte类型,其最高位为符号位,当这个值为时,代表鼠标水平右移动多少像素,为时,代表水平左移多少像素; 第三个字节与第二个字节类似,代表垂直上下移动的偏移。

键盘流量

键盘数据包的数据长度为8个字节

USB使用HID协议规定键盘映射,具体映射表我没找到,具体可以翻翻HID协议

1和2两道题的思路是一样的

把pcap文件扔进kali,然后用tshark将 leftover capture data 提取出来:

1
tshark -r example.pcap -T fields -e usb.capdata //如果想导入usbdata.txt文件中,后面加上参数:>usbdata.txt

然后看特质,长的是键盘流量,短的是鼠标流量

最后用脚本解析

键盘转化脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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('usbdata.txt')

for i in keys:
    i = i.strip()
    line = ""
    for j in range(0,len(i),2):
        line += i[j:j+2] + ":"
    line = line[:len(line)-1]
    # print(line)
    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':
         continue
    nums.append(int(line[6:8],16))

keys.close()
output = ""
for n in nums:
    if n == 0 :
        continue
    if n in mappings:
        output += mappings[n]
    else:
        output += '[unknown]'
print('output : ' + output)

# 脚本跑的结果中去掉unknow,注意del键

鼠标转化脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
nums = []
keys = open('./mouse_data.txt','r')

f = open('xy.txt','w')
posx = 0
posy = 0
for i in keys:
    line = ""
    i = i.strip()
    for j in range(0,len(i),2):
        line += i[j:j+2] + ":"
    line = line[:len(line)-1]
    if len(line) != 11 :
        continue
    x = int(line[3:5],16)
    y = int(line[6:8],16)
    if x > 127 :
        x -= 256
    if y > 127 :
        y -= 256
    posx += x
    posy += y
    btn_flag = int(line[0:2],16)  # 1 for left , 2 for right , 0 for nothing
    if btn_flag == 1 : # 1 代表左键 // 这里0,1,2都试试
        f.write(str(posx))
        f.write(' ')
        f.write(str(posy))
        f.write('\n')

f.close()




from PIL import Image
img = Image.new('RGB',(2000,2000),(255,255,255))#创建Image对象
f =open('xy.txt')#xy.txt文件 
for line in f.readlines():
    point =line.split()
    img.putpixel((int(point[0]),int(point[1])),(0,0,0))#读取文件中的每一行,并修改像素 
f.close() 
img.show()

第三题是BUU原题

给一个rar和一个ftm

尝试解压rar失败

由于RAR是有四个文件块组成的,分别是标记块、归档头部块、文件块、结束块,这些块之间没有固定地先后顺序,但要求第一个块必须是标志块并且其后紧跟一个归档头部块。详情看:

CTF解题技能之压缩包分析基础篇

我们把rar 扔进010提示模块三有错误,对照博客中的内容(文件块的HEAD_TYPE应该是0x74而不是0x7A。)把 7A改成74

然后解压得到一个png

把png扔进stegsolve发现在Blue plane 0 有二维码

扫码得到ci{v3erf_0tygidv2_fc0}

还有key.ftm没用到,有key说明flag被加密了

把key.ftm扔进010,发现有“PK”,尝试搜索 50 4B 03 04 ,说明ftm中藏了一个zip,把50 4Bpcap前的内容全部删去,再保存为zip

解压得到一个pcap,用tshark提取leftover capture data,发现是键盘流量,跑脚本拿到key: XINAN

加密方式是维吉尼亚+栅栏

解密得到flag

flag{vig3ne2e_is_c00l}

MISC常见加密方法:

CTF 常见密码编码及其解决方案

Licensed under CC BY-NC-SA 4.0
Build by Oight
使用 Hugo 构建
主题 StackJimmy 设计