41、秘密文件
题目提示的盗取了文件,于是首先过滤FTP协议,追踪一下TCP流,发现存在一个压缩包
于是尝试用foremost提取,得到一个加密的压缩包
没有任何提示,尝试四位数暴力破解即可得到flag
42、菜刀666
题目提示是菜刀,菜刀基本都是POST,因此直接过滤POST的包
http.request.method==POST
从1开始追踪流都是正常的菜刀shell,直到追踪流7发现传了两个参数z1/z2
z1使用base64解码得到了一个图片地址
z2保存十六进制得到一张图片
1、使用Editor导入十六进制
2、使用脚本
import struct
a = open("1.txt", "r") # 十六进制数据文件
lines = a.read()
res = [lines[i:i + 2] for i in range(0, len(lines), 2)]
with open("res.jpg", "wb") as f:
for i in res:
s = struct.pack('B', int(i, 16))
f.write(s)
实际上里面还有flag.txt和hello.zip
使用foremost分离文件,得到一个加密的压缩包,密码就是图片上的文件
43、just_a_rar
得到一个加密的压缩包,提示四位数,直接爆破得到一张图片,查看图片属性在exif中发现flag
44、鸡你太美
得到两张gif但是有一张无法查看,怀疑是文件头缺失,于是尝试用十六进制器查看文件
第二张图片果然少了文件头,插入四个字节,加上文件头47 49 46 38
修改后保存即可得到flag
45、一叶障目
用010 Editor打开图片,没发现什么特别的,但是这好像是图片的一块
于是尝试校验crc,果然有问题,说明图片宽高被修改过
用大佬的CRC修复脚本即可得到正常的图片得到flag
import zlib
import struct
# 读文件
file = '123.png' # 图片要和脚本在同一个文件夹下
fr = open(file, 'rb').read()
data = bytearray(fr[12:29]) # 生成字节数组
crc32key = eval(str(fr[29:33]).replace('\\x', '').replace("b'", '0x').replace("'", '')) # 格式化
n = 4095 # 理论上0xffffffff,但考虑到屏幕实际,0x0fff就差不多了
for w in range(n): # 高和宽一起爆破
width = bytearray(struct.pack('>i', w)) # q为8字节; i为4字节; h为2字节
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x + 4] = width[x]
data[x + 8] = height[x]
# print(data)
crc32result = zlib.crc32(data) # CRC校验和
if crc32result == crc32key:
print(width, height)
# 写文件
newpic = bytearray(fr)
for x in range(4):
newpic[x + 16] = width[x]
newpic[x + 20] = height[x]
fw = open(file + '.png', 'wb') # 保存副本
fw.write(newpic)
fw.close
:::info
bytearray() 方法返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256。
struct主要是用来处理C结构数据的,读入时先转换为Python的字符串类型,然后再转换为Python的结构化类型
struct.pack(format, v1, v2, ...)
struct.pack
返回一个字节对象,该对象包含根据格式字符串格式打包的值v1、v2,…。参数必须与格式要求的值完全匹配。
q:longlong i:int h:short
struct.pack('>i', w) # 大段模式,C语言中的int类型占4位用来表示w
:::
又或者使用检测脚本
import binascii
import struct
misc = open("123.png", "rb").read()
for i in range(1024):
data = misc[12:20] + struct.pack('>i', i) + misc[24:29]
crc32 = binascii.crc32(data) & 0xffffffff # CRC的32位校验和
if crc32 == 0xc20f1fc6:
print(i)
将计算出的高844转为十六进制修改图片即可得到flag
46、神奇的二维码
得到一张二维码,先扫描一下
发现flag不在这里,于是尝试用binwalk分析提取一下,得到了很多文件,逐个分析一下(其实已经开始头疼了)
首先查看txt文本,使用base64解码得到一串字符串asdfghjkl1234567890
接下来看看flag.doc发现是特别特别长一串base64,先尝试解码了一次发现还是很长一串base64,那就是多次base64编码了,于是尝试写脚本解决:
import base64
file = open('112233.txt','r').read()
while True:
try:
file = base64.b64decode(file)
except:
print(str(file, 'utf-8'))
break
得到一串字符串comEON_YOuAreSOSoS0great
,之后查看一下flag.jpg没啥感觉,于是尝试用得到的两串字符串破解加密的压缩包,asdfghjkl1234567890
是“看看flag”压缩包的密码
好家伙得到一张没啥用的图,先不管叭,comEON_YOuAreSOSoS0great
是“18394.rar”的密码,解密得到音频文件,一听就是摩斯电码
摩斯电码转换即可-- --- .-. ... . .. ... ...- . .-. -.-- ...- . .-. -.-- . .- ... -.--
得到flag
47、梅花香之苦寒来
https://blog.csdn.net/yoyoko_chan/article/details/118968176
得到一张图片,查看属性发现占用字节挺大的,于是用十六进制器查看,在JPG尾部发现一大串十六进制数字
将此串十六进制转为字符串
with open('hex.txt', 'r') as hex: # hex.txt为需要转换的文本文件
num = hex.read()
with open('new.txt', 'w') as result: # 结果写入new.txt
re = ''
for i in range(0, len(num), 2):
re = '0x' + num[i] + num[i + 1]
re = int(re, 16) # 将16进制强制转换输出整型
print(chr(re), end="")
result.write(chr(re))
int(x,[base])
base:参照进制,base=0时代表十进制
base与前面的x要匹配,如果base=2则x需要二进制
# int('0xa',16)
>>10
# int('10',8)
>>8
打开new.txt发现是很多坐标
图片提示图穷匕见,那就利用坐标画图叭,于是利用gnuplot画图
kali安装:
1、更新系统
sudo apt-get update
2、下载gnuplot
apt-get install gnuplot
在使用工具前先将坐标格式转换成可以识别的格式
with open('new.txt', 'r') as res: # 坐标格式文件比如(7,7)
re = res.read()
with open('gnuplotTxt.txt', 'w') as gnup: # 将转换后的坐标写入gnuplotTxt.txt
re = re.split()
tem = ''
for i in range(0, len(re)):
tem = re[i]
tem = tem.lstrip('(')
tem = tem.rstrip(')')
for j in range(0, len(tem)):
if tem[j] == ',':
tem = tem[:j] + ' ' + tem[j + 1:]
gnup.write(tem + '\n')
使用gnuplot绘图即可plot '1.txt'
48、纳尼
下载后得到一个txt和一张打不开的gif,于是用十六进制器查看
果然此GIF少了文件头,贴贴0字节,加入文件头47 49 46 38
得到一张将base64编码分段的动图,用stegsolve的Frame Browser查看
解码base64Q1RGe3dhbmdfYmFvX3FpYW5nX2lzX3NhZH0==
即可得到flag
49、穿越时空的思念
打开音频一听就是摩斯电码,用Audacity打开发现两段摩斯电码
第一段
..-. ----- ..--- ----. -... -.. -.... ..-. ..... ..... .---- .---- ...-- ----. . . -.. . -... ---.. . ....- ..... .- .---- --... ..... -... ----- --... ---.. -....
转换得到F029BD6F551139EEDEB8E45A175B0786
第二段
..-. ----- ..--- ----. -... -.. -.... ..-. .....
转换得到F029BD6F5
第二段只是重复第一段,将第一段转换大小写即可
print("F029BD6F551139EEDEB8E45A175B0786".lower())
50、outguess
解压得到很多文件,但是好像只有图片有用
查看图片属性在exif中发现提示
在线解密一下得到abc
,根据题目提示,使用outguess导出隐写内容
apt-get install outguess
outguess -k 'abc' -r mmm.jpg -t 1.txt
得到的1.txt即为flag
51、excel破解
打开得到的Excel发现需要密码,放入十六进制器查看,搜索flag字符串即可得到
52、来题中等的吧
打开下载的图片猜测很有可能是摩斯电码
提取转换即可得到flag
.- .-.. .--. .... .- .-.. .- -...
53、谁赢了比赛?
查看图片属性占用字节挺大的,于是尝试用foremost提取文件
得到了一个加密的压缩包
没有任何提示就尝试四位数字暴力破解得到一张gif图片, 于是尝试用stegslove->Frame Browser进行逐帧分析,发现第310帧有提示保存下来
用stegslove打开这张照片在Red plane 0发现一张二维码,扫描即可得到flag
54、我有一只马里奥
运行题目给出的exe后得到一个txt文本
NTFS流隐藏文件,使用工具NtfsStreamsEditor即可得到flag
或者使用notepad
NTFS流隐藏文件
https://www.qingsword.com/qing/812.html#windows-NTFS-ADS-2
1、NTFS交换数据流(ADS)
NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流,就是说除了主文件流之外还可以有许多非主文件流寄宿在主文件流中。它使用资源派生来维持与文件相关的信息,虽然我们无法看到数据流文件,但是它却是真实存在于我们的系统中的。
创建一个数据交换流文件的方法很简单,命令为[宿主文件]:[准备与宿主文件关联的数据流文件]
NTFS分区,ADS是NTFS文件系统的特性,不适用于FAT32文件系统
2、操作环境
lads.exe和streams.exe是用于检测交换数据流的程序
3、隐藏文本文件
echo www.baidu.com>>123.txt:222.txt
使用echo命令,将"www.qingsword.com"这几个字符写入到123.txt:222.txt中;
echo命令以写字符的方式创建了"222.txt"这个交换数据流文件,其中123.txt是宿主文件,222.txt是交换数据流文件;
222.txt在图形界面下是不可见的,就像寄生虫一样,寄生在123.txt上。
notepad 123.txt:222.txt
使用记事本程序打开这个交换数据流文件,打开后可以添加删除222.txt的内容并保存,也能将数据流文件另存为保存成其他文件。
type 123.txt>>test:123.txt
将123.txt使用交换数据流的方式寄生到test文件夹上;
type命令和echo命令不同,type命令是将已经存在的一个文件,用交换数据流的方式寄生到另外一个文件或文件夹上;
test文件夹是一个空文件夹,寄生123.txt后,文件夹大小显示仍然是0。
notepad test:123.txt
使用notepad打开这个寄生在test上的文本文件
type 123.txt>>C:\:123.txt
将123.txt寄生到E盘根目录
notepad C:\:123.txt
这种方法能很好的将一个文本文件使用交换数据流的形式寄生在另外一个文件上(任何类型的文件上),从一定程度上起到了隐藏文本文件的目的。
4、隐藏图片文件
type bbb.jpg>>123.txt:bbb.jpg
寄生到123.txt上
type bbb.jpg>>test:bbb.jpg
寄生到test文件夹上
type bbb.jpg>>aaa.exe:bbb.jpg
寄生到aaa.exe这个可执行文件上
type bbb.jpg>>C:\:bbb.jpg
寄生到C盘根目录
mspaint aaa.exe:bbb.jpg
打开方式很简单,可以使用系统自带的图画程序mspaint
5、隐藏可执行文件
#include<stdio.h>
int main(){
printf("hello world");
}
type aaa.exe>>123.txt:aaa.exe
寄生的方法和图片和文本文件相同,寄生到123.txt
type aaa.exe>>C:\:aaa.exe
寄生到C盘根目录
start 123.txt:aaa.exe
XP中可以直接用start命令执行可执行文件
mklink 111.txt 123.txt:aaa.exe
为 111.txt <<===>> 123.txt:aaa.exe 创建的符号链接
在命令行直接111.txt
即可运行此可执行文件
在Win7之后的系统中,微软可能出于安全考虑,不允许直接运行交换数据流可执行文件,必须要创建符号链接,这个符号链接是可见的(当然可以使用其他手段隐藏这个符号链接),并且这个符号链接创建出来后不能复制到其他地方,只能在创建的那个位置使用命令行方式调用(鼠标双击会报错)。
6、检测和清除NTFS-ADS隐藏的文件
lads检测
lads.exe /S
(如果是在test文件下执行的话)递归检测test以及test下所有子目录。
streams清除
streams.exe -d C:\
首先尝试清除一下C盘根目录上面寄生的交换数据流,-d后面接目录。
这里报错因为这个:aaa.exe现在正在运行对于这种情况,需要先结束掉这个:aaa.exe进程才能清除。
streams.exe -s -d C:\
可以添加-s
参数来一次性递归清除C盘下所有寄生的交换数据流文件(慎用,尤其是对系统盘一定不要随便使用递归清除,系统本身的一些数据流也会被一起清除掉)
55、find_me
打开题目给出的文件在exif处发现提示
之前遇到过这种,明显是盲文,在线解密即可得到flag
56、gakki
得到一张图片大概查看了一下,先尝试用foremost提取,得到一个加密的压缩包,没有任何提示,先尝试四位数字爆破,得到一大串不知道干啥的码
看了大佬博客才知道对于一串大量无特征、无规律字符,可以用字频统计
# -*- coding:utf-8 -*-
#Author: mochu7
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_+- =\\{\\}[]"
strings = open('./flag.txt').read()
result = {}
for i in alphabet:
counts = strings.count(i)
i = '{}'.format(i)
result[i] = counts
# 按照降序列出统计结果
res = sorted(result.items(),key=lambda item:item[1],reverse=True)
for data in res:
print(data)
# 按照词频输出
for i in res:
flag = str(i[0])
print(flag[0],end="") # 不换行
sorted(result.items(),key=lambda item:item[1],reverse=True)
sorted() 函数对所有可迭代的对象进行排序操作。
result.items():迭代对象,items()返回可遍历的(键, 值) 元组数组
key:比较元素,指定可迭代对象中的一个元素排序
key=lambda item:item[1]:按照频率排序
reverse=True:排序规则:降序
运行脚本即可得到flag
57、base64隐写
打开压缩包得到一张图片和TXT文件,图片是个公众号无其他有效提示,打开文件得到很多base64,base64隐写,参考大佬脚本
# encoding:utf-8
def get_base64_diff_value(s1, s2):
base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
res = 0
for i in xrange(len(s2)):
if s1[i] != s2[i]:
return abs(base64chars.index(s1[i]) - base64chars.index(s2[i]))
return res
def solve_stego():
with open('ComeOn!.txt', 'rb') as f:
file_lines = f.readlines()
bin_str = ''
for line in file_lines:
steg_line = line.replace('\n', '')
norm_line = line.replace('\n', '').decode('base64').encode('base64').replace('\n', '')
diff = get_base64_diff_value(steg_line, norm_line)
print diff
pads_num = steg_line.count('=')
if diff:
bin_str += bin(diff)[2:].zfill(pads_num * 2)
else:
bin_str += '0' * pads_num * 2
print goflag(bin_str)
def goflag(bin_str):
res_str = ''
for i in xrange(0, len(bin_str), 8):
res_str += chr(int(bin_str[i:i + 8], 2))
return res_str
if __name__ == '__main__':
solve_stego()
base64隐写
参考:
https://daidr.me/archives/code-585.html
https://blog.csdn.net/qq_43431158/article/details/109525795
https://blog.csdn.net/Sanctuary1307/article/details/113820321
https://blog.csdn.net/Sanctuary1307/article/details/113836907
(1)base64编码
daidrhouse
ZG==
YY==
aW==
ZF==
cm==
aM==
b2==
dc==
c2==
Zf==
正常编码:
ZA==
YQ==
aQ==
ZA==
cg==
aA==
bw==
dQ==
cw==
ZQ==
概述:
用64个ascii字符作为基础来编码二进制内容的一种编码方式。
base64将3个字节(24位)作为一组进行处理。不足3字节时填充0,并在结尾使用=
来标识填充的字节数。并将每6位作为1小组,将24位编码成4组6位二进制。此时,这6位二进制一共有2的六次方即64种情况,正好能够用64个字符来表示。(因此编码完后体积会增大1/3)
Example:
(2)base64解码
- 将待解码字符串中的字符对应查找Base64编码表中的序列值(末尾的“=”直接忽略)
- 将所得对应序列值转换为6位二进制字串
- 将所有6位二进制字串按8位分割
- 将每个8位二进制字串转换为十进制
- 十进制值对应的ASCII字符串即为结果
Example:
(3)隐写原理
概述:
在对长度非3的倍数的字符串进行Base64编码过程中,进行转换为二进制字串这一步骤会在末尾添加0,而解码过程中之前添加的0则会被舍弃。
而base64隐写产生的原因就在于,添加的0字符在进行base64解码时会被舍弃,这意味着在这一步骤添加的二进制值可以不全为0,这并不影响解码结果。
Example:
Terra
这一字符串的长度为5,非3的倍数,在转为6位二进制字串时添加了两个0(红色加粗部分)。编码后的结果为VGVycmE=
:
倘若添加的二进制值不全为0,虽然会改变“=”号前最后一个字符的值,使编码后的字符串变为VGVycmH=
。但该字符串进行Base64解码的结果依然是Terra
:
末尾有两个“=”字符的编码字符串同样如此,Lucy
字符串正常编码应为THVjeQ==
:
修改后为THVjeV==
,同上,进行base64解码结果依然是Lucy
若像这样对多个base64编码字符串结尾进行修改,即可隐藏更多的信息,这就是base64隐写。
常见的Base64隐写题为一个txt文本文档,内含多个经过base64编码的字符串。解码规则是将所有被修改过的base64字符串结尾的二进制值提取出来组成一个二进制串,以8位分割并转为十进制值,最终十进制对应的ASCII字符串即为base64隐写结果。
def base64value(c):
table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
for i in range(64):
if table[i] == c:
return i
return 0
def base64stego():
f = open("xxx.txt","rb")
lines = f.readlines()
x = ''
for line in lines:
l = str(line, encoding = "utf-8").strip()
if l[-1] == '=':
if l[-2] == '=':
x += bin(base64value(l[-3]))[-4:]
else:
x += bin(base64value(l[-2]))[-2:]
flag = ''
for i in range(0, len(x), 8):
flag += chr(int(x[i:i+8],2))
print(flag)
if __name__ == '__main__':
base64stego()
58、KO
下载得到一个TXT文本
一看Ook!编码,在线网站解密即可
59、ezmisc
用010 Editor打开图片校验,发现crc校验有误
又或者用TweakPNG查看图片,发现chunk报错(图片尺寸被修改)
尝试修改图片的高
60、伟大的侦探
打开压缩包得到一个需要解密的文件和一个提示txt
使用010的EBCDIC编码即可得到压缩密码
EBCDIC编码
https://zhuanlan.zhihu.com/p/27053660
为了在计算机上存储、处理文字等字符,就必须将这些字符转换成二进制数字,于是为了统一转换标准设计了字符编码标准
最开始设计出来的字符编码标准是EBCDIC编码标准。EBCDIC(扩展二进制编码的十进制交换码)的缩写。
EBCDIC码是由国际商用机器公司(即IBM)为大型机操作系统而开发设计的,于1964年推出。
在EBCDIC码中,英文字母不是连续排列的,中间出现多次断续,这带来了一些困扰和麻烦。
因此,在后来IBM的个人计算机和工作站操作系统中并没有采用EBCDIC码,而是采用了晚于EBCDIC码推出、且后来成为了英文字符编码工业标准的ASCII编码方案
ASCII字符编码
ASCII码的编码方式参照了EBCDIC码,并吸取了其经验教训,将英文字母进行了连续排列,这方便了程序处理。
ASCII码使用七个二进制数字(即比特)来表示一个字符,总共表示128个字符(2^7 = 128,二进制编码为0000 0000 ~ 0111 1111,对应的十进制就是0~127)。
由于目前计算机普遍采用8位作为一个字节来进行存取与处理,因此剩下最高位的那1比特一般为0,但有时在一些通讯系统中也被用作奇偶校验位。
通过密码解压得到一堆图片,是福尔摩斯小人密码
福尔摩斯小人密码
对照密码表按照图片名称顺序即可得到flag
标签:文件,BUUCTF,base64,MISC,60,flag,123,得到,txt From: https://www.cnblogs.com/zeroEMC/p/17226217.html