[GUET-CTF2019]zips 1
第一个压缩包使用使用:ARCHPR爆破
获得密码为:723456,得到111.zip,然后使用010Editor发现伪加密,进行修改
解压111.zip得到flag.zip和setup.sh,这里使用记事本打开setup.sh
#!/bin/bash
#
zip -e --password=`python -c "print(__import__('time').time())"` flag.zip flag
1.#!/bin/bash: 这是一个Shebang行,指定了该脚本应使用/bin/bash解释器执行。它是Unix/Linux系统中可执行脚本的标准起始行。
2.zip -e --password=: 这部分命令调用了zip程序来创建或更新一个ZIP归档文件,并使用-e选项指明需要对存档中的文件进行加密。
3.python -c "print(__import__('time').time())": 这里嵌入了一个Python命令,用于执行一段Python代码。具体来说,它导入了time模块,并调用其time()函数来获取当前的Unix时间戳。这个时间值将作为接下来操作的密码。
4.flag.zip flag: 表示要创建或更新的ZIP文件名为flag.zip,并且要将当前目录下的一个名为flag的文件添加到此ZIP文件中。由于前面设置了-e和--password,所以在添加过程中会对flag文件进行加密,并使用由Python计算出的时间戳作为加密密码。
这里的时间戳使用不同版本的python结果不一样,看了大佬的WP使用python2,根据时间戳,进行爆破
这里的密码为:1558080832.15
这里成功获取了flag
总结:此题目主要考察
- 密码爆破
- 伪加密
- python代码调试
zip 1
总结:
- crc批量爆破脚本使用
- Base64编码转文件使用
- RAR文件头尾敏感
下载题目解压发现一堆有序压缩包,这里首先想到用弱口令爆破看看怎么,发现爆破不了
这里看了大佬的wp发现是crc爆破,这里使用脚本
#python3
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)
print('\r'+"loading:{:%}".format(float((i+1)/68)),end='')
dic = string.ascii_letters + string.digits + '+/='
f = open('out.txt','w')
print("\nCRC32begin")
CrackZip()
print("CRC32finished")
f.close()
z5BzAAANAAAAAAAAAKo+egCAIwBJAAAAVAAAAAKGNKv+a2MdSR0zAwABAAAAQ01UCRUUy91BT5UkSNPoj5hFEVFBRvefHSBCfG0ruGnKnygsMyj8SBaZHxsYHY84LEZ24cXtZ01y3k1K1YJ0vpK9HwqUzb6u9z8igEr3dCCQLQAdAAAAHQAAAAJi0efVT2MdSR0wCAAgAAAAZmxhZy50eHQAsDRpZmZpeCB0aGUgZmlsZSBhbmQgZ2V0IHRoZSBmbGFnxD17AEAHAA==
获得Base编码,这里进行解码发现flag但是看不全,可能是Base转文件,这里是直接转rar压缩包
发现是rar,rar文件尾是00 40 07 00
那就把文件头给加上去,文件头是52 61 72 21 1A 07 00
最后解码获取flag
[UTCTF2020]file header 1
总结:
- png文件文件头尾敏感
文件是图片下载不了,这里只能链接另存下载下来,下载后发现是png后缀但是打不开,这里直接上010Editor,发现缺少png文件头,这应该是比较简单的题目,但是解出来的人怎么这么少,不理解
PNG (png) 文件头:89 50 4E 47 文件尾:AE 42 60 82
修改文件头后,直接查看图片即可获取flag
[XMAN2018排位赛]通行证 1
总结:
- Base解码
- 栅栏编码熟悉
- 凯撒偏移
这题目要是不看wp真的有难度,不是一般人能想出来的
首先下载文件时给了一个文档Base64→栅栏7位加密→Rot13解密(凯撒偏移13位)
a2FuYmJyZ2doamx7emJfX19ffXZ0bGFsbg==
这里先使用Base64解码看看怎么个事情
再进行栅栏7加密,这里是加密不是解密真的好无语啊,这头发不够用了
最后Rot13解密
获得flag并修改头部:flag{oyay_now_you_get_it}
当然这里应该可以使用凯撒脚本爆破,这里我没有尝试,明天我再试试吧
# 编 者:玥轩
# 开发时间:2023/5/17 23:06
def decrypt(ciphertext, shift):
"""移位解密函数"""
plaintext = ''
for char in ciphertext:
if char.isalpha(): # 如果是字母,进行移位解密
if char.isupper():
plaintext += chr((ord(char) - shift - 65) % 26 + 65) # 大写字母移位解密
else:
plaintext += chr((ord(char) - shift - 97) % 26 + 97) # 小写字母移位解密
else: # 如果不是字母,直接输出
plaintext += char
return plaintext
# 加密密文和移位数
ciphertext = 'kzna{blnl_abj_lbh_trg_vg}'
shift = 3
ciphertext = ciphertext.lower()
# 小写易于观察
# 枚举所有可能的移位数,输出所有解密结果
for i in range(26):
plaintext = decrypt(ciphertext, i)
print("%d %s"% (i, plaintext))
[WUSTCTF2020]girlfriend 1
总结:
- Audacity工具下载及使用
- DTMF拨音号识别,使用工具:dtmf2num.exe
- 9键识别字母
题目一顿解压最后得到.wav后缀的文件
这里我使用Audacity打开
这里我迷茫了,像摩斯密码但不是摩斯密码,看了佬的WP后发现是DTMF拨音号识别
这里附上DTMF拨音号识别下载网址,下载后进入命令行
输入命令dtmf2num.exe girlfriend.exe
即可发现9键按数字顺序
999*666*88*2*777*33*6*999*4*4444*777*555*333*777*444*33*66*3*7777
手机键盘密码,就跟小时候qq空间流行的用九键按数字顺序按多少下得到一句话类似
999 ---> y
666 ---> o
88 ---> u
2 ---> a
777 ---> r
33 ---> e
6 ---> m
999 ---> y
4 ---> g
4444 ---> i
777 ---> r
555 ---> l
333 ---> f
777 ---> r
444 ---> i
33 ---> e
66 ---> n
3 ---> d
7777 ---> s
youaremygirlfriends
获取flag{youaremygirlfriends}
[DDCTF2018](╯°□°)╯︵ ┻━┻ 1
总结:
- 16进制与10进制与ASCII码之间的转换
这题目挺有意思的,上来就是一段编码,仔细一看会发现最大字符是f,严重怀疑是16进制
这里直接使用大佬的脚本
string = "d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9b2b2e1e2b9b9b7b4e1b4b7e3e4b3b2b2e3e6b4b3e2b5b0b6b1b0e6e1e5e1b5fd"
sliced_list = [string[i:i+2] for i in range(0, len(string), 2)]
print(sliced_list) ##每两位切片
decimal_list = [int(hex_num, 16) for hex_num in sliced_list]
print(decimal_list) ##将十六进制转换为十进制
result_list = [num - 128 for num in decimal_list]
print(result_list) ##转换后的十进制数都大于128,将列表内的每个数都减128
ascii_list = [chr(decimal) for decimal in result_list]
print(ascii_list) ##将十进制数转换为ASCII码
merged_string = ''.join([elem for sublist in ascii_list for elem in sublist])
print(merged_string) ##最终合并为一个字符串
这里是16进制转10进制后再转ASCII码
最后flag
flag{922ab9974a47cd322cf43b50610faea5}
[MRCTF2020]千层套路 1
获得压缩包后尝试解压发现需要密码,这里以为是伪加密上010Editor看看,发现是真加密,使用ARCHPR进行弱密码爆破,
发现密码就是文件名,到了写脚本环节我是一点不会,搬大佬的脚本吧
import os
import zipfile
zip_name = "0976.zip" # 要解压缩的zip文件名
password = "0976" # zip文件的密码
zips_path = "./zips" # 解压缩后的zip文件存放路径
flag_path = "./flag" # 解压缩出的非zip文件存放路径
while True:
zip = zipfile.ZipFile(zip_name, "r") # 使用zipfile.ZipFile打开zip文件
file_name = zip.namelist()[0] # 获取zip文件中的文件名列表的第一个文件名
suffix_name = zip.namelist()[0].split(".")[1] # 获取文件名的后缀名
if suffix_name == "zip": # 如果后缀名是"zip"
zip.extractall(zips_path, pwd=password.encode()) # 解压缩zip文件到指定路径,并指定密码
else:
zip.extractall(flag_path) # 解压缩非zip文件到指定路径
exit() # 终止程序
zip_name = os.path.join(zips_path, file_name) # 更新zip_name为解压缩后的zip文件路径
password = zip.namelist()[0].split(".")[0] # 更新password为解压缩后的zip文件名去除后缀名后的部分
脚本运行完毕后可以看见两个文件夹,在qr.txt文档中可以一堆坐标
接下来就是坐标转图片啦,代码如下:
from PIL import Image
x = y = 200
img = Image.new("RGB",(x,y))
file = open('qr.txt','r')
for width in range(0,x):
for height in range(0,y):
line = file.readline()
rgb = line.replace('(','').replace(')','').split(',')
img.putpixel((width,height),(int(rgb[0]),int(rgb[1]),int(rgb[2])))
img.save('flag.jpg')
跑完后得到二维码照片,然后使用QR_Research识别
获取flag
flag{ta01uyout1nreet1n0usandtimes}
百里挑一 1
解压后使用wireshark打开,根据题目提示图片导出所有的图片
把导出的文件包托到kali使用exiftool读取信息
这里使用命令
exiftool *|grep flag -A 10 -B 10
exiftool *:
这里的*表示当前目录下的所有文件。这个命令会对当前目录下的所有文件进行元数据提取。
|grep flag -A 10 -B 10:
|是管道符号,将exiftool的输出传递给grep命令。
grep flag表示在输入中搜索包含 “flag” 的行。
-A 10表示在匹配到的行之后显示接下来的 10 行。
-B 10表示在匹配到的行之前显示前面的 10 行。
这里知道flag的前半段:flag{ae58d0408e26e8f
现在去wireshrak
输入
tcp.stream eq 114
选中第一个右键追踪TCP
这里可以找到另一半flag(这里也可以搜索exif,但是我不会,搜索没有反应)
我搞明白了,这里的查找分为三组查找,每次需要区分好,
有分组列表,分组详情,分组字节流,从这之中进行查找
成功获取flag
flag{ae58d0408e26e8f26a3c0589d23edeec}