第三十八题:
ctfshow{48b722b570c603ef58cc0b83bbf7680d}
第三十九题:
37换成1,36换成0
,就得到长度为287
的二进制字符串,因为不能被8整除所以,考虑每7
位转换一个字符,得到flag。
ctfshow{52812ff995fb7be268d963a9ebca0459}
第四十题:
#提取出特定部分并转换为对应的 ASCII 字符,最后将这些字符拼接成一个字符串
flag=""
for i in range(28,69): #flag内容从28位开始
f = open('apngframe'+str(i)+'.txt')
s = f.read()
flag += chr(int(s.split("/")[0][6:]))
print(flag)
ctfshow{95ca0297dff0f6b1bdaca394a6fcb95b}
第四十一题:
搜索f001,查看他们摆成的样子。
ctfshow{fcbd427caf4a52f1147ab44346cd1cdd}
第四十二题:
用010editor打开,发现有48个IDAT块,结合提示flag长度为41,很有可能有关联,经过观察从这里开始,将其转换为字符acsll字符,正好是ctfshow......
ctfshow{078cbd0f9c8d3f2158e70529f8913c65}
第四十三题(须win系统):
使用tweakpng查看,弹出了很多这样的错误窗口,看样子是crc有问题,我们使用png-debugger-master工具来看一下,把所有错误的crc收集起来,转换成字符串,得到flag。
ctfshow{6eb2589ffff5e390fe6b87504dbc0892}
第四十四题(须win系统):
用 PNGDebugger
打开,把信息导入到txt文件中
D:\1aCTF-Misc\png-debugger-master\Debug> pngdebugger ../misc44.png >1.txt
利用脚本把OK
的替换成1,FAILED
替换成0,即可得到flag。
import re
import binasciis = open("1.txt", "r").read()
data_s = re.findall(r'\(1152\).*?CRC ([FAILED,OK!]+)', s,
re.DOTALL) # 匹配(1152)所在的段,直到结尾为FAILED或者OK!结束,在默认情况下.的作用是匹配除了换行符以外的所有字符,这里的re.DOTALL的作用是可以将. 匹配所有换行符
print(data_s)
flag = ""
for i in data_s:
if i == 'OK!':
flag += '1'
else:
flag += '0'print(flag)
print(len(flag))
for i in range(43):
print(chr(int(flag[8*i:8*(i+1)],2)),end="")
ctfshow{cc1af32bf96308fc1263231be783f69e}
第四十五题:
使用在线转换格式的网站对png转换成bmp后,使用binwalk工具可以查看到有隐藏内容,-e对其进行分离即可得到flag。
ctfshow{057a722a5587979c34966c2436283e70}
第四十六题:
扶乩:术士制丁字形木架,其直端顶部悬锥下垂。架放在沙盘上,由两人各以食指分扶横木两端,依法请神,木架的下垂部分即在沙上画成文字,作为神的启示,或与人唱和,或示人吉凶,或与人处方。
根据题的提示,应该是让我们通过identify查看它的偏移量,提取它每次偏移的值当做坐标,再作图
┌──(ln㉿kali)-[~/ctf]
└─$ identify misc46.gif > 1.txt
import re
import matplotlib.pyplot as plt
from PIL import Imagef = open("1.txt", "r")
s = f.read()
# 正则表达式寻找偏移量
data_s = re.findall(r'GIF .*?\+(\d+)\+(\d+)', s, re.DOTALL)
# 将data_s里的坐标从str类型转换成int类型,不然后面的坐标不能识别
data_s = [[int(i) for i in j] for j in data_s]# 创建一个新的RGB图像,大小为400*70的像素,背景颜色为白色(RGB的值为(255,255,255))
img = Image.new('RGB', (400, 100), (255, 255, 255))
# 创建一个新的RGB图像,大小为1*1的像素,背景颜色为黑色(RGB的值为(0,0,0))
new = Image.new('RGB', (1, 1), (0, 0, 0))# 循环每次的坐标
for i in data_s:
# 将new(黑色像素点)粘贴到img(白色像素点)上,相当于填充
img.paste(new, i)# 显示img图像
plt.imshow(img)
# 显示窗口以查看图像
plt.show()
ctfshow{05906b3be8742a13a93898186bc5802f}
第四十七题:
apng的文件结构是每一个IDAT块前面都会有一个fcTL块,它其中就包含水平垂直偏移量。
# 第一阶段:读取偏移
with open(r'.\misc47.png', 'rb') as f:
bin_data = f.read()point_list = []
for i in range(0, len(bin_data)):
#print(hex(bin_data[i]))
# union CTYPE type 中偏移固定位置在66 63 54 4C 后的 16 17 18 19 20 21 22 23 位
# 先找到66 63 54 4C ,再根据固定的偏移找到uint32 x_offset 16 17 18 19 和uint32 y_offset 20 21 22 23
if i+3<=len(bin_data) and hex(bin_data[i])=='0x66' and hex(bin_data[i+1])=='0x63' and hex(bin_data[i+2])=='0x54' and hex(bin_data[i+3])=='0x4c':
# 两字节转为十进制,赌他不会用到三字节
# 高位字节存在前,低位字节存在后,小端字节序
l = int((bin_data[i+18] << 8) | bin_data[i+19])
r = int((bin_data[i+22] << 8) | bin_data[i+23])
point_list.append((l,r))# 第二阶段:通过偏移画图
from PIL import Image
import matplotlib.pyplot as pltimg = Image.new('RGB',(400,70),(255,255,255))
for i in point_list:
new = Image.new('RGB',(1,1),(0,0,0))
img.paste(new,i)
plt.imshow(img)
plt.show()
ctfshow{6d51f85b45a0061754a2776a32cf26c4}
第五十题:
使用StegSolve工具,在终端使用命令调用 java -jar StegSolve-1.5-alpha1.jar
ctfshow{84470883ee1eec2e886436461bf79111}