tips:
- png图片高宽隐写不一定是小的改小
- 对于这种无规律字符集,在没有找到编码的情况下最后都可以使用字符统计的方法进行尝试
1.认真你就输了
binwalk+foremost+搜索
2.just_a_rar
rar爆破+图片属性
3.你猜我是个啥
查看hex,flag位于最后
4.开场曲
mikutab…
5.寂静之城
。。。羊踹玉兔
https://weibo.com/p/230418bb4702370102w4oa
6.一叶障目
(windows打得开,linux打不开存在长宽隐写)
高宽更改隐写,按照一般情况下改写宽度
结果导致图片改变,所以改变高度
得到flag
7.黄金六年
打开是一个视频
逐帧播放有二维码,发现不是flag
hex打开视频文件,文件末尾存在base64编码(注意复制时用Winhex打开确认一番)
在线解密:https://www.sojson.com/base64.html
发现是rar文件,解压缩需要密码
密码是视频中的二维码
(最后一张二维码死活看不见,电脑亮度调最大,屏幕往前拉,俯视看视频!!!)
8.john-in-the-middle
文件-导出HTTP对象-save all
logo图片存在隐写
(一般来说没有flag相关文件,需要查看图片)
9.拉胯的三条命令
wireshark tcp
10.间谍启示录
装载镜像
修改.exe后缀为rar
解压得到flag.exe
运行得到flag
11.伟大的侦探
解压密码.txt提示密码编码未知
将后缀改为doc,并打开预览选择编码
解压发现图片为跳舞小人,福尔摩斯跳舞小人密码
对照表:
12.gakki
binwalk+foremost分离得到rar压缩包
没有密码提示,爆破得到密码
解压得到flag.txt
(对于这种无规律字符集,在没有找到编码的情况下最后都可以使用字符统计的方法进行尝试)
字频统计代码:
# gakki_exp.py
# Author : imagin
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_+- ={}[]"
f = open("flag.txt", "r")
data = f.read()
result = {d:0 for d in alphabet}
def sort_by_value(d):
items = d.items()
backitems = [[v[1],v[0]] for v in items]
backitems.sort(reverse=True)
return [ backitems[i][1] for i in range(0,len(backitems))]
for d in data:
for alpha in alphabet:
if d == alpha:
result[alpha] = result[alpha] + 1
res=sort_by_value(result)
for i in res:
print(i,end="")
13.纳尼
解压得到6.gif
补全文件头GIF98a
分帧得到base64,解码得flag
14.鸡你太美
补全篮球副本.gif文件头
得到flag
15.黑客帝国
HxD hex写入文件
rar爆破解压
图片前缀更改为JPG前缀
打开图片得到flag
16.你有没有好好看网课?
解压得到两个压缩包文件
flag3.zip注释提示6位密码,爆破
解压缩得到flag.docx和一段视频文件
doc文档里有两个数字520,711
去视频里寻找对应的帧数
敲击码
20.SXMgdGhpcyBiYXNlPw==
base64隐写,具体看:https://www.tr0y.wang/2017/06/14/Base64steg/index.html
加密脚本:
# -*- coding: cp936 -*-
import base64
flag = 'Tr0y{Base64isF4n}' #flag
bin_str = ''.join([bin(ord(c)).replace('0b', '').zfill(8) for c in flag])
base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('0.txt', 'rb') as f0, open('1.txt', 'wb') as f1: #'0.txt'是明文, '1.txt'用于存放隐写后的 base64
for line in f0.readlines():
rowstr = base64.b64encode(line.replace('\n', ''))
equalnum = rowstr.count('=')
if equalnum and len(bin_str):
offset = int('0b'+bin_str[:equalnum * 2], 2)
char = rowstr[len(rowstr) - equalnum - 1]
rowstr = rowstr.replace(char, base64chars[base64chars.index(char) + offset])
bin_str = bin_str[equalnum*2:]
f1.write(rowstr + '\n')
解密脚本:
# -*- coding: cp936 -*-
b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('1.txt', 'rb') as f:
bin_str = ''
for line in f.readlines():
stegb64 = ''.join(line.split())
rowb64 = ''.join(stegb64.decode('base64').encode('base64').split())
offset = abs(b64chars.index(stegb64.replace('=','')[-1])-b64chars.index(rowb64.replace('=','')[-1]))
equalnum = stegb64.count('=') #no equalnum no offset
if equalnum:
bin_str += bin(offset)[2:].zfill(equalnum * 2)
print ''.join([chr(int(bin_str[i:i + 8], 2)) for i in xrange(0, len(bin_str), 8)]) #8 位一组
17.