省赛刷题之旅(持续更新...)

前言

本篇只记录有质量的题目或者自己以前没有做过的题目。

安洵_Attack

首先追踪TCP流 在第820个包中找到上传的一句话木马文件。

查看下一个流,发现发包是base64编码,回包是rot13编码。

将回包解码:

在第824个流中找到一个压缩包,提取出来需要密码:

发现提示:

需要找到administrator的密码。
查看http对象,发现lsass.dmp文件:

可以使用mimikatz工具进行爆破:

得到administrator密码,解压得到flag。


[ACTF新生赛2020]music

首先拿到一个m4a文件,打开发现错误。用winhex打开发现都是A1,想到文件和A1异或。
010Editor进行异或:

得到正常文件,然后打开就能得到flag。


[湖南省赛2019]Findme

题目给出了5张图片。
第一张:
是一种半损坏的图片,首先想到改宽高。现用脚本把图片真实宽高算出来:

改完如图:

看到图片还是无法正常显示,继续摸索还存在哪个问题。
用010editor进行分析:发现是IDA块的问题。
在chunk[2]和chunk[3]中ida块标识没有:

所有我们把IDA块的标识符(49444154)添上即可。
得到的图片是lsb隐写,在低位发现二维码,扫描得到第一段密文:

第二张:
010editor分析发现在chunk[7]以后是7z文件头:

仔细发现是PK改成7z文件头,所以把7z全部改成PK即可:

在第618个txt文件中找到第二段密文:

第三张:
分析发现从chunk[0]到chunk[6]的每个uint32 crc中都要一个16进制数。所以

用脚本将16进制转换城ascii,得到第三段密文。

第四张,第五张:
用010editor查看最后即可得到密文

最后得到的五段密文如下:

排序为:1-5-4-2-3

最后解得flag:


[MRCTF2020]Hello_ misc

首先binwalk分离出一个压缩包,然后用Stegsolve找到一张图片,图片上有压缩包的密码。

解压完,out.txt里是TTL隐写。将其转换成字符串,脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import re
txt = open("out.txt",'r')
line = txt.readlines()
number = []
flag = ""
for i in line:
number.append(int(i))
for i in number:
if(i == 63):
flag += "00"
elif(i == 127):
flag += "01"
elif(i == 191):
flag += "10"
else:
flag += "11"
strr = re.findall(r'.{8}', flag)
for i in strr:
print(chr(int(i,2)),end="")

得到最后的rar压缩包密码:

打开发现是doc文件,找到隐藏的文字:

发现是base64隐写,使用网上的脚本:b64steg
得到最后的二进制字符串,把1去掉:

1
2
3
4
5
6
7
8
9
10
11
with open('out.txt','r+') as a:
r = a.readlines()
a = ''
for i in r:
# print(type(i))
for b in i:
if b == '1':
i= i.replace(b,'.')
a += i+'\n'
break
print(a)

将0练成字符得到flag。


[WUSTCTF2020]spaceclub

下载一个txt文件,出题人把文字给隐藏了。放在sublime里即可显示出来。

一开始以为是摩斯密码,结果一对比发现不是。
最后看了wp,才知道按照长短来写二进制数,长为,短为0
脚本如下:

1
2
3
4
5
6
7
8
9
with open('attachment.txt','r+') as a:
r = a.readlines()
b = ''
for i in r:
if len(i)==7:
b += '0'
else:
b += '1'
print(b)

最后二进制转字符串。


[ACTF新生赛2020]frequency

首先打开doc文件,发现写着flag有两段。
第一段是doc的隐藏文字,第二段查看属性在doc的备注里。
然后base64解码,得到一串字符串。最后进行字符频率匹配,得到flag。脚本如下:

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
43
44

# -*- coding: UTF-8 -*-
def processLine(line, CharacterCounts):
for character in line:
#if ord(character) in range(97, 123):
if ord(character) in range(32,126):
CharacterCounts[character] += 1

#创建字母字典
def createCharacterCounts(CharacterCounts):
#for i in range(97, 123):
for i in range(32, 126):
CharacterCounts[chr(i)] = 0

def main():
#用户输入一个文件名
# filename = input("enter a filename:").strip()
filename = "flag.txt"
infile = open(filename, "r")

#建立用于计算词频的空字典
CharacterCounts = {}
#初始化字典键值
createCharacterCounts(CharacterCounts)
for line in infile:
#processLine(line.lower(), CharacterCounts)
processLine(line, CharacterCounts)

#从字典中获取数据对
pairs = list(CharacterCounts.items())

#列表中的数据对交换位置,数据对排序
items = [[x,y] for (y,x) in pairs]
items.sort(reverse=True)

#输出count个数词频结果
for i in range(len(items)):
#print(items[i][1]+"\t"+str(items[i][0]))
print(items[i][1],end='')

infile.close()

if __name__ == '__main__':
main()

hashcat

题目给的文件,没有后缀名。添加ppt后缀需要输入密码,想到office破解。
office破解分为三步:
1.使用office2john.py将office的hash破解出来

2.使用john破解hash

1
john --wordlist='/root/Desktop/安全工具/1.txt'  hash.txt
1
john --show hash

这样就得到office的密码。
打开ppt文件,在第七张中找到flag。


Business Planning Group

用010editor进行分析,发现png最后还有一个BPG文件:

用Honeyview直接可以打开BPG文件.


[ACTF新生赛2020]剑龙

首先打开pwd文件,发现是aaencode编码。

然后hh.jpg是steghide隐写:

1
steghide.exe extract -sf hh.jpg

得到一段DES加密的密文,在属性中找到密钥

知道了提示:pyc。
直接使用stegosaurus脚本跑出flag:


[MRCTF2020]pyFlag

题目给了三张图片,用010editor查看每张图片的最后发现端倪。
三张图片的最后都包含了一段压缩包文件,将三张图片最后的内容合并得到zip压缩包。
解压得到flag.txt,被basexx一系列给加密了,根据提示的十六进制转换成10进制知道了这段编码是经过了:base16,base32,base48,base85,base64 一个个试即可得到flag。
网上有自动化的脚本:

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
43
44
45
46
47
48
49
50
51
#!/usr/bin/env python

import base64
import re

def baseDec(text,type):
if type == 1:
return base64.b16decode(text)
elif type == 2:
return base64.b32decode(text)
elif type == 3:
return base64.b64decode(text)
elif type == 4:
return base64.b85decode(text)
else:
pass

def detect(text):
try:
if re.match("^[0-9A-F=]+$",text.decode()) is not None:
return 1
except:
pass

try:
if re.match("^[A-Z2-7=]+$",text.decode()) is not None:
return 2
except:
pass

try:
if re.match("^[A-Za-z0-9+/=]+$",text.decode()) is not None:
return 3
except:
pass

return 4

def autoDec(text):
while True:
if b"MRCTF{" in text:
print("\n"+text.decode())
break

code = detect(text)
text = baseDec(text,code)

with open("flag.txt",'rb') as f:
flag = f.read()

autoDec(flag)

[UTCTF2020]File Carving

看题目很吓人(文件雕刻233333….),其实题目很简单。
binwalk分离出压缩包 然后运行解压出来的hidden_binary文件。


key不在这里

扫描二维码:

看到m参数的值为:

1
10210897103375566531005253102975053545155505050521025256555254995410298561015151985150375568

看到102的ascii码为:f。所以写个脚本转换一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
s= '10210897103375566531005253102975053545155505050521025256555254995410298561015151985150375568'
i = 0
flag = ''
count = len(s)
while i<=92:
a = s[i:i+3]
if(int(a)<=127):
flag += chr(int(a))
i = i+3
if(int(a)>127):
a = s[i:i+2]
flag += chr(int(a))
i = i+2
print(flag)

[INSHack2018]42.tar.xz

题目是嵌套压缩包,所以直接写个sh脚本进行循环解压:

1
while [ "`find . -type f -name '*.tar.xz' | wc -l`" -gt 0 ]; do find -type f -name "*.tar.xz" -exec tar xf '{}' \; -exec rm -- '{}' \;; done;

[BSidesSF2019]table-tennis54

题目是一个数据包,分析发现大部分都是tcp和tls的数据包。经过分析这些流量,并不能得到有用信息。然后继续整体看这个数据包,发现有少量icmp的包,跟进去看见了html。所以想办法将icmp中的html实体提取出来。可以使用scapy:

1
2
3
4
5
6
from scapy.all import * 
packets = rdpcap('attachment.pcapng')
for packet in packets:
if(packet.haslayer(ICMP)):
if(packet[ICMP].type==0):
print(packet[ICMP].load[-8:])

最后得到:


INSHack2018 so deep

首先将wav文件拖入audacity中,查看频谱图发现前一半的flag。
需要调节频谱的刷新频率才能发现。

然后用DeepSound工具(新知识):
首先需要找到wav隐藏密码,可以将wav的hash值提取出来,然后用john进行破解。
1.找hash值,网上脚本如下:

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env python3
'''
deepsound2john extracts password hashes from audio files containing encrypted
data steganographically embedded by DeepSound (http://jpinsoft.net/deepsound/).
This method is known to work with files created by DeepSound 2.0.
Input files should be in .wav format. Hashes can be recovered from audio files
even after conversion from other formats, e.g.,
ffmpeg -i input output.wav
Usage:
python3 deepsound2john.py carrier.wav > hashes.txt
john hashes.txt
This software is copyright (c) 2018 Ryan Govostes <rgovostes@gmail.com>, and
it is hereby released to the general public under the following terms:
Redistribution and use in source and binary forms, with or without
modification, are permitted.
'''

import logging
import os
import sys
import textwrap


def decode_data_low(buf):
return buf[::2]

def decode_data_normal(buf):
out = bytearray()
for i in range(0, len(buf), 4):
out.append((buf[i] & 15) << 4 | (buf[i + 2] & 15))
return out

def decode_data_high(buf):
out = bytearray()
for i in range(0, len(buf), 8):
out.append((buf[i] & 3) << 6 | (buf[i + 2] & 3) << 4 \
| (buf[i + 4] & 3) << 2 | (buf[i + 6] & 3))
return out


def is_magic(buf):
# This is a more efficient way of testing for the `DSCF` magic header without
# decoding the whole buffer
return (buf[0] & 15) == (68 >> 4) and (buf[2] & 15) == (68 & 15) \
and (buf[4] & 15) == (83 >> 4) and (buf[6] & 15) == (83 & 15) \
and (buf[8] & 15) == (67 >> 4) and (buf[10] & 15) == (67 & 15) \
and (buf[12] & 15) == (70 >> 4) and (buf[14] & 15) == (70 & 15)


def is_wave(buf):
return buf[0:4] == b'RIFF' and buf[8:12] == b'WAVE'


def process_deepsound_file(f):
bname = os.path.basename(f.name)
logger = logging.getLogger(bname)

# Check if it's a .wav file
buf = f.read(12)
if not is_wave(buf):
global convert_warn
logger.error('file not in .wav format')
convert_warn = True
return
f.seek(0, os.SEEK_SET)

# Scan for the marker...
hdrsz = 104
hdr = None

while True:
off = f.tell()
buf = f.read(hdrsz)
if len(buf) < hdrsz: break

if is_magic(buf):
hdr = decode_data_normal(buf)
logger.info('found DeepSound header at offset %i', off)
break

f.seek(-hdrsz + 1, os.SEEK_CUR)

if hdr is None:
logger.warn('does not appear to be a DeepSound file')
return

# Check some header fields
mode = hdr[4]
encrypted = hdr[5]

modes = {2: 'low', 4: 'normal', 8: 'high'}
if mode in modes:
logger.info('data is encoded in %s-quality mode', modes[mode])
else:
logger.error('unexpected data encoding mode %i', modes[mode])
return

if encrypted == 0:
logger.warn('file is not encrypted')
return
elif encrypted != 1:
logger.error('unexpected encryption flag %i', encrypted)
return

sha1 = hdr[6:6+20]
print('%s:$dynamic_1529$%s' % (bname, sha1.hex()))


if __name__ == '__main__':
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', action='store_true')
parser.add_argument('files', nargs='+', metavar='file',
type=argparse.FileType('rb', bufsize=4096))
args = parser.parse_args()

if args.verbose:
logging.basicConfig(level=logging.INFO)
else:
logging.basicConfig(level=logging.WARN)

convert_warn = False

for f in args.files:
process_deepsound_file(f)

if convert_warn:
print(textwrap.dedent('''
---------------------------------------------------------------
Some files were not in .wav format. Try converting them to .wav
and try again. You can use: ffmpeg -i input output.wav
---------------------------------------------------------------
'''.rstrip()), file=sys.stderr)

2.john破解hash

成功找到后一半flag:


很好的色彩呃?

题目是一张gif图片,经过stegsolve查看并没有发现啥;继续用其他方法寻找,无果。看了wp才知道,原来是gif上六种颜色的16进制最低两位的lsb隐写。

用取色器查看到了六种颜色的16进制:

1
2
3
4
5
6
8b8b61
8b8b61
8b8b70
8b8b6a
8b8b65
8b8b73

取低两位,转ascii即为flag。


[INSHack2018]Self Congratulation

打开图片,发现图片左上角有个类似二维码的东西。

黑白相间块的话就按照二维的方式来转化为二进制,白为0,黑为1.

1
2
3
4
5
6
00110001001
10010001100
11001101000
01101010011
01100011011
10011100000

然后二进制转字符:


[QCTF2018]X-man-Keyword73

首先题目给了一张png图片,然后给了keyword。首先想到png lsb加密,直接用脚本跑出来:

打开发现一段密文:

1
PVSF{vVckHejqBOVX9C1c13GFfkHJrjIQeMwf}

然后就没了思路,网上搜了原题,发现有提示:Nihilist 密码
原理如下:

1
2
3
4
5

简单说一下原理
原26个英文字母为ABCDEFGHIJKLMNOPQRSTUVWXYZ
把关键字提前后为LOVEKFCABDGHIJMNPQRSTUWXYZ
在置换后的序列里可以发现对应关系P=Q,V=C,S=T,F=F。。。。。

脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import string

enc='PVSF{vVckHejqBOVX9C1c13GFfkHJrjIQeMwf}'
grid='LOVEKFC'+'ABDGHIJMNPQRSTUWXY'
flag=''

for i in enc:
if i in string.ascii_lowercase:
index=grid.lower().index(i)
flag+=string.ascii_lowercase[index]
continue
if i in string.ascii_uppercase:
index=grid.upper().index(i)
flag+=string.ascii_uppercase[index]
continue
flag+=i
print flag

[学逆向] 简单的隐写

首先题目给了一个png文件和zip压缩包,png文件的文件头是错的,前两位写成了jpg的文件头,用winhex改过来即可;zip有密码可以进行爆破,得到密码为:4567
最后得到一个图片解密网站 http://www.jsons.cn/imghideinfo/,把修改正确的png上传即可得到最后密文:


[学逆向] 111

题目给了txt文件:

1
2
3
从前有个憨憨L   憨憨L呢特别憨   有一天他不知道的从哪弄到了一只兔子 这个兔子整天就会阿巴阿巴  
然后憨憨L不知哪天也魔怔了 就会说我是憨憨然后写下一堆号U2FsdGVkX1+7NwwKnl0EU
VBNmlE= 没人知道他写的是啥

阅读发现端倪,兔子 密文 L
直接使用Rabbit解密:


[学逆向] Ditf

首先一张图片,用pngcheck查看发现crc错误。然后用脚本算出来正确的宽高。

改成正确的宽高,得到一串密文。

然后binwalk分离出rar压缩包,有密码,用上面得到的密文试一试,成功打开。
打开之后发现是流量包,wireshark分析一下,导出http对象:

base64解码得到flag。


[学逆向] 未知流量

题目给了test1,test2两个文件,根据题目说明流量,改成pcap用wireshark分析,发现test1是被tsl加密的,而test2是usb流量,但是分析length最长的流量发现,是ssl加密的流量日志。

保存为key.log,然后在test1中导入日志:

然后搜索:http contains 'flag'


[学逆向] 一步一步

直接ps 打开时间轴,在第744个图片找到flag


[学逆向] 这个人真的很高

打开题目是一张图片,根据题目说明需要改宽高,用脚本算出正确的宽高:

改成正确的宽高,得到一段密文:

然后用zsteg得到另一段密文:

合起来栅栏解密:

再用一次栅栏解密得到flag。


[学逆向] EasysMsc

题目首先给了一张png图片,但是损坏了。使用PCRT进行修复

1
python PCRT.py -v -i EasysMsc.png -o 1.png

成功修复,然后发现这张图片CRC不正确,用脚本算出正确的宽高。

然后继续对原图片进行分析,binwalk分离出来一个压缩包,用上面得到的密码进行解压。
得到linux的root密码的hash,使用john进行破解。

得到最后的flag:flag{hello123}


新bugku [2020]

打开题目:

其中hint.txt,flag.txt被加密了,打开misc1.zip.
发现一种png图片和doc文件,doc文件里的是音乐字符编码,直接用在线网址解密:

得到一段密文:

1
U2FsdGVkX1/eK2855m8HM4cTq8Fquqtm6QDbcUu4F1yQpA==

可以知道这段密文可能所aes或者rabbit加密。
png图片用zsteg得到假的flag:

然后改高度得到一句话:

然后并没有什么用,最后尝试解密。
最后知道了这是rabbit加密,密钥为:2020

得到hint.txt的密码:
最后base64解码,得到flag.txt
flag:

1
flag{g00d_f0r_y0u}

[学逆向] C2nU

1
binwalk -e C@nU.docx

翻一下分离出来的文件,得到flag.zip
有密码,爆破出来:password(没想到是字母的密码,需要准备一个常用字典)
得到png图片的十六进制,然后stegsolve得到flag前一半。
最后的flag:flag{seeme}


[学逆向] 真正的ctfer在哪

题目是一张png图片,用pngcheck查看发现图片高度不对,用脚本算出来正确的高度:

成功改成:

然后用stegsolve查看,发现了flag.


[学逆向] 解不开的秘密

题目给了一个file文件和一个word文件,打开file文件进行hex转txt,再base64解码,最后得到:

1
Windows Registry Editor Version 5.00  [HKEY_CURRENT_USER\Software\RealVNC]  [HKEY_CURRENT_USER\Software\RealVNC\vnclicensewiz] "_AnlClientId"="8f5cc378-2e1d-4670-80e0-d2d81d882561" "_AnlSelected"="0" "_AnlInclRate"="0.0025"  [HKEY_CURRENT_USER\Software\RealVNC\vncserver]  [HKEY_CURRENT_USER\Software\RealVNC\VNCViewer4] "dummy"=""  [HKEY_CURRENT_USER\Software\RealVNC\VNCViewer4\MRU] "00"="127.0.0.1" "Order"=hex:00,01 "01"="127.0.0.1:5900"  [HKEY_CURRENT_USER\Software\RealVNC\WinVNC4] "Password"=hex:37,5e,be,86,70,b3,c6,f3 "SecurityTypes"="VncAuth" "ReverseSecurityTypes"="None" "QueryConnect"=dword:00000000 "PortNumber"=dword:0000170c "LocalHost"=dword:00000000 "IdleTimeout"=dword:00000e10 "HTTPPortNumber"=dword:000016a8 "Hosts"="+," "AcceptKeyEvents"=dword:00000001 "AcceptPointerEvents"=dword:00000001 "AcceptCutText"=dword:00000001 "SendCutText"=dword:00000001 "DisableLocalInputs"=dword:00000000 "DisconnectClients"=dword:00000001 "AlwaysShared"=dword:00000000 "NeverShared"=dword:00000000 "DisconnectAction"="None" "RemoveWallpaper"=dword:00000000 "RemovePattern"=dword:00000000 "DisableEffects"=dword:00000000 "UseHooks"=dword:00000001 "PollConsoleWindows"=dword:00000001 "CompareFB"=dword:00000001 "Protocol3.3"=dword:00000000 "dummy"=""

在其中发现了password,想到16进制转10进制,16进制转ascii,但是无果。
其实这个是注册表的vnc加密,需要用到一个工具:vncx4.exe

1
vncx.exe -W

得到word的密码,然后移走图片,将白色字体改成可见字体:


zip

这个题目考了三个知识点:crc4位爆破压缩包密码+base64字节流写入文件+rar文件格式
题目打开首先是68个压缩包,都需要密码,然后查看各个压缩包的大小,发现只有4个字节,所以可以使用crc4位爆破:

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
import zipfile
import string
import binascii

def CrackCrc(crc):
for i in dic:
for j in dic:
for k in dic:
for h in dic:
s = i + j + k + h
if crc == (binascii.crc32(s.encode())):
f.write(s)
return

def CrackZip():
for i in range(0,68):
file = 'out'+str(i)+'.zip'
crc = zipfile.ZipFile(file,'r').getinfo('data.txt').CRC
CrackCrc(crc)

dic = string.ascii_letters + string.digits + '+/='

f = open('out.txt','w')
CrackZip()
print("CRC32碰撞完成")
f.close

成功得到压缩包里的内容:

1
UmFyIRoHAQAzkrXlCgEFBgAFAQGAgADh7ek5VQIDPLAABKEAIEvsUpGAAwAIZmxhZy50eHQwAQADDx43HyOdLMGWfCE9WEsBZprAJQoBSVlWkJNS9TP5du2kyJ275JzsNo29BnSZCgMC3h

发现是base64,而且是base64字节流写入,脚本如下:

1
2
3
4
5
import base64
string = "UmFyIRoHAQAzkrXlCgEFBgAFAQGAgADh7ek5VQIDPLAABKEAIEvsUpGAAwAIZmxhZy50eHQwAQADDx43HyOdLMGWfCE9WEsBZprAJQoBSVlWkJNS9TP5du2kyJ275JzsNo29BnSZCgMC3h+UFV9p1QEfJkBPPR6MrYwXmsMCMz67DN/k5u1NYw9ga53a83/B/t2G9FkG/IITuR+9gIvr/LEdd1ZRAwUEAA=="
basestring1 = base64.b64decode(string)
with open('out','wb') as file:
file.write(basestring1)

看到是rar文件,将这个rar修复,得到flag,rar文件头如下:


[WUSTCTF2020]girlfriend

题目是个wav文件,听出来是电话音,用dtmf2num直接解题:

1
dtmf2num.exe C:\Users\Diam\Downloads\attachment\girlfriend\girlfriend.wav

然后用键盘密码解密:


[GUET-CTF2019]虚假的压缩包

虚假的压缩包是zip伪加密:

1
2
3
4
5
6
7
8
9
10
11
import libnum
from Crypto.Util.number import long_to_bytes

c = 26
n = 33
e = 3
q = 11
p = 3
d = libnum.invmod(e, (p - 1) * (q - 1))
m = pow(c, d, n)
print m

得到m为5,但是压缩包密码是:答案是5
得到真实压缩包里的东西:

将图片修改高度得到:^5,意思是将文件和5异或,脚本如下:

1
2
3
4
5
original = open("亦真亦假",'r').read()
flag = open("flag",'w')
for i in original:
tmp = int(i,16)^5 #和5异或
flag.write(hex(tmp)[2:])

得到最后的word文件,将word文件修改字体颜色得到最后的flag:


USB

打开题目:

首先看rar文件,打开之后看到png文件坏了,进行修复:将7A改成74:

成功解压png文件,然后用stegsolve成功得到一段密文:

1
ci{v3erf_0tygidv2_fc0}

进行看key.ftm
binwalk分离出来一个流量包,发现是usb键盘流量,用tshark分离:

1
tshark.exe -r G:\CTF题目\WSL环境\_key.ftm.extracted\key.pcap -T fields -e usb.capdata > usbdata.txt

但是由于tshark版本问题,转出来的文件没有”:”

写个脚本转一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
f=open('usbdata (1).txt','r')
fi=open('out.txt','w')
while 1:
a=f.readline().strip()
if a:
if len(a)==16: # 鼠标流量的话len改为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()

然后用usb的脚本跑一下,得到key值,最后才知道是维吉尼亚加密:

最后栅栏解密得到最后的flag。


[SUCTF2018]followme

将流量包导出http对象,用strings查看得到flag:

1
strings * | grep SUCTF{

[MRCTF2020]不眠之夜

题目意思就是要拼图得到flag,可以使用montage+gaps来完成这一操作:

1
2
montage *jpg -tile 10x12 -geometry 200x100+0+0 out.jpg
gaps --image=out.jpg --generations=40 --population=120 --size=100

成功得到flag:


[安洵杯 2019]easy misc

题目给了三个文件:
首先看read文件下有很多txt文件,打开hint.txt发现乱码,更改一下编码,得到提示:前16个字符
再细看这些文件都是有很多字符组成,想到字符频率,但是不知道哪个文件,继续解别的文件。
decode.zip文件中注释提示:

算出来前面的数学公式得到:7。所以应该是7位数字加后面的字符,进行掩码攻击。

成功得到压缩包密码。
根据压缩包里的内容:

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
a = dIW
b = sSD
c = adE
d = jVf
e = QW8
f = SA=
g = jBt
h = 5RE
i = tRQ
j = SPA
k = 8DS
l = XiE
m = S8S
n = MkF
o = T9p
p = PS5
q = E/S
r = -sd
s = SQW
t = obW
u = /WS
v = SD9
w = cw=
x = ASD
y = FTa
z = AE7

正好有16位,所以思路就来了:字符频率取前16位,和上面的密文对照。所以接下来就是要找到是哪个文件的字符频率,通过最后一张png图片。binwalk分离出一模一样的文件,想到了盲水印,成功得到是11.txt
用字频频率脚本跑出前16位:

即:etaonrhsidluygw
得到密文:
QW8obWdIWT9pMkFSQWtRQjVfXiE/WSFTajBtcw==
最后base64->base85成功得到flag。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×