[羊城杯 2020]signin
看了wp才知道是toycrypto。这个真的不知道。
根据提示,一表人才,二表倒立,我估计有用的信息就是二表倒立。
关键就在于这个表:

首先进行替换再说。
出来了LDVUUCMEXMLQSSFUSXKEOCCG
二表倒立,综合来看就是ACEG本来指向M,现在指向了Y,以此类推,就是从左到右从上到下翻了个顺序。
出来了GWHTTOYSAYGREENTEAISCOOL,除去羊城杯的flag头即可。
以下是完整脚本:
mydict = {
'ACEG': 'M',
'ADEG': 'R',
'BCEG': 'K',
'BDEG': 'S',
'ACEH': 'A',
'ADEH': 'B',
'BCEH': 'L',
'BDEH': 'U',
'ACEI': 'D',
'ADEI': 'C',
'BCEI': 'N',
'BDEI': 'V',
'ACFG': 'H',
'ADFG': 'F',
'BCFG': 'O',
'BDFG': 'W',
'ACFH': 'T',
'ADFH': 'G',
'BCFH': 'P',
'BDFH': 'X',
'ACFI': 'E',
'ADFI': 'I',
'BCFI': 'Q',
'BDFI': 'Y'
}
cipher = 'BCEHACEIBDEIBDEHBDEHADEIACEGACFIBDFHACEGBCEHBCFIBDEGBDEGADFGBDEHBDEGBDFHBCEGACFIBCFGADEIADEIADFH'
original_flag = ''
for i in range(0, len(cipher), 4):
key = cipher[i:i+4]
original_flag += mydict.get(key, '')
print('替换后:'+original_flag)
new=['M','R','K','S','A','B','L','U','D','C','N','V','H','F','O','W','T','G','P','X','E','I','Q','Y']
reversed_new=new[::-1]
true_new={new[i]: reversed_new[i] for i in range(len(new)) }
flag=''.join([true_new[char] for char in original_flag])
print('flag:'+flag)
顺便通过这个学了下字典和列表推导式,嘻嘻。
[NPUCTF2020]碰上彩虹,吃定彩虹!
附件首先给了一个hint.txt,里面是零宽隐写,先不着急看,先看看其他文件。
看了还是没有头绪,还是得看提示。
看了零宽说是:do u know NTFS?
所以猜测应该是哪里有NTFS数据流。果然发现一个

进去之后杂乱无章,看WP才知道你需要词频分析。

解出来是加密的意思。搜索得知实际上是一个加密软件。加密后的格式恰好是crypto。
需要先更换后缀

看来是需要密码了,恰好还有一个txt没有看。

进去全选才知道有隐藏信息。后面是摩斯密码,翻译得到:

这里了解到breakautokey.py,直接爆破即可。出来了结果:
解密之后还需要注意一点,这个文件也被做过手脚,需要删除一行多余字母。
他妈的藏在这里,不看WP根本都找不到,删除了再解密。

出来了一张图片。里面隐藏的有压缩包,压缩包真的被加密了。
我考虑的其实是爆破,所以先试试。其实没有出来,暴力破解得搞一小时多至少。
看WP才知道黄色的颜色不一样,用PS看RGB数据。这里黄色吸管不要吸偏,我吸偏了导致最后一个字母变成了e
color=['ffff70','ffff40','ffff73','ffff73','ffff57','ffff64']
flag=''
for i in color:
char = chr(int(i[-2:],16))
flag+=char
print(flag)
然后咱们解压文档。注意看大写字母提示ALPHUCK

看样子是类似于brainfuck。总算出来了。

只能说这个SB题目,唉。
[NewStarCTF 公开赛赛道]奇怪的二维码
二维码缺少很多信息,想办法进行补充。binwalk隐藏了个看似不相关的png,俩png无法进行组合。

图片上说阿兹特克,搜一下原来是阿兹特克码,补全一下就可以识别了。

这一题确实有意思
[DASCTF X GFCTF 2022十月挑战赛!]滴滴图
里面有一个压缩包,和图片,图片也隐藏有压缩包,二者均被加密
先怀疑是LSB隐写。发现并不是。
看WP
DASCTF X GFCTF 2022十月挑战赛 WriteUp_dasctfxcbctf无畏者先行-CSDN博客
还是不要小看010,用010看结尾有unicode编码,解码:this_is_paSS
这就是密码了。

修改宽高,将这个this_is_not_PASSWORD输进去试试。果然是密码,这个SB套路还无法影响到我。
分离左右声道,分别识别音频即可。除了乱码就是这个十六进制。转换就行了。

74 6F 5F 62 65 5F 63 74 66 65 72
DASCTF Oct X 吉林工师 欢迎来到魔法世界~]giveyourflag
给的这个没有后缀的实际上是ZIP。里面仍然是一个zip,怀疑是反复解压
豆包搞了个脚本,解压出来即可,还真的不少
注意出来的文本base64之后还得凯撒一下,不过真的打的时候肯定就知道了。
import os
import zipfile
import tempfile
from pathlib import Path
import shutil
def is_zip_file(file_path):
"""通过文件内容(魔术数字)判断是否为ZIP文件"""
ZIP_MAGIC_NUMBERS = b'\x50\x4B\x03\x04'
try:
with open(file_path, 'rb') as f:
header = f.read(4)
return header == ZIP_MAGIC_NUMBERS
except Exception:
return False
def extract_nested_zips(initial_zip_path, output_dir):
"""
迭代解压嵌套的ZIP文件(修复临时文件找不到问题)
参数:
initial_zip_path (str): 初始ZIP文件的路径
output_dir (str): 最终文件的输出目录
"""
os.makedirs(output_dir, exist_ok=True)
# 创建一个持久的临时目录,而不是每次迭代都创建新的
with tempfile.TemporaryDirectory() as base_temp_dir:
# 复制初始ZIP文件到临时目录,确保文件可用性
initial_zip_name = os.path.basename(initial_zip_path)
temp_initial_zip = os.path.join(base_temp_dir, initial_zip_name)
shutil.copy2(initial_zip_path, temp_initial_zip)
# 栈存储需要处理的ZIP文件:(zip文件路径, 相对路径)
zip_stack = [(temp_initial_zip, "")]
while zip_stack:
current_zip_path, relative_path = zip_stack.pop()
# 为当前ZIP创建一个子临时目录
current_temp_dir = tempfile.mkdtemp(dir=base_temp_dir)
try:
# 解压当前ZIP文件
with zipfile.ZipFile(current_zip_path, 'r') as zip_ref:
zip_ref.extractall(current_temp_dir)
print(f"解压: {os.path.basename(current_zip_path)}")
# 处理解压后的内容
for item in Path(current_temp_dir).rglob('*'):
if item.is_file():
# 复制文件到一个安全的位置,避免临时目录被清理
temp_item_path = os.path.join(base_temp_dir, item.name)
shutil.copy2(item, temp_item_path)
if is_zip_file(temp_item_path):
# 是ZIP文件,加入处理栈
item_relative_path = os.path.join(relative_path,
item.relative_to(current_temp_dir).parent.as_posix())
zip_stack.append((temp_item_path, item_relative_path))
print(f"发现嵌套ZIP: {item.name},将在后续处理")
else:
# 不是ZIP文件,复制到输出目录
item_rel_path = item.relative_to(current_temp_dir)
full_relative_path = os.path.join(relative_path, item_rel_path.as_posix())
target_path = Path(output_dir) / full_relative_path
os.makedirs(target_path.parent, exist_ok=True)
shutil.copy2(item, target_path)
print(f"提取文件: {full_relative_path}")
except zipfile.BadZipFile:
print(f"警告: {os.path.basename(current_zip_path)} 不是有效的ZIP文件,已跳过")
except Exception as e:
print(f"处理 {os.path.basename(current_zip_path)} 时出错: {str(e)}")
finally:
# 清理当前ZIP的临时目录
if os.path.exists(current_temp_dir):
shutil.rmtree(current_temp_dir, ignore_errors=True)
# 删除已处理的ZIP文件,释放空间
if os.path.exists(current_zip_path) and current_zip_path != temp_initial_zip:
try:
os.remove(current_zip_path)
except Exception as e:
print(f"无法删除 {os.path.basename(current_zip_path)}: {str(e)}")
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description='修复临时文件问题的嵌套ZIP解压工具')
parser.add_argument('zip_file', help='要解压的ZIP文件路径')
parser.add_argument('-o', '--output', help='输出目录路径', default='extracted_files')
args = parser.parse_args()
if not os.path.isfile(args.zip_file):
print(f"错误: 文件 '{args.zip_file}' 不存在")
exit(1)
if not is_zip_file(args.zip_file):
print(f"错误: '{args.zip_file}' 不是ZIP文件(通过内容判断)")
exit(1)
print(f"开始解压嵌套ZIP文件: {args.zip_file}")
extract_nested_zips(args.zip_file, args.output)
print(f"所有文件已成功解压到: {os.path.abspath(args.output)}")

[DASCTF Oct X 吉林工师 欢迎来到魔法世界~]卡比卡比卡比
内存取证!
不太会呀,先搁置一旁
&spm=1001.2101.3001.5002&articleId=151328939&d=1&t=3&u=11301c1339734d23b0824e260b9546fb)
991

被折叠的 条评论
为什么被折叠?



