修改后缀名.zip,继续解压.
使用stegsolve工具的combiner功能将两张图片组合,即可得到flag
这道题涉及动态图分解,ASE解密(需要解密两次)。
AES是一个对称密码,需要密钥解密。
1.在动态图解析网站,把图片解析出来。
动态图解析网站
得到密钥ISCC
2,再用010editor打开,最底下看到base64编码
AES加密解密网站
先分离图片得到两张图
进行image combiner
黑里透红,那就是说明像素的对比度起到决定性作用。
调整曝光度
先保存图片,然后使用Photoshop打开图片,我们在右侧面板打开调整->曝光度:
曝光度开到最大,出现二维码
我们发现大写的XCTF每个字母之间只隔了四个字母,使用python提取一下,得到flag。
num='cvqAeqacLtqazEigwiXobxrCrtuiTzahfFreqc{bnjrKwgk83kgd43j85ePgb_e_rwqr7fvbmHjklo3tews_hmkogooyf0vbnk0ii87Drfgh_n kiwutfb0ghk9ro987k5tfb_hjiouo087ptfcv}'
flag=''
for i in range (3,len(num),5):
#第0个数是第一个数,步数算到关键字后
flag+=num[i]
print(flag)
拉高图片出密码
分离图片得流量包
流量包搜索flag无果,试试搜索png,jpg,zip。得到base编码,出flag
x=[0b01100110, 0b01101100, 0b01100001, 0b01100111, 0b01111011, 0b01000110, 0b01110101, 0b01001110, 0b01011111, 0b01100111, 0b01101001, 0b01000110, 0b01111101]
b="";
for a in x:
b+=chr(a);
print(b)
对挂载的理解
安装mount
sudo apt-get install mount
mkdir ctf //新建一个目录 ctf
mount f1fc23f5c743425d9e0073887c846d23 ctf/ //中间的为附件名,再挂载进这个目录里
find / -name flag.txt 在根目录下查找flag.txt,表示在整个硬盘查找
find ctf -name flag.txt 在ctf目录下查找
find . -name flag.txt 在当前目录下查找
umount -f f1fc23f5c743425d9e0073887c846d23//取消挂载
文章
base64隐写
import base64
# 64个Base64 字符
b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('C:\\Users\\韩\\Desktop\\stego.txt', 'rb') as f:#rb按照二进制读取
bin_str = ""
flag = ""
for line in f.readlines():#读取每一行
# 转换为str类型
stegb64 = str(line, "utf-8").strip("\n")#以UTF-8编码存储,strip:去除换行符号
# 解码再编码后,得到隐写前的 Base64编码
rowb64 = str(base64.b64encode(base64.b64decode(stegb64)), "utf-8").strip("\n")
# 两次编码的末尾的数据会存在差异,主要是由于 Base64 隐写将一部分二进制码 存到了 在编码过程中会被丢弃的二进制码中
# 我们要做的就是把被舍弃的那一部分的二进制码找出来并拼接,转换,找出二进制码所表示的字符串
# 查找每一种编码的最后一个字符的所在位置的差异 => 将会得到 相差的位数,将位数转化成二进制码即可得到被隐写的那一部分的二进制码
offset = abs(b64chars.index(stegb64.replace('=', '')[-1]) - b64chars.index(rowb64.replace('=', '')[-1]))#红色区域
#abs返回数字的绝对值 [-1]数组的最后一个
# 每一行的 ‘=’ 的个数 => 得到补充 0 的位数
# 一个 ‘=’ 表示 补了 两个二进制位
# 两个 ’=‘ 表示 补了 四个二进制位
# 这些二进制位可能存在被隐写的部分
equalnum = stegb64.count('=')
# 包含 ‘=’ 时 即 可能包含 Base64 隐写时
if equalnum:
# 将差异位 转换为 二进制 => 得到相应的二进制码并进行拼接
# equalnum * 2 的意思为:添加的二进制位
bin_str += bin(offset)[2:].zfill(equalnum * 2)#拼接二进制
#zfill函数主要是为字符串定义长度,如不满足,缺少的部分用0填补
# 将二进制文件转换为字符串
for i in range(0, len(bin_str), 8):
flag += chr(int(bin_str[i:i + 8], 2))
print(flag)
依次读取每行,从中提取出隐写位。
如果最后没有‘=’,说明没有隐写位,跳过。
如果最后是一个‘=’,说明有两位隐写位,将倒数第二个字符转化为对应的二进制索引,然后取后两位。
如果最后是两个‘=’,说明有四位隐写位,将倒数第三个字符转化为对应的二进制索引,然后取后四位。
将每行提取出的隐写位依次连接起来,每8位为一组转换为ASCII字符,最后不足8位的丢弃。
zsteg
zsteg -a//尝试所有已知的组合
zsteg -e "b1,bgr,lsb,xy" pcat.png > p.exe//导出内容
grep 使用正则在文本中搜索字符
strings在文件中搜索文本
strings '/root/Desktop/1' | grep "hctf"
我们直接利用条形码在线阅读得到其内容:https://online-barcode-reader.inliteresearch.com/
打开二进制发现wav,先修改成wav,不能打开,那就修改成文件夹,用audacity打开wav,换成频谱图得到flag
strings '/root/Desktop/badimages' | grep -i Flag(-i不分大小写)
将图片用strgolve翻出二维码
扫描后得到一串十六进制的数,把它放进010editor,看到是pyc文件,然后进行反编译
python反编译地址
def flag():
str = [
65,
108,
112,
104,
97,
76,
97,
98]
flag = ''
for i in str:
flag += chr(i)
print flag
修改一下
str = [
65,
108,
112,
104,
97,
76,
97,
98]
flag = '03F30D0AB6266A576300000000000000000100000040000000730D0000006400008400005A00006401005328020000006300000000030000000800000043000000734E0000006401006402006403006404006405006406006405006407006708007D00006408007D0100781E007C0000445D16007D02007C01007400007C0200830100377D0100712B00577C010047486400005328090000004E6941000000696C000000697000000069680000006961000000694C0000006962000000740000000028010000007403000000636872280300000074030000007374727404000000666C6167740100000069280000000028000000007307000000746573742E7079520300000001000000730A00000000011E0106010D0114014E280100000052030000002800000000280000000028000000007307000000746573742E707974080000003C6D6F64756C653E010000007300000000'
for i in str:
flag += chr(i)
print(flag)
from ast import literal_eval as make_tuple
from PIL import Image
f = open(r'.txt', 'r')
corl = [make_tuple(line) for line in f.readlines()]
f.close()
img0 = Image.new('RGB', (270, 270), '#ffffff')
k=0
for i in range(246):
for j in range(246):
img0.putpixel ([i , j], corl[k])
k=k+1
img0.save("result.png")
strings可用在pcap.记得进入桌面
strings webshell.pcapng | grep {
文章
掩码爆破
数独看着像二维码,将有数字的为1,没数字的为0
用二进制做二维码
# -*- coding:utf-8 -*-
from PIL import Image
x = 45
y = 45
im = Image.new("RGB", (x, y)) # 创建图片
file = open('1.txt', 'r') # 打开rbg值文件
for i in range(0, x):
line = file.readline() # 获取一行
for j in range(0, y):
if line[j] == '0':
im.putpixel((i, j), (255, 255, 255)) # rgb转化为像素
else:
im.putpixel((i, j), (0, 0, 0)) # rgb转化为像素
im.show()
这里用audacity打开,看到二进制
注意数二进制数,是105个,也就是步长为7
s = '110011011011001100001110011111110111010111011000010101110101010110011011101011101110110111011110011111101'
flag = ''
for i in range(0,len(s),7):
flag += chr(int('0'+s[i:i + 7],2))
print(flag)
foremost即可
stegslove在蓝色通道里找到了
工业设备消息传输使用modbus协议,过滤一下直接搜,但是它sctf{Easy_Mdbus},中间加个o,sctf{Easy_Modbus}就对了
zsteg看到
打开发现png头文件不正确89504E47
修改后仍打不开,打开010editor发现没有宽
运行得到准确宽高(crc就是第二行后面)
import struct
import binascii
import os
# 记得加上crc
m = open(r"C:/Users/Lenovo/Desktop/148a3ba22b8541f48f354f3e27f0aa4c.png", "rb").read()
k = 0
for i in range(5000):
if k == 1:
break
for j in range(5000):
c = m[12:16] + struct.pack('>i', i) + struct.pack('>i', j)+m[24:29]
crc = binascii.crc32(c) & 0xffffffff
if crc == 0x932f8a6b:
k = 1
print(hex(i), hex(j))
break
from base64 import *
b = b64decode('aWdxNDs0NDFSOzFpa1I1MWliT08w')
data = list(b)
for i in range(0, 200):
key = ''
for j in range(len(data)):
# 注意,python3中已经不用ord去转了
key += chr(data[j]^i)
print(key)
SSCTF线上选举美男大赛开始了,泰迪拿着他的密码去解密了,提交花括号内内容(Z2dRQGdRMWZxaDBvaHRqcHRfc3d7Z2ZoZ3MjfQ==)
base64解密:ggQ@gQ1fqh0ohtjpt_sw{gfhgs#}
栅栏解密(位移7):ggqht{ggQht_gsQ10jsf#@fopwh}
凯撒密码(位移14):ssctf{ssCtf_seC10ver#@rabit}
原理:git信息泄露
下载下来的文件名字太长,先改个名字
root@kali:~/Desktop/CTF# mv d02f31b893164d56b7a8e5edb47d9be5 miscall
root@kali:~/Desktop/CTF# ls
miscall
先来查看文件类型
root@kali:~/Desktop/CTF# file miscall
miscall: bzip2 compressed data, block size = 900k
发现是个bzip2的压缩包,解压
root@kali:~/Desktop/CTF# bzip2 -d miscall
bzip2: Can't guess original name for miscall -- using miscall.out
#无法猜出miscall的原始名称--使用miscall.out
root@kali:~/Desktop/CTF# ls
miscall.out
虽然报了错误,但是可以发现文件名发生了改变
root@kali:~/Desktop/CTF# bzip2 -d miscall
bzip2: Can't guess original name for miscall -- using miscall.out
root@kali:~/Desktop/CTF# ls
miscall.out
二话不说再看看文件类型
root@kali:~/Desktop/CTF# file miscall.out
miscall.out: POSIX tar archive (GNU) #tar文件
继续解压
root@kali:~/Desktop/CTF# tar -xvf miscall.out
root@kali:~/Desktop/CTF# ls
ctf miscall.out
发现出现了一个新的目录ctf,进去看看,终于看到flag了,可是是个假的
root@kali:~/Desktop/CTF# cd ctf/
root@kali:~/Desktop/CTF/ctf# ls
flag.txt
root@kali:~/Desktop/CTF/ctf# cat flag.txt
Nothing to see here, moving along...
什么都没有,怎么办?再仔细看看,发现了隐藏文件.git,是个啥,百度一波,找到了可用的命令,试试看
root@kali:~/Desktop/CTF/ctf# ls -a
. .. flag.txt .git
使用命令查看git记录
root@kali:~/Desktop/CTF/ctf# git log
commit bea99b953bef6cc2f98ab59b10822bc42afe5abc (HEAD -> master)
Author: Linus Torvalds
Date: Thu Jul 24 21:16:59 2014 +0200
Initial commit
git stash show显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
git stash apply应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1} ,相当于恢复改变的内容
我们在平时的 Linux 运维管理的时候,经常会进行各种数据备份任务。将数据导出然后打包。通常在安全性要求比较高的环境下,我们可以借助 OpenSSL 工具对打包后的数据进行加密解密,这样能进一步的保障数据的安全性。
文章
在追踪第二个流时发现一些文档,pub.key公钥,推测有私钥
一个流量文件有多个tcp流,往下翻就行。其他流的查找也是这样
找到私钥,保存为pri.key(一定是.key的后缀)
foremost流量包会得到jpg、pdf、zip,zip解压后得到key.txt,发现是乱码,推测存在加密,用openssl解密
命令:openssl rsautl -decrypt -in key.txt -inkey pri.key -out flag.txt
-in 为要解密的加密文档 -inkey 为密钥 -out 为输出文档
[具体的详见如何运用OpenSSL 对文件进行加密和解密_petpig0312的博客-CSDN博客_openssl加密文件](https://blog.csdn.net/petpig0312/article/details/79784016)
流量包中提取文件:1、tcpxtract -f +文件名 2、用NetworkMiner 3、用wireshark 4、foremost -v -i +文件名 5、用Chaosreader
[文章](https://www.cnblogs.com/micr067/p/14076573.html)
流量包里搜索universe,能找到几个universe.png,应该是从流量包里提取图片,binwalk一下发现确实有图片,但是foremost提取不出来
用NetworkMiner
具体打开方式看大佬文章
之前binwalk分离看到有很多图片,我们把NetworkMiner的图片全部进行zsteg,找到flag
没有后缀,file一下查看类型
mkdir创建一个新目录,mount挂载
mkdir ctfff
mount forensic100 ctfff
cd _forensic100.extracted//进入目录
ls
grep -r key.txt//grep -r 在某一目录下递归查找某一子串,根据题目是查找key.txt
file 1//查看文件,是gzip
gunzip<1//进行解压
umount forensic100//取消挂载
拖进010editor里观察,开头是FFD9,结尾是FFD8,全部的十六进制反过来了
a='所有十六进制'
b=[::a]
print(b)
打开图片
zsteg隐写发现有压缩包
zsteg -e b1,rgb,lsb,xy 2.png -> 1.zip
,提取出来,解压,得到一串base64码,转图片
没有后缀,先去查询类型,发现是txt,但是打开后发现一大段没用的话
仔细看后缀是rock.rockstar是一种语言
将rockstar转成python语言
运行python,我在vscode上面没有运行成功,用的是IDLE
考点:audacity的采样率
文章
可以直接搜索flag发现图片打开
binwalk,foremost显示有图片,但是打不开,networkMiner也没有
apt-get install tcpxtract
Tcpxtract -f 文件名//在root里面找
压缩源文件目录区:
50 4B 01 02:目录中文件文件头标记(0x02014b50)
3F 00:压缩使用的 pkware 版本
14 00:解压文件所需 pkware 版本
00 00:全局方式位标记(有无加密的重要标志,这个更改这里进行伪加密,改为09 00打开就会提示有密码了)
08 00:压缩方式
5A 7E:最后修改文件时间
F7 46:最后修改文件日期
16 B5 80 14:CRC-32校验(1480B516)
19 00 00 00:压缩后尺寸(25)
17 00 00 00:未压缩尺寸(23)
07 00:文件名长度
24 00:扩展字段长度
00 00:文件注释长度
00 00:磁盘开始号
00 00:内部文件属性
20 00 00 00:外部文件属性
00 00 00 00:局部头部偏移量
6B65792E7478740A00200000000000010018006558F04A1CC5D001BDEBDD3B1CC5D001BDEBDD3B1CC5D001
压缩源文件目录结束标志:
50 4B 05 06:目录结束标记
00 00:当前磁盘编号
00 00:目录区开始磁盘编号
01 00:本磁盘上纪录总数
01 00:目录区中纪录总数
59 00 00 00:目录区尺寸大小
3E 00 00 00:目录区对第一张磁盘的偏移量
00 00:ZIP 文件注释长度
划重点!
用010hex打开zip文件。
把504B0304后的第3、4个byte改成0000还有
把504B0102后的第5、6个byte改成0000即可破解伪加密。
##识别真假加密
无加密
压缩源文件数据区的全局加密应当为00 00
且压缩源文件目录区的全局方式位标记应当为00 00
假加密
压缩源文件数据区的全局加密应当为00 00
且压缩源文件目录区的全局方式位标记应当为09 00
真加密
压缩源文件数据区的全局加密应当为09 00
且压缩源文件目录区的全局方式位标记应当为09 00
————————————————
版权声明:本文为CSDN博主「BJFU_vth」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41687289/article/details/82695801
得到一个exe
发现是个安装包
这个搜flag搜不到,只能搜fl,用strings命令搜也行,在wireshark里搜也行,fl4g:{ftop_Is_Waiting_4_y}
打开后没后缀,不知道文章类型,先用nodepad++看里面内容
打开后发现是可下载的软件ExpertGPS
将文件改后缀名(.gpx)
Use appropriate brackets and underscores to separate words if you succeed–>翻译就是“如果成功,使用适当的方括号和下划线分隔单词 – >”
文章
文章
from PIL import Image
img = Image.open('./pic/low.bmp')
img_tmp = img.copy()
pix = img_tmp.load()
width, height = img_tmp.size
for w in range(width):
for h in range(height):
if pix[w, h] & 1 == 0:
pix[w,h] = 0
else:
pix[w, h] = 255
img_tmp.show()
每两个分组十六进制,转成十进制后-128(偏移量为128)
再转成ascii码得到flag:DDCTF{9af3c9d377b61d269b11337f330c935f}
python脚本
import re
s = 'd4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9e1e6b3e3b9e4b3b7b7e2b6b1e4b2b6b9e2b1b1b3b3b7e6b3b3b0e3b9b3b5e6fd'
num = re.findall('\w{2}' ,s)
flag = ''
for i in num:
ch = chr(int(i,16)-128)
flag += ch
print(flag)
是八进制数字,用CaptfEncoder
(网络安全工具套件)转换,还挺好用的
八进制转ASCII,发现长得像base64
得到一个压缩包,需要密码,winhex看了下,不是伪加密,爆破发现密码和文件名一模一样,解压得到下一个加密文件,密码依旧和文件名相同,连续好多个,俄罗斯套娃一样,找了个脚本
import zipfile
import re
zipname = "C:\\Users\\86139\\Desktop\\tmp\\"+"47096.zip"
while True:
if zipname != "C:\\Users\\86139\\Desktop\\tmp\\73168.zip":
ts1 = zipfile.ZipFile(zipname)
res = re.search('[0-9]*',ts1.namelist()[0])
print(res.group())
passwd = res.group()
ts1.extractall("C:\\Users\\86139\\Desktop\\tmp\\",pwd=passwd.encode('ascii'))
zipname = "C:\\Users\\86139\\Desktop\\tmp\\"+ts1.namelist()[0]
else:
print("find")
运行到12475.zip时报错了,爆破得到密码是b0yzz
得到mess.wav,仍进AUdacity里,调成频谱图,发现flag,BallsRealBolls
git clone https://github.com/AngelKitty/stegosaurus
下载下来是个swf文件,用PotPlayer打开可以进行每一帧的遍历,玩通关也行