basectf
misc
哇!珍德食泥鸭(word xml 隐写)

题目是一个动图

binwalk 可以解压出很多东西


通过打开文件发现里面的 doucment.xml 知道这个压缩包是 docx 文件,改名后进去发现
这个图片其实没什么,我们可以发现这个文档特别长,但是往下拉啥都没有,这时候可以全选然后点击清除格式,拉到最后发现 flag

Base

cyberchef 一把梭

Base revenge(base64 隐写 Atbash 编码)

发现是 base64,但是 base64 后没发现任何有价值的信息,只是一段长文本。

扔进翻译软件看了一下没有什么有价值的信息,这时候可以联想到还要个 base 隐写
用脚本跑了一下。

同时下面有个 hint

根据这个 hint 发现这个 hint 是个 Atbash 编码

于是我们可以先对 base 隐写的出来的先 Atbash 解码,再 base64 解码得到 flag

Base?!
随波逐流直接得到

Pickle Init(还没做)(Pickle 反序列化)
Pickle 反序列化 - 枫の Blog (goodapple.top)
和后面 Pickle xxx 都是一类题目,但是文章太长了,抽时间再学一下(
根本进不去啊!

先了解一下 DNS 解析的过程,再了解 dig 命令
DNS 自述:我是如何为域名找到家的 - 陈树义 - 博客园 (cnblogs.com)
dig 命令:帮你记录 DNS 寻址全过程 - 陈树义 - 博客园 (cnblogs.com)

倒计时?海报!
靠,眼瞎了都没看出来
海上遇到了鲨鱼(追踪 http 流)

正着看还是反着看呢?(反转二进制数据,文件隐藏)

用 010 打开,像是 JPG 文件逆过来了,于是用 CyberChef 逆过来

注意是按照字节来逆

保存下来图片

再放到 010 里看,利用模板功能发现有个未知的 padding,根据 PK 可以看出是个压缩包

然后我们再用 binwalk 或 foremost 分离出来,解压这个压缩包,得到 flag

人生苦短,我用 python(直接看 python)
直接拿官方的 wp 了(欸嘿)
题目:
import base64
import hashlib
def abort(id):
print('You failed test %d. Try again!' % id)
exit(1)
print('Hello, Python!')
flag = input('Enter your flag: ')
if len(flag) != 38:
abort(1)
if not flag.startswith('BaseCTF{'):
abort(2)
if flag.find('Mp') != 10: #Mp第一次出现的位置在10位
abort(3)
if flag[-3:] * 8 != '3x}3x}3x}3x}3x}3x}3x}3x}': #flag的后三位是3x}
abort(4)
if ord(flag[-1]) != 125: #flag最后一个字符的ASCII码是125,也就是}
abort(5)
if flag.count('_') // 2 != 2: #flag中_的数量整除2以后结果为2,也就是4个
abort(6)
if list(map(len, flag.split('_'))) != [14, 2, 6, 4, 8]:#flag按照_分隔后长度依次为14,2,6,4,8
abort(7)
if flag[12:32:4] != 'lsT_n':
abort(8)
if '😺'.join([c.upper() for c in flag[:9]]) != 'B😺A😺S😺E😺C😺T😺F😺{😺S':
abort(9)
if not flag[-11].isnumeric() or int(flag[-11]) ** 5 != 1024:
abort(10)
if base64.b64encode(flag[-7:-3].encode()) != b'MG1QbA==':
abort(11)
if flag[::-7].encode().hex() != '7d4372733173':
abort(12)
if set(flag[12::11]) != {'l', 'r'}:
abort(13)
if flag[21:27].encode() != bytes([116, 51, 114, 95, 84, 104]):
abort(14)
if sum(ord(c) * 2024_08_15 ** idx for idx, c in enumerate(flag[17:20])) != 41378751114180610:
abort(15)
if not all([flag[0].isalpha(), flag[8].islower(), flag[13].isdigit()]):
abort(16)
if '{whats} {up}'.format(whats=flag[13], up=flag[15]).replace('3', 'bro') != 'bro 1':
abort(17)
if hashlib.sha1(flag.encode()).hexdigest() != 'e40075055f34f88993f47efb3429bd0e44a7f479':
abort(18)
print('🎉 You are right!')
import this
这个程序是一个简单的 CTF(Capture The Flag)挑战,要求用户输入一个特定格式的字符串(称为 flag)。程序通过一系列检查来验证输入的 flag 是否符合预期的格式和内容。如果任何一个检查失败,程序会调用
abort函数,输出错误信息并退出程序。以下是程序的详细解释:
导入模块
定义**
abort**函数打印欢迎信息并获取用户输入
一系列检查
检查 flag 长度是否为 38
检查 flag 是否以
BaseCTF{开头检查 flag 的下标为 10 和 11 的字符是否为
Mp(下标是从 0 开始的)检查 flag 的最后三个字符是否为
3x}并重复 8 次至此可得
BaseCTF{**Mp***********************3x}检查 flag 的最后一个字符的 ASCII 值是否为 125(即
})检查 flag 中
_字符的数量是否为 4检查 flag 按
_分割后的每部分长度是否为[14, 2, 6, 4, 8]检查 flag 的第 13 到 32 个字符,每隔 4 个字符是否为
lsT_n(Python 用左闭右开区间)至此可得
BaseCTF{**Mpl*_*s_**T***_***n_*****3x}检查 flag 前 9 个字符的大写形式用
😺连接是否为B😺A😺S😺E😺C😺T😺F😺{😺S检查 flag 倒数第 11 个字符是否为数字且其五次方是否为 1024(如果不是数字,整个表达式一定为假,就不会转为整数计算了,这叫“逻辑短路”;Python 中**
\****是乘方,**^**是异或)检查 flag 倒数第 7 到第 3 个字符的 Base64 编码是否为
MG1QbA==至此可得
BaseCTF{**Mpl*_*s_**T***_**4n_*0mPl3x}检查 flag 每隔 7 个字符倒序后的十六进制编码是否为
7d4372733173(开个新文件试一下flag = 'abcdefghijklmnopq'; print(flag[::-7])就知道是最后一个字符,倒数第 8 个字符,……)至此可得
BaseCTF{*1Mpl*_*s_**T**r_**4n_C0mPl3x}检查 flag 从第 13 个字符开始每隔 11 个字符是否为
l或r检查 flag 的第 22 到 27 个字符的 ASCII 编码是否为[116, 51, 114, 95, 84, 104](Python3 中字符串 str(可以用 Unicode 表示的)和字节串 bytes(一列取值是 0~255 的整数)是不一样的,但可以转化)
至此可得
BaseCTF{*1Mpl*_*s_**Tt3r_Th4n_C0mPl3x}检查 flag 的第 18 个字符的 ASCII 值乘以 20240815 的 0 次方,第 19 个字符的 ASCII 值乘以 20240815 的 1 次方,第 20 个字符的 ASCII 值乘以 20240815 的 2 次方,加起来是否为 41378751114180610(Python 很适合大数运算)(虽然你可以爆破,但是这里可以写逆运算的,用除以 20240815 的商和余数)
至此可得
BaseCTF{*1Mpl*_*s_BeTt3r_Th4n_C0mPl3x}检查 flag 的第 1 个字符是否为字母,第 9 个字符是否为小写字母,第 14 个字符是否为数字(结合上面
😺那步)检查
{whats} {up}格式化后的字符串是否为bro 1至此可得
BaseCTF{s1Mpl3_1s_BeTt3r_Th4n_C0mPl3x}检查 flag 的 SHA1 哈希值是否为
e40075055f34f88993f47efb3429bd0e44a7f479如果所有检查通过,打印成功信息
导入**
this**模块,输出 Python 之禅这个程序通过一系列复杂的检查来验证用户输入的 flag 是否符合预期的格式和内容。如果所有检查都通过,用户将看到成功信息并输出 Python 之禅。
你也喜欢圣物吗(伪加密)
老婆!!!

题目给了这俩,那个压缩包

查看压缩包的 ftFlags,不是伪加密
另一张我和我老婆的图片有个 RGB 的 LSB 隐写

用这个 key 打开压缩包,发现一个 fack.zip,根据提示猜测这是伪加密,把 FrFlags 改成偶数看看能不能解


如果使用 Bandizip 等软件可以直接解压了,使用 7zip 等软件则会报错并得到乱码。一般格式正确的压缩包不会出现这种问题,出现这种问题说明格式还有不正确的地方。观察 7zip 给出的信息可以发现问题:

明显这个文件已被压缩,但是出题人把“压缩方式”字段改成了 STORED (0) 表示仅存储,我们改回 DEFLATE (8) 表示已压缩,然后就可以用压缩软件正常解压了。

最后这里如果是第一个进行解码发现是错的,真正的答案 txt 文件的最下面


二维码 1-街头小广告(二维码重定向)

一张图片,拖进 ps 里修补一下


用微信直接扫发现是空白的,这里是这个二维码的网址重定向导致进入了一个无用的网站,用 QR Research 可以只查看二维码的信息而不用进入网址

得到 flag
反方向的雪(分离文件,反转二进制数据,SNOW 隐写)

得到一张图片

用 010 打开可以发现最后有一个 unknow padding,看到 KP 可以发现是一个逆序的压缩包

新建一个文件,把这个填充进去,然后逆序一下得到压缩包

然后用 010 打开这个压缩包,发现 The_key_is_n0secr3t 字样,用这个打不开压缩包.


题目提示密码是 6 位,于是就爆破得到密码

发现 flag 文件,打开


但是如果全选会发现端倪,结合题目,猜测是 SNOW 隐写,再加上前面得到的 key,可以得到 flag


黑丝上的 flag(修改 Aplha(透明度)通道后两位)
题目是一个图片(黑丝肉腿,prprprprprprpr)

用 StegSolve 查看可以看到 Alpha plane 0 和 Alpha plane 1 分别有 flag 痕迹


最后,请以后多出这种题,孩子爱做(prprprprpr)

海上又遇了鲨鱼(追踪 TCP,压缩包)


追踪一下 TCP 流,发现基本上都是攻击者尝试登录 FTP 服务器的流量包

在第 16 个流里面发现异常,攻击者成功登录进去,并且列出来 FTP 服务器的文件,下载了 flag.zip 文件

FTP 命令 LIST 的响应,向客户端展示当前目录下有哪些文件

客户端通过 RETR 命令下载 flag.zip 文件时,FTP 服务器传输的文件名部分提示客户端即将开始接收文件内容

实际 flag.zip 文件的内容

选择显示为原始数据,并且另存为 zip 文件,结合压缩包 ASCII 码的题目,这个压缩包需要 password,结合前面登录的情景,猜测密码是 FTP 服务器的密码

输入密码,打开压缩包,得到 flag

前辈什么的最喜欢了(图片 base64encode,修复宽高)

得到一个 txt 文件,由 data:image/png;base64 猜测,这是个被 base64 的图片


然后再扔进随波逐流一下, 修复宽高直接出

broken.mp4(修复 mp4 文件)

给了一个破损的 mp4 一个完整的 mp4,这两个是同源的,可以用工具借助完整的 mp4 修复破损的 mp4 文件



看视频就可以得到 flag

这是一个压缩包(python脚本解压)

注释里发现线索

base64一下

可以看到是对称的,所以我们猜测压缩包密码就是这个
import zipfile
zfile=zipfile.ZipFile("这是一个压缩包.zip",'r')
for i in range(33,128):
for j in range(33,128):
for k in range(33,128):
mask="BaseCTF"+chr(i)+chr(j)+chr(k)+chr(k)+chr(j)+chr(i)+"FTCesaB"
try:
zfile.extractall(pwd=mask.encode('utf-8'))
print(mask)
exit()
except:
pass
得到密码为BaseCTF_h11h_FTCesaB
纯鹿人

得到一个docx

把图片拿出来全选一下会看到端倪

得到base64


然后把docx变成zip,解压拿到里面的图片

010里可以看到端倪

binwalk出来得到压缩包,输入密码得到flag


浙公网安备 33010602011771号