目录
1、套娃(xlsx)
附件是一个xlsx文件,一般的xlsx文件做法就是先用010来看,一般可以转换成zip格式,然后进行解压。
该题解压后
还是有一个xlsx文档,继续进行改后缀解压,解到最后是一个加密的压缩包和一个xlsx文档,然后用010查看这个文档,在最后看到了密码
6e4c834d77cba03af41e1562a5bce84e
用这个密码解RC4key加密压缩包,得到RC4的密钥
ABCDEFGHIJKLMNOPQRSTUVWXYZ
加上之前解压过程中的一个txt文件中有RC4的密文
U2FsdGVkX19uI2lzmxYrQ9mc16y7la7qc7VTS8gLaUKa49gzXPclxRXVsRJxWz/p
然后用在线网站进行解密(其他的好像不太行~~~)
https://www.sojson.com/encrypt.html
ef1a73d40977a49b99b871980f355757
2、神奇的二维码
直接扫码是一个错误的flag,用010查看之后发现里面有RAR文件,然而用foremost是分离不出来的,要用binwalk
binwalk -e *.png
在当前目录下只有一个.png文件格式时,前面的文件名可以用*来代替
进入该分离出来的目录下,查看有什么文件
有一串密文并且可以看出用的是base64加密,直接对其进行解密
asdfghjkl1234567890
Tip:
对文件内容加密
base64 sample.txt
对文本加密
echo 'asdfghjkl1234567890' | base64
对文本解密
echo 'YXNkZmdoamtsMTIzNDU2Nzg5MA==' | base64 --decode
直接进行交互编码加密
交互式解密
回到题目上,对其他压缩包进行解压
发现看看flag在不在里面^_^.rar
、encode.txt
、flag.doc
、flag.jpg
是由716A.rar
、7104.rar
、17012.rar
解压得到的
剩余的两个则需要用密码来解密,用上面得到的一串密码来试试哪个符合
成功解密看看flag在不在里面.rar
解密出来没用~~~
接着就是看flag.doc文件
一堆内容,根据前面解encode.txt
文件可以大概猜测也是用base进行解码,这里用下面的脚本进行解码,自己编写的,没能输出用了哪种base(发现都是一直base64解码即可),还请多多指教
# -*- coding:utf-8 -*-
import base64
import sys
def interactive_decode(file_name):
"""
交互式解码函数,用于解码指定文件中的Base64编码数据。
:param file_name: 要解码的文件名
:return: 解码后的字符串
"""
s = ''
with open(file_name, 'r', encoding='UTF-8') as f:
s = "".join(f.readlines()).encode('utf-8')
src = s
decode_count = 0
while True:
decode_count += 1
try:
src = s
s = base64.b16decode(s)
s = str(s, 'utf-8')
continue
except Exception:
pass
try:
src = s
s = base64.b32decode(s)
s = str(s, 'utf-8')
continue
except Exception:
pass
try:
src = s
s = base64.b64decode(s)
s = str(s, 'utf-8')
continue
except Exception:
break
print("解码完成!结果如下:")
print(s)
print(f"共进行了 {decode_count} 次Base解码")
if __name__ == "__main__":
"""
主程序入口,用于执行交互式解码函数。
:return: None
"""
if len(sys.argv) != 2:
print("使用方法:python b.py <文件名>")
sys.exit(1)
file_name = sys.argv[1]
interactive_decode(file_name)
comEON_YOuAreSOSoS0great
然后用这个密码解18394.rar
得到了一个MP3文件
用Audacity
工具进行查看,肉眼可见是莫斯密码,长的是-,短的是·,间隔是空格
-- --- .-. ... . .. ... ...- . .-. -.-- ...- . .-. -.-- . .- ... -.--
MORSEISVERYVERYEASY
转换成小写就是正确的flag了
morseisveryveryeasy
3、为什么我什么都看不见
用010看.png图片,在尾部看到了有RAR文件里有flag.txt
foremost分离不出来,binwalk分离出来的也还是you want...
这句话,用steghide也无果(并不支持.png的格式)
然后这里就想到了不久前用过lsb的隐写脚本,应该这题就是用lsb隐写脚本进行把flag加密进去的,”解铃还须系铃人“,使用lsb隐写的脚本进行解码(当然还可以直接用zsteg、stegsolve直接出来,已经在kali中就懒得切系统了~~~)
python exp.py decode [文本字节] [要解密的图片] [保存到的文本]
lsb隐写脚本
# python exp.py decode [文本字节] [要解密的图片] [保存到的文本]
# python exp.py encode [原图] [txt文本] [新图]
from PIL import Image
import sys
def toasc(strr):
return int(strr, 2)
#str1为所要提取的信息的长度(根据需要修改),str2为加密载体图片的路径,str3为提取文件的保存路径
def decode(str1,str2,str3):
b=""
im = Image.open(str2)
lenth = int(str1)*8
width,height = im.size[0],im.size[1]
count = 0
for h in range(height):
for w in range(width):
#获得(w,h)点像素的值
pixel = im.getpixel((w, h))
#此处余3,依次从R、G、B三个颜色通道获得最低位的隐藏信息
if count%3==0:
count+=1
b=b+str((mod(int(pixel[0]),2)))
if count ==lenth:
break
if count%3==1:
count+=1
b=b+str((mod(int(pixel[1]),2)))
if count ==lenth:
break
if count%3==2:
count+=1
b=b+str((mod(int(pixel[2]),2)))
if count ==lenth:
break
if count == lenth:
break
with open(str3,"w",encoding='utf-8') as f:
for i in range(0,len(b),8):
#以每8位为一组二进制,转换为十进制
stra = toasc(b[i:i+8])
#将转换后的十进制数视为ascii码,再转换为字符串写入到文件中
#print((stra))
f.write(chr(stra))
print("sussess")
def plus(string):
#Python zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0。
return string.zfill(8)
def get_key(strr):
#获取要隐藏的文件内容
with open(strr,"rb") as f:
s = f.read()
string=""
for i in range(len(s)):
#逐个字节将要隐藏的文件内容转换为二进制,并拼接起来
#1.先用ord()函数将s的内容逐个转换为ascii码
#2.使用bin()函数将十进制的ascii码转换为二进制
#3.由于bin()函数转换二进制后,二进制字符串的前面会有"0b"来表示这个字符串是二进制形式,所以用replace()替换为空
#4.又由于ascii码转换二进制后是七位,而正常情况下每个字符由8位二进制组成,所以使用自定义函数plus将其填充为8位
string=string+""+plus(bin(s[i]).replace('0b',''))
#print(string)
return string
def mod(x,y):
return x%y
#str1为载体图片路径,str2为隐写文件,str3为加密图片保存的路径
def encode(str1,str2,str3):
im = Image.open(str1)
#获取图片的宽和高
width,height= im.size[0],im.size[1]
print("width:"+str(width))
print("height:"+str(height))
count = 0
#获取需要隐藏的信息
key = get_key(str2)
keylen = len(key)
for h in range(height):
for w in range(width):
pixel = im.getpixel((w,h))
a=pixel[0]
b=pixel[1]
c=pixel[2]
if count == keylen:
break
#下面的操作是将信息隐藏进去
#分别将每个像素点的RGB值余2,这样可以去掉最低位的值
#再从需要隐藏的信息中取出一位,转换为整型
#两值相加,就把信息隐藏起来了
a= a-mod(a,2)+int(key[count])
count+=1
if count == keylen:
im.putpixel((w,h),(a,b,c))
break
b =b-mod(b,2)+int(key[count])
count+=1
if count == keylen:
im.putpixel((w,h),(a,b,c))
break
c= c-mod(c,2)+int(key[count])
count+=1
if count == keylen:
im.putpixel((w,h),(a,b,c))
break
if count % 3 == 0:
im.putpixel((w,h),(a,b,c))
im.save(str3)
if __name__ == '__main__':
if '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) < 2:
print ('Usage: python test.py <cmd> [arg...] [opts...]')
print (' cmds:')
print (' encode image + flag -> image(encoded)')
print (' decode length + image(encoded) -> flag')
sys.exit(1)
cmd = sys.argv[1]
if cmd != 'encode' and cmd != 'decode':
print('wrong input')
sys.exit(1)
str1 = sys.argv[2]
str2 = sys.argv[3]
str3 = sys.argv[4]
if cmd != 'encode' and cmd != 'decode':
print ('Wrong cmd %s' % cmd)
sys.exit(1)
elif cmd=='encode':
encode(str1,str2,str3)
elif cmd=='decode':
decode(str1,str2,str3)
附带加个lsb隐写加密:
python exp.py encode [原图] [txt文本] [新图]
也是用同一张图,隐写是会进行覆盖的
不想每次解密后都保存到一个txt文本中,然后再cat来查看的话可以用下面我改进后的代码(在上图中就用到了)
直接输出到命令行中
python exp.py decode [文本字节] [要解密的图片]
#python exp.py decode [文本字节] [要解密的图片]
from PIL import Image
import sys
def toasc(strr):
return int(strr, 2)
def decode(str1,str2):
b=""
im = Image.open(str2)
lenth = int(str1)*8
width,height = im.size[0],im.size[1]
count = 0
for h in range(height):
for w in range(width):
pixel = im.getpixel((w, h))
if count%3==0:
count+=1
b=b+str((mod(int(pixel[0]),2)))
if count ==lenth:
break
if count%3==1:
count+=1
b=b+str((mod(int(pixel[1]),2)))
if count ==lenth:
break
if count%3==2:
count+=1
b=b+str((mod(int(pixel[2]),2)))
if count ==lenth:
break
if count == lenth:
break
for i in range(0,len(b),8):
stra = toasc(b[i:i+8])
print(chr(stra), end='') # 直接打印解码后的字符,取消换行符
def plus(string):
return string.zfill(8)
def get_key(strr):
with open(strr,"rb") as f:
s = f.read()
string=""
for i in range(len(s)):
string=string+""+plus(bin(s[i]).replace('0b',''))
return string
def mod(x,y):
return x%y
def encode(str1,str2,str3):
im = Image.open(str1)
#获取图片的宽和高
width,height= im.size[0],im.size[1]
print("width:"+str(width))
print("height:"+str(height))
count = 0
#获取需要隐藏的信息
key = get_key(str2)
keylen = len(key)
for h in range(height):
for w in range(width):
pixel = im.getpixel((w,h))
a=pixel[0]
b=pixel[1]
c=pixel[2]
if count == keylen:
break
#下面的操作是将信息隐藏进去
#分别将每个像素点的RGB值余2,这样可以去掉最低位的值
#再从需要隐藏的信息中取出一位,转换为整型
#两值相加,就把信息隐藏起来了
a= a-mod(a,2)+int(key[count])
count+=1
if count == keylen:
im.putpixel((w,h),(a,b,c))
break
b =b-mod(b,2)+int(key[count])
count+=1
if count == keylen:
im.putpixel((w,h),(a,b,c))
break
c= c-mod(c,2)+int(key[count])
count+=1
if count == keylen:
im.putpixel((w,h),(a,b,c))
break
if count % 3 == 0:
im.putpixel((w,h),(a,b,c))
im.save(str3)
# 确保正确缩进 if __name__ == '__main__' 部分
if __name__ == '__main__':
if '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) < 2:
print ('Usage: python test.py <cmd> [arg...] [opts...]')
print (' cmds:')
print (' encode image + flag -> image(encoded)')
print (' decode length + image(encoded) -> flag')
sys.exit(1)
cmd = sys.argv[1]
if cmd != 'encode' and cmd != 'decode':
print('wrong input')
sys.exit(1)
str1 = sys.argv[2]
str2 = sys.argv[3]
if cmd=='encode':
# 对于encode命令,仍需要第三个参数来指定加密图片的保存路径
if len(sys.argv) < 4:
print('Encode command requires an output file path.')
sys.exit(1)
str3 = sys.argv[4]
encode(str1,str2,str3)
elif cmd=='decode':
# 解码命令不再需要第三个参数
decode(str1,str2)
stegsolve:
zsteg:
4、Take me hand
一个流量包
据题意,直接滚动找404请求,不一会就找到了
然后找它发送的包,得到明文flag
也可以直接搜关键词的~~~
还能用工具直接找
%7B:{ %21:}
5、bqt
用010查看,可以发现是PDF文件
加上.pdf的后缀名
一般是pdf隐写
加上后缀可以正常打开,crtl+A全选,改颜色,看到有一串字,复制出来
c8e9aca0c3f4e6e5f2a1a0d4e8e5a0e6ece1e7a0e9f3baa0e6ece1e7fbf7e5e6e5efe9e4eae7efe5e4f3e6e9eff2f0e5e6e4e6e7e7e6e4f3e5fd
是十六进制,用脚本将它们两两分组
# 两两分开
s = 'c8e9aca0c3f4e6e5f2a1a0d4e8e5a0e6ece1e7a0e9f3baa0e6ece1e7fbf7e5e6e5efe9e4eae7efe5e4f3e6e9eff2f0e5e6e4e6e7e7e6e4f3e5fd'
result = ''
for i in range(0, len(s), 2):
result += s[i:i+2] + ' '
print(result)
# c8 e9 ac a0 c3 f4 e6 e5 f2 a1 a0 d4 e8 e5 a0 e6 ec e1 e7 a0 e9 f3 ba a0 e6 ec e1 e7 fb f7 e5 e6 e5 ef e9 e4 ea e7 ef e5 e4 f3 e6 e9 ef f2 f0 e5 e6 e4 e6 e7 e7 e6 e4 f3 e5 fd
转10进制:
# 将十六进制字符串两两分开并转换为十进制
s = 'c8e9aca0c3f4e6e5f2a1a0d4e8e5a0e6ece1e7a0e9f3baa0e6ece1e7fbf7e5e6e5efe9e4eae7efe5e4f3e6e9eff2f0e5e6e4e6e7e7e6e4f3e5fd'
result = []
for i in range(0, len(s), 2):
decimal_value = int(s[i:i+2], 16)
result.append(decimal_value)
# 输出转换后的十进制列表
print(result)
# 如果需要输出以空格分隔的字符串形式
print(' '.join(map(str, result)))
200 233 172 160 195 244 230 229 242 161 160 212 232 229 160 230 236 225 231 160 233 243 186 160 230 236 225 231 251 247 229 230 229 239 233 228 234 231 239 229 228 243 230 233 239 242 240 229 230 228 230 231 231 230 228 243 229 253
然后-128
numbers = [200, 233, 172, 160, 195, 244, 230, 229, 242, 161, 160, 212, 232, 229, 160, 230, 236, 225, 231, 160, 233, 243, 186, 160, 230, 236, 225, 231, 251, 247, 229, 230, 229, 239, 233, 228, 234, 231, 239, 229, 228, 243, 230, 233, 239, 242, 240, 229, 230, 228, 230, 231, 231, 230, 228, 243, 229, 253]
result = []
for num in numbers:
result.append(num - 128)
print(result)
72, 105, 44, 32, 67, 116, 102, 101, 114, 33, 32, 84, 104, 101, 32, 102, 108, 97, 103, 32, 105, 115, 58, 32, 102, 108, 97, 103, 123, 119, 101, 102, 101, 111, 105, 100, 106, 103, 111, 101, 100, 115, 102, 105, 111, 114, 112, 101, 102, 100, 102, 103, 103, 102, 100, 115, 101, 125
然后转ASCII码
exp:
m = "c8e9aca0c3f4e6e5f2a1a0d4e8e5a0e6ece1e7a0e9f3baa0e6ece1e7fbf7e5e6e5efe9e4eae7efe5e4f3e6e9eff2f0e5e6e4e6e7e7e6e4f3e5fd"
n=""
for i in range(0,len(m),2):
hex = m[i:i+2]
n+= chr(int(hex,16)-128)
print(n)
Hi, Ctfer! The flag is: flag{wefeoidjgoedsfiorpefdfggfdse}