之前做杂项的题比较佛,主要是比赛里面考的大多是脑洞,弯路多,有时候没有hint挺难找到思路,做多了也没什么提升,还是喜欢实打实的脚本题和取证分析。4月25号到五一假期结束那段时间,一口气刷了五页题,实际上考点就那些。小学期搞完了之后,来总结一下知识体系,有些很简单的签到题就一语带过了,用到脚本的题,我会把代码贴上去
追踪TCP流,可以看到这个地方是用POST方式进行登录的,用户名是admina,密码是adminb
拼接起来,再md5加密即得到flag
F5隐写,下载工具F5-steganography,跑出来之后得到out.txt
这个txt文档开头是zip文件的标志PK,另存为out.zip后打开得到flag
实际上这里应该是伪加密,只不过我用的52好压能直接打开hhhhhh
像docx,xls这种文件格式实质上是压缩包,可以把文件拖到winhex里,文件头是PK,即zip,那么我们可以将文件格式改为zip
这个题把文件格式改为zip,解压之后在xl/charts/路径下找到flag
把图片拖入winhex,拖到最下面发现一串base64
解码之后得到
百度搜索一下,麻辣鸡这首歌的名字叫anaconda
另外,刚才在winhex里头看到最后是有PK的文件头,于是分离出来
得到cipher(密文)和key(密钥)文件,猜想这应该是某种加密
把文件拖入winhex中,拉到最下面看到有PK文件头标志,分离出来
压缩包里头有个word文档,扫描里头那个二维码得到flag
文件传输一般是用TCP协议或者FTP协议,我们先追踪TCP流,找到了用FTP协议传输的flag.rar的通信记录
下一个包内容就是压缩包的16进制内容
复制下来,在winhex里面新建一个文件命名为flag.rar
这个压缩包有密码,但是题目中没有任何提示,找遍了也没有hint,只能尝试爆破
输入密码之后解压(用winrar)就得到了flag,说实话这里的爆破挺牵强的
拖到winhex里面分析一下,文本搜索PK,发现在源文件数据区的加密标志是09 00,而目录区是00 00,于是可判定为伪加密
修改之后解压打开,有一个txt文件
这种加密方式叫与佛论禅,找一个在线网站解密
下载下来是个zip,然而却并不能解压,于是放到winhex里面看
明显是个png文件,修改格式之后是个二维码,扫描之后提示是假的flag
在winhex最下面发现flag
追踪TCP流,分析一下可知这是一个通过传图片马上去,然后用菜刀连接的一个过程
追踪TCP流
TCP 流7如下
这里action解码过来如下
z1解码如下
z2的值开头是FF D8 FF E0,即jpg的文件头,复制下来保存为666.jpg
大致的过程是把图片的字节流保存到缓存buf中,然后再通过步长为2的循环写入服务器
TCP 流9如下
这里由解码之后的结果可知,通过木马上传了一个压缩包上去
将这个压缩包的字节流保存为flag.zip
它的密码就是刚刚那张图片上的字符串,输入之后即得flag
跟之前那个题很相似,首先找到通过FTP协议传输的rar格式压缩包的字节流,保存为flag.rar,爆破密码就可以打开得到flag
根据文件名提示爆破四位数密码
解压得到一个图片,将图片拖入winhex中,往下拉找到flag
一ctf题树枝666
下载得到的篮球副本那个文件没有GIF文件头,补充上去就能看到flag了
把图片拖到winhex,往下拉看到一串16进制字符串
复制下来并转换为明文
转换之后发现是一些坐标值
这个时候需要用到画图软件gnuplot,首先需要将这些坐标值转换为它可识别的形式
之后跑脚本就行
扫描二维码得到flag
这个题其他没有任何提示,我根据题目联想到的是图片的宽和高都被修改了
先把图片拖进winhex看看结构
根据图片现有宽高和校验码爆破原有宽高的脚本如下
import struct
import zlib
def hexStr2bytes(s):
b = b""
for i in range(0,len(s),2):
temp = s[i:i+2]
b +=struct.pack("B",int(temp,16))
return b
str1="49484452"
str2="0806000000"
bytes1=hexStr2bytes(str1)
bytes2=hexStr2bytes(str2)
wid,hei = 321,332#0x0141,0x014C
crc32 = "0xC20F1FC6"
for w in range(wid,wid+2000):
for h in range(hei,hei+2000):
width = hex(w)[2:].rjust(8,'0')
height = hex(h)[2:].rjust(8,'0')
bytes_temp=hexStr2bytes(width+height)
if eval(hex(zlib.crc32(bytes1+bytes_temp+bytes2))) == eval(crc32):
print(hex(w),hex(h))
运行结果:宽为0x141,高为0x34C
修改宽高之后得到flag
扫描二维码之后发现是假的flag,丢进winhex里头,在最下面看到一个good/good.mp3文件名,猜测是包含了其他文件
binwalk -e 分离一下,得到4个压缩包
word文档里头的base64多重解码之后结果为
encode.txt文件里的base64解码之后结果为asdfghjkl1234567890
前者可以打开那个带图片的压缩包,后者可以打开那个音频
把音频拖入Audacity分析,发现是摩斯电码,长的为-,短的为.,翻译过来是MORSEISVERYVERYEASY
图片经过多种分析后,我发现并没有什么用,把摩斯电码那个转成小写就是flag了
把gif文件拖入winhex,发现缺少GIF文件头,补充之后把每一帧保存为图片
每张图片上有base64字符串的一部分,连起来解码就行
音频拖到Audacity里面去分析,是摩斯电码,翻译过来就行
用到工具outguess,这里在图片的属性中有一段话
这个是社会主义核心价值观加密,找个解密网站解得 abc
然后跑工具就行
flag.txt里头就是flag
拖入winhex,字符串搜索flag即得
将图片拖入winhex,搜索Rar有结果,说明图片包含了一个二维码,于是用foremost分离出来
得到一个压缩包,爆破密码之后可以打开
里头有一个gif文件,保存所有帧
第310帧是空白的,右下角有一串文字,把这张图单独提出来
拖入winhex里头没什么发现,用stegsolve打开,换通道
扫描二维码得flag
NTFS流隐写——NTFS交换数据流是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流,就是说除了主文件流之外还可以有许多非主文件流寄宿在主文件流中,它使用资源派生来维持与文件相关的信息
使用工具NtfsStreamsEditor可以读取到NTFS流的flag.txt,好像foremost也可以分离出来
摩斯电码,转换之后就是flag
foremost分离得到一个带密码的rar压缩包
其他没有线索了,于是考虑爆破密码
打开压缩包之后发现是一大串无规律的字符,搜索flag也没有结果,考虑字频统计
贴一下末初师傅的脚本
# -*- coding:utf-8 -*-
#Author: mochu7
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_+- =\\{\\}[]"
strings = open('./flag.txt').read()
result = {}
for i in alphabet:
counts = strings.count(i)
i = '{0}'.format(i)
result[i] = counts
res = sorted(result.items(),key=lambda item:item[1],reverse=True)
for data in res:
print(data)
for i in res:
flag = str(i[0])
print(flag[0],end="")
在图片备注里发现盲文
翻译得到
base64隐写的原理如下
解题的脚本如下
import base64
def int2Bin(digit):
return bin(digit)[2:] #将索引转成二进制,去掉'0b';
def binAsc(string): #二进制转成ASCII码
temp = ''
for i in range(int(len(string) / 8)):
temp += chr(int(string[i * 8 : i* 8 + 8] , 2))
return temp
def readBase64FromFile(filename):
Base64Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" #Base64字符集 已按照规范排列
result = ''
with open(filename ,'r') as f:
for data in f.readlines():
if data.find('==') > 0:
result += int2Bin(Base64Char.index(data[-4]))[-4:] #根据隐写原理,‘==’情况取等号前最后一个字符转换后取后4位
elif data.find('=') > 0:
result += int2Bin(Base64Char.index(data[-3]))[-2:] #根据隐写原理,‘=’情况取等号前最后一个字符转换后取后2位
print(binAsc(result))
readBase64FromFile('flag.txt')
Ook!编码,解码即可
用010 Editor打开文档,编码换成EBCDIC,看到压缩包密码
打开压缩包,里头是福尔摩斯跳舞小人密码
对照着解密即可
下载下来的文档里头全是十六进制字符串,复制到winhex之后发现是rar格式的压缩文件,保存
文件属性里头没有密码的提示,考虑爆破密码
打开之后是一个损坏的png文件,拖入winhex查看
文件头同时有jpg和png的,而文件尾是jpg格式的
于是修改文件头,保存为jpg格式
flag就在图片上
CRC32校验错误(可以复制到kali里面,如果提示打不开就基本上可以确定是)
用之前那个爆破脚本爆破原有宽和高
修改之后得到flag
解压失败,拖入winhex分析,看到文件头是错误了,改过来之后解压
打开得到一个word文档,这个意思应该是把文字隐藏了,全选之后取消隐藏文字
得到一串音符
凯撒密码,位移为1
打不开就基本上可以确定是)
用之前那个爆破脚本爆破原有宽和高
[外链图片转存中…(img-YpHzsA4v-1657101580182)]
修改之后得到flag