前言
之前做杂项的题比较佛,主要是比赛里面考的大多是脑洞,弯路多,有时候没有hint挺难找到思路,做多了也没什么提升,还是喜欢实打实的脚本题和取证分析。4月25号到五一假期结束那段时间,一口气刷了五页题,实际上考点就那些。小学期搞完了之后,来总结一下知识体系,有些很简单的签到题就一语带过了,用到脚本的题,我会把代码贴上去
题解
第三页
[sqltest]
导出对象→HTTP
这里攻击者使用的是布尔盲注的方式(爆破数据库信息每一个字符的ASCII值)进行攻击
这一部分是猜解数据库的个数,结果为5(5的ASCII值是53)
这一部分是在猜解数据库的库名长度
这一部分是在逐字符猜解数据库的库名,结果为information_schema,tb_flag等等(数据有点乱,其他的看不太出来)
这一部分是在猜解db_flag库中的表名长度和表名,长度为7,表名为tb_flag
这一部分是在猜解tb_flag表中的列名,为flag
这一部分是在猜解flag列中的字符串长度和字符串各位情况,爆破每一位的数据即得flag
[SWPU2019 你有没有好好看网课?]
下载的压缩包解压之后有两个带密码的压缩包,其中一个根据备注可以爆破密码
爆破之后有一个文档和一个视频,文档里头的关键信息是5.20和7.11
视频用Kinova打开,在这个区间内的5.66s处发现敲击码(我的Kinova出bug了,截不了图)
在7.36s处发现一段base64,解码之后和前一段敲击码连接得到flag2压缩包的密码wllmup_up_up
打开flag2,把图片拖入winhex,拉到最下面得到flag
[SUCTF2018 single dog]
把图片拖入winhex,在最下面发现zip的文件头PK
foremost分离出来得压缩包,解压之后里头一个全是颜文字的txt
这种加密方式叫aaencode,常用于js中
[我吃三明治]
把图片拖入winhex,发现这张图片是由两张图片合成的,在拼接处有一串base32
解码得flag
[ACTF新生赛2020 NTFS数据流]
下载得到500个txt文件,看了前面几个都说是flag is not here
于是按大小排序
序号为293的txt内容最多,根据提示是NTFS流隐写
使用工具NtfsStreamsEditor
[john-in-the-middle]
这个流量包里面传输的HTTP对象比较多,于是全部导出
发现logo.png上面有一条裂缝
用stegsolve打开scanlines.png时发现一条黑线
使用Image Combiner功能将两张图进行对比
[喵喵喵]
zsteg分析图片
发现在一个通道下隐写了一个文件
用stegsolve打开
保存为png格式的图片,发现打不开,拖进winhex里头修改16进制数值
修改文件头之后可以看到是半张二维码
于是猜测可能宽高被修改,用脚本爆破
修改宽高之后扫描二维码得到一个地址
下载下来解压之后的文档内容和上上个题类似
追踪NTFS得到Python的一个编译文件,反编译之后得到代码
#!/usr/bin/env python
# visit http://tool.lu/pyc/ for more information
import base64
def encode():
flag = '*************'
ciphertext = []
for i in range(len(flag)):
s = chr(i ^ ord(flag[i]))
if i % 2 == 0:
s = ord(s) + 10
else:
s = ord(s) - 10
ciphertext.append(str(s))
return ciphertext[::-1]
ciphertext = [
'96',
'65',
'93',
'123',
'91',
'97',
'22',
'93',
'70',
'102',
'94',
'132',
'46',
'112',
'64',
'97',
'88',
'80',
'82',
'137',
'90',
'109',
'99',
'112']
解密脚本如下:
ciphertext = [
'96',
'65',
'93',
'123',
'91',
'97',
'22',
'93',
'70',
'102',
'94',
'132',
'46',
'112',
'64',
'97',
'88',
'80',
'82',
'137',
'90',
'109',
'99',
'112']
flag = ""
for i in range(len(ciphertext)):
s = int(ciphertext[23-i])
if i % 2 == 0:
s = s - 10
else:
s = s + 10
print(s)
char = chr(i ^ s)
flag = flag + str(char)
print(flag)
[Mysterious]
32位exe文件,打开后是一个对话框,输入小于6位的字符串之后点crack没有反应,大于6位的字符串直接闪退
用IDA反编译
可以看到调用了DialogBoxParam函数,即对话框的操作
点进去看,到sub_401090这个函数里头
可知这个函数的功能是读取用户输入的字符串,判断是否满足条件则输出flag
首先字符串长度必须为6,若大于6则直接退出,而输出flag的条件是整型的v10=123,字符型的v12=‘x’,v13=‘y’,v14=‘z’
而v10是将用户输入字符串转换为整型后+1得到的
查看堆栈中变量的情况
可知输入的字符串为6位,对应的字符串即为str(v10-1)+v12+v13+v14
输入122xyz得到flag
[ACTF新生赛2020 swp]
包很多,直接导出HTTP对象,这里有一个比较可疑的secrets.zip
解压这个压缩包,得到一个flag.swp文件,不用复制到linux里面去运行,直接拖到winhex里面往下拉就能找到flag
[GXYCTF2019 SXMgdGhpcyBiYXNlPw==]
题目中base64字符串解码的结果为Is this base?
猜测base64隐写,直接跑脚本即可
[弱口令]
用winrar打开压缩包,在注释里有一段隐藏的字符串
复制到sublimetext里面全选
这里是摩斯电码,翻译过来之后是HELL0FORUM,这个就是压缩包的密码
这个图片不是常规的lsb隐写,需要用到脚本cloacked-pixel
根据题目,弱口令猜测为123456
跑脚本得到flag
python lsb.py extract 女神.png flag.txt 123456
[间谍启示录]
foremost分离这个iso文件,在rar里面有一个flag.exe,拖到windows里面运行即得flag(注意在文件夹里面选择查看隐藏项目)
[RoarCTF2019 黄金6年]
视频拖到Kinova里面逐帧查看
挨个扫码得到字符串iwantplayctf
把视频拖入winhex,拉到最下面看到一串字符串
可以看到这个是一个rar压缩包,保存下来,用刚才那个字符串解压缩得到flag
[小易的U盘]
解压iso文件,autorun.inf中的内容如下
运行对应的exe文件,发现报错,于是拖到ida里面分析
flag就在这里,大概的意思是创建一个txt文件,把flag写入
[zip]
这个压缩包里面有很多小压缩包,但都不是伪加密,也不能用无格式文本爆破
由于每个压缩包中包含的文件大小都是4字节,可以考虑通过CRC32爆破获得其中的值
脚本如下(路径因人而异):
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 = './3/out'+str(i)+'.zip'
crc = zipfile.ZipFile(file,'r').getinfo('data.txt').CRC
CrackCrc(crc)
dic = string.ascii_letters + string.digits + '+/='
f = open('./3/out.txt','w')
CrackZip()
print("CRC32碰撞完成")
f.close()
C4 3D 7B 00 40 07 00是rar文件的结尾,于是加上文件头之后便可以得到压缩包
在注释中可以看到flag
[安洵杯 2019 吹着贝斯扫二维码]
下载的压缩包里头有很多无格式的文件,拖到winhex里面发现文件头是FF D8 FF E0,即jpg格式,于是全部重命名,脚本参考:
import os
class BatchRename():
def rename(self):
path = "文件路径"
filelist = os.listdir(path)
total_num = len(filelist)
i = 0
for item in filelist:
if item.endswith('.png'):
src = os.path.join(os.path.abspath(path), item)
dst = os.path.join(os.path.abspath(path), ''+str(i)+'.jpg')
try:
os.rename(src, dst)
i += 1
except:
continue
print('total %d to rename & converted %d png'%(total_num, i))
if __name__=='__main__':
demo = BatchRename()
demo.rename()
————————————————
版权声明:本文为CSDN博主「全部梭哈一夜暴富」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/AI_girl/article/details/124143162
将图片拖入winhex中,拉到最下,看到末尾有一个数字,每个图片的数字都不一样,这个应该就是图片序号
于是写脚本读取文件的最后两个字节,将其作为文件名重命名文件
import os
from PIL import Image
#目录路径
dir_name = r"./"
#获取目录下文件名列表
dir_list = os.listdir('./')
#print(dir_list)
#从列表中依次读取文件
for file in dir_list:
if '.jpg' in file:
f=open(file ,'rb')
n1 = str(f.read())
n2 = n1[-3:]
#经过测试发现这里要读取最后3个字节,因为最后还有一个多余的字节,不知道是不是转字符串的原因导致在末尾多了一个字符
#print(file) #输出文件内容
#print(n2)
f.close() #先关闭文件才能重命名,否则会报`文件被占用`错误
os.rename(file,n2+'.jpg') #重命名文件
根据图片的序号,用PS拼接到一起,得到一张二维码
扫描结果为
BASE Family Bucket ???
85->64->85->13->16->32
回到flag.zip,用winrar打开看到注释中有一串base
于是按照顺序反向解码,13指的是rot13
[UTCTF2020 docx]
修改文档的格式为zip,解压之后在word/media路径下找到写有flag的图片
[WUSTCTF2020 alison_likes_jojo]
解压得到两张图片,把boki.jpg拖到winhex里面,在最下面发现zip文件头,于是foremost分离出来
得到一个有密码的压缩包
尝试爆破
解压得到一串base64
WVRKc2MySkhWbmxqV0Zac1dsYzBQUT09,三次解码后得到字符串killerqueen
jljy.jpg是outguess隐写,跑脚本
[WUSTCTF2020 爬]
文件最开始没有格式,拖入winhex查看,文件头是PDF,于是修改后缀
在WPS图片里面把这个图片删除,看到一串16进制
转成字符串得flag
[GUET-CTF2019 zips]
对于222.zip,没有其他的hint,考虑对其进行爆破(6位数字)
之后得到111.zip,拖入winhex查看,发现是由flag.zip和setup.sh拼接而成,前者未加密
发现setup.sh是伪加密,修改加密位之后可以解压打开
是将时间戳作为了flag.zip的密码,于是根据创建这个文件的时间换算成时间戳
密码的格式如下,10位整数+2位小数
于是进行掩码爆破
解压得到flag
[从娃娃抓起]
题目提示如下:
盲猜是在南海画圈的老人说过的话
前一段是中文电码,后一段是五笔编码
[DDCTF2018 (╯°□°)╯︵ ┻━┻]
先将d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9b2b2e1e2b9b9b7b4e1b4b7e3e4b3b2b2e3e6b4b3e2b5b0b6b1b0e6e1e5e1b5fd
转换成16进制数表示的形式,即每两位之前加一个0x,接着每个数减去0x80,最后转ASCII得到flag
我也不知道为什么要减去0x80,有一点点小脑洞
[MRCTF2020 千层套路]
可以先尝试爆破,发现每个压缩包的密码都是其名字,于是写脚本循环解压
import zipfile
path = r"C://Users//hp//Desktop//attachment"
file = r"//0573.zip//0573.zip"
while len(file) != 4:
pwd = file[2:6]
print(pwd)
zip_file = zipfile.ZipFile(path+file)
zip_list = zip_file.namelist()
for i in zip_list:
zip_file.extractall(i, pwd=pwd.encode("utf-8"))
file = "//"+zip_list[0]+"//"+zip_list[0]
zip_file.close()
运行到最后可以得到一个写满RGB信息的txt文件qr.txt
写脚本
from PIL import Image
file = open('qr.txt')
MAX = 200
picture = Image.new("RGB", (MAX, MAX))
for y in range(MAX):
for x in range(MAX):
string = file.readline()
picture.putpixel([x, y], eval(string)) # 直接使用eval()可以转为元组
picture.show()
扫描二维码即可得flag
[WUSTCTF2020 girlfriend]
这个音频听起来像电话的拨号音
使用工具dtmf2num来识别
得到的结果是手机键盘密码,即使用9键时的输入结果
为youaremygirlfriends
[百里挑一]
这个里头传输的图片很多,于是全部导出为HTTP对象,大致看了一遍也没有发现特殊的图片
于是用Exiftool工具(类似于查找图片的备注等信息)
找到一半,另一半在流114里面,说实话这个挺坑的
[XMAN2018排位赛 通行证]
base64→栅栏→凯撒
[安洵杯2019 Attack]
搜索字符串flag,定位到一个TCP流
base64解码上面的字符串,大致意思是上传下面这个压缩包
可以用foremost分离出来,得到带密码的压缩包
提示为管理员的秘密,回到流量包里面导出HTTP对象
发现一个dmp文件(在windows系统出现蓝屏等问题时会自动将错误的堆栈信息、用户名密码等保存在dmp文件中)
使用mimikatz工具来分析(以管理员身份运行)
用这个密码解压压缩包即可得flag
[SUCTF2018 followme]
直接搜索字符串ctf
[MRCTF2020 CyberPunk]
不用逆向,直接把系统时间改成2020年9月17日就可以了
[SUCTF2019 Game]
在src的index.html发现一串"flag",base32解码之后得到fake flag
将图片用stegsolve打开,发现lsb隐写了
解码一下
头部是Salted,于是加密方式应该是AES或3DES,密钥是刚才那个fake flag
[USB]
把key.ftm拖入winhex,发现zip的文件头
foremost分离一下,解压得到key.pcap,里面是USB数据包
使用工具UsbKeyboardDataHacker提取内容
key{xinan}
对于233.rar,其大小有1581kb,然而能解压出来的只有一个1kb的txt文件,拖入winhex分析
发现还有一个文件233.png,猜测是校验错误导致解压不出来
RAR文件结构参考:
于是在刚才这个rar文件中
0x16这个位置上的块类型应该为0x74,修改之后可以正常解压
将233.png用stegsolve打开,在Blue plane0通道下看到二维码
扫描二维码得到ci{v3erf_0tygidv2_fc0}
根据最开始得到的key{xinan},猜测是维吉尼亚密码
最后是栅栏密码
[UTCTF2020 file header]
拖入winhex,发现缺少png的文件头
补上去就可以看到flag了