一年前做的,没怎么注意细节,还请见谅
如果在做题过程中解密没有直接解出来,可以多试试其他的解码,一般-栅栏解码-凯撒解码-Base64-ASCII 解码-rot13,base85解码等,
Dig可查看一个主机信息的软件,用于查询DNS服务器
Stegstove的图片处理
下图为xor两张图片(其实就是图片异常),点这个选项之后会有你选择的两张照片
然后就可以异或
DNS也有追踪流
7z的字节流数据
Linux反编译界面化工具jadx-gui
处理apk文件用
遇到图片是这样的需要联想到通道,要试一试stegsolve分析
自动检测Base16、32、64、85系列编码,多层解码:
import base64
import re
import base91
def baseDec(text,type):
if type == 1:
return base64.b16decode(text)
elif type == 2:
return base64.b32decode(text)
elif type == 3:
return base64.b64decode(text)
elif type == 4:
return base64.b85decode(text)
elif type == 5:
return base91.decode(text.decode())
else:
pass
def detect(text):
try:
if re.match("^[0-9A-F=]+$",text.decode()) is not None:
return 1
except:
pass
try:
if re.match("^[A-Z2-7=]+$",text.decode()) is not None:
return 2
except:
pass
try:
if re.match("^[A-Za-z0-9+/=]+$",text.decode()) is not None:
return 3
except:
pass
try:
if re.match("^[A-Za-z0-9$%()*+,-./:;?@[\]^_`{|}~]+$",text.decode()) is not None:
return 4
except:
pass
try:
if re.match("^[^-\']+$",text.decode()) is not None:
return 5
except:
pass
return 5
def autoDec(text):
floor = 0
while True:
try:
code = detect(text)
text = baseDec(text,code)
floor += 1
print("第{0}层:\n".format(floor),text)
if not text:break
except:
break
if __name__ == "__main__":
# with open("Autopy/crypto/doc/form",'rb') as f:
# content = f.read()
content = "@iH<,{*;oUp/im\"QPl`yR*ie}NK;.D!Xu)b:J[Rj+6KKM7P@iH<,{*;oUp/im\"QPl`yR".encode()
autoDec(content)
类似于这样,一般要提取出来,之后保存为pyc后缀
然后用stegosaurus工具提取出隐写
:PT2242信号:
前面4bit表示同步码,中间的20bit表示地址码,后面的4bit表示功能码,最后一位是停止码01 代表 F,00 代表 0,11 代表 1,最后的0是结束符
Ogg一种音频压缩格式
可以用Au打开
lsb隐写,Nihilist 密码
import string
enc='PVSF{vVckHejqBOVX9C1c13GFfkHJrjIQeMwf}'这个是密码
grid='LOVEKFC'+'ABDGHIJMNPQRSTUWXY'这个是隐写内容
flag=''
for i in enc:
if i in string.ascii_lowercase:
index=grid.lower().index(i)
flag+=string.ascii_lowercase[index]
continue
if i in string.ascii_uppercase:
index=grid.upper().index(i)
flag+=string.ascii_uppercase[index]
continue
flag+=iprint flag
504b0304 16进制编码转压缩包脚本:
import binascii
s = '以504b开头的16进制数据编码'
with open('flag.zip', 'wb') as f:
f.write(binascii.unhexlify(s))
套娃解压缩脚本:
while [ "`find . -type f -name '*.tar.xz' | wc -l`" -gt 0 ]; do find -type f -name "*.tar.xz" -exec tar xf '{}' \; -exec rm -- '{}' \;; done;
linux中dd分离命令的使用
Qsstv命令
音频解码
看和这个类似的题
,解决方式,脚本
这个是C++语言哦
#include<iostream>
using namespace std;
int main(){
int i=1;
int flag=0;
for(int i=0;i<19260817;i++){
flag=(int)(((long long)flag*10+2)%1000000007);
//cout<<i<<endl;
}
cout<<flag;
return 0;
}
G语言
Ciphey - 自动解密工具
命令:
ciphey -t "aGVsbG8gbXkgbmFtZSBpcyBiZWU=想要解密的内容"
用法:
Volatility镜像分析
若题目中给了.img文件,一般需要查看镜像分析
在线字频统计
盲水印
PS D:\Tools\Misc\BlindWaterMark> python2 .\bwm.py decode .\1.png .\2.png res.png
image<.\1.png> + image(encoded)<.\2.png> -> watermark<res.png>
md5加密
apng文件可以用火狐浏览器打开
但一般这样类型的图片文件需要用apng在线分割工具
删除每一行首/尾匹配条件的字符脚本
path = r"C:\Users\20455\Desktop\data2.txt"
f = open(path, 'r')
a = f.readlines()
f = open(path, 'w')
for line_b in a:
line_a = line_b.lstrip('$$START$$')
f.write(line_a)
f.close()
16进制转字符脚本:
import binascii
with open('data.txt','r') as file:
with open('out.txt','wb') as data:
for i in file.readlines():
data.write(binascii.unhexlify(i[:-1]))
有的题目上作者会故意搞非常多的相同的数字、字母或其它类型的编码,并且一般这是没用的,所以需要进行去重
去重脚本
Ps:要把该文件放到该目录下
with open('文档路径', 'r') as file:
res_list = []
lines = file.readlines()
print('[+]去重之前一共{0}行'.format(len(lines)))
print('[+]开始去重,请稍等.....')
for i in lines:
if i not in res_list:
res_list.append(i)
print('[+]去重后一共{0}行'.format(len(res_list)))
print(res_list)
with open('out.txt', 'w') as new_file:
for j in res_list:
new_file.write(j)
Unicode解码
类似于以下这样
音频隐写或图片隐写steghide
用法
steghide extract -sf /root/桌面/out.wav
拼图
120张,每张都是200 x 100,应该长:10张图片,宽:12张图片,那么拼起来的总图就应该是长:2000 x 宽:1200
使用montage和gaps
Kali命令:
montage *jpg -tile 10x12 -geometry 200x100+0+0 flag.jpg
gaps --image=flag.jpg --generations=40 --population=120 --size=100
汉信码
一种类似于二维码但并非二维码的符号编码
SilentEye 沉默之眼
功能和Audacity差不多,用于解决音频隐写解码,如果Audacity没有解开,可以用这个试试
AES加密
类似以下这样的是AES加密
urldecode编码
Tar文件可以进行解压
把题目拖入010中还会遇到类似如下图中的解码,可以看到每一行的长短对应一个二进制位,011010类似于这样,有一个简单的脚本:之后在转为字符就行
for line in open("文档路径"):
if (len(line) == 7):
print("0",end="")
else:
print("1",end="")
零宽隐写
像这样字母间有小方块,可以直接搜索零宽隐写解码
若碰见这样的base64解码,需要考虑到逐行解码
逐行解码脚本:
import base64
with open('1.txt','r') as file:
for i in file.readlines():
line=str(base64.b64decode(i),'utf8')
print(line)
再把1换成空格
import base64
with open('1.txt','r') as file:
for i in file.readlines():
line = str(base64.b64decode(i),'utf8')
print(line.replace('1',' '))
转为二进制后发现只有前两位不同,拼接以后发现就前两位不一样,取前两位重组转为十进制,再转为字符的脚本
with open('文件路径') as a_file:
content = [x.strip() for x in a_file.readlines()]
bins = []
for i in content:
bins.append(bin(int(i))[2:].zfill(8)[:2])
stringBins = ''.join(bins)
num = 0
flag = ''
for i in range(int(len(stringBins) / 8)):
flag += chr(int(stringBins[num:num + 8], 2))
num += 8
print(flag)
Base64反复解码脚本:
import base64file = open("flag.txt",'r')
base = file.read()for i in range(29):
base = base64.b64decode(base)print(base)
TTL隐写
类似于这样的一大串数字
直接用脚本跑:
import binascii
with open('文档路径.txt','r') as fp:
a=fp.readlines()
p=[]
for x in range(len(a)):
p.append(int(a[x]))
s=''
for i in p:
if(i==63):
b='00'
elif(i==127):
b='01'
elif(i==191):
b='10'
else:
b='11'
s +=b
# print(s)
flag = ''
for i in range(0,len(s),8):
flag += chr(int(s[i:i+8],2))
flag = binascii.unhexlify(flag)
wp = open('ans.zip','wb')
wp.write(flag)
wp.close()
logo编程语言
类似于以下这样
cs pu lt 90 fd 500 rt 90 pd fd 100 rt 90 repeat 18[fd 5 rt 10] lt 135 fd 50 lt 135 pu bk 100 pd setcolor pick [ red orange yellow green blue violet ]
在在线网站上搜索解决Logo Interpreter
异或5加密,脚本如下:
original = open("文档路径",'r').read()
flag = open("flag",'w')
for i in original:
tmp = int(i,16)^5
flag.write(hex(tmp)[2:])
rsa算法RSA算法加密,py脚本如下:
import gmpy2"""
gmpy2.mpz(n)#初始化一个大整数
gmpy2.mpfr(x)# 初始化一个高精度浮点数x
d = gmpy2.invert(e,n) # 求逆元,de = 1 mod n
C = gmpy2.powmod(M,e,n)# 幂取模,结果是 C = (M^e) mod n
gmpy2.is_prime(n) #素性检测
gmpy2.gcd(a,b) #欧几里得算法,最大公约数
gmpy2.gcdext(a,b) #扩展欧几里得算法
gmpy2.iroot(x,n) #x开n次根"""
p = gmpy2.mpz(3)
q = gmpy2.mpz(11)
e = gmpy2.mpz(3)
l = (p-1) * (q-1)
d = gmpy2.invert(e,l)
c = gmpy2.mpz(26)
n = p * q
ans = pow(c,d,n)print(ans)
解密或维吉尼亚密码
3Des解密
需要密文和密钥才可以解出来
Zsteg隐写
文件路径-a
还可以对LSB进行隐写
可以检测PNG和BMP图片里的隐写数据。
RGB数据写成图片
类似于这样的坐标
脚本:
import itertools
from PIL import Image
max = 200
file = open("qr.txt", "r")
img = Image.new("RGB", (max, max))
for y, x in itertools.product(range(max), range(max)):
pixel = eval(file.readline())
img.putpixel([x, y], pixel)
img.show()
套娃脚本
压缩包解密套娃
import zipfile
name = '0573'
while True:
fz = zipfile.ZipFile(name + '.zip', 'r')
fz.extractall(pwd=bytes(name, 'utf-8'))
name = fz.filelist[0].filename[0:4]
fz.close()
移位密码
key='d4e8e1f4a0f7e1f3a0e6e1f3f4a1a0d4e8e5a0e6ece1e7a0e9f3baa0c4c4c3d4c6fbb9b2b2e1e2b9b9b7b4e1b4b7e3e4b3b2b2e3e6b4b3e2b5b0b6b1b0e6e1e5e1b5fd'
hex=[]
flag=''
for i in range(0,len(key)-1,2):
zdh=key[i:i+2]
hex.append(zdh)
for i in range(len(hex)):
zdh1=hex[i]
flag+=chr(int(int(zdh1,16))-128)
print(flag)
若发现题目中的编码是由一个字母和数字组成,可以用以下方法试试
DTMF拨号音频解码
栅栏解码
凯撒解码
Base64,32,16,85解码,64解码也常常遇到
社会主义核心价值观解码
颜文字解码
oOK,Brainfuck解码
ASCII 解码
rot13解码
⡇⡓⡄盲文解码
摩斯密码
音乐符号解码
解密每一个编码在每一个解密上都不一样
网上有很多解密网站,有时候可能同一种类型解密网站可能解密出不同的内容,所以当一个站解不出来的时候,建议多测试几个,别在一棵树上吊死
python中import os是指导入os模块到当前程序。
85->64->85->13->16->32
出现这几个数字可以想一下base64编码,注意这里13是rot13
USB流量分析
udp
这个过滤条件可以筛选出UDP端口开放的数据包,该过滤条件会匹配所有的UDP数据包,因为UDP没有像TCP那样的连接建立过程,所以UDP数据包的到达通常表示端口是开放的。
icmp and icmp.type == 3 and icmp.code == 3
这个过滤条件用于查找被目标主机标记为"端口不可达"的数据包,通常表示端口关闭;该过滤条件匹配了ICMP "端口不可达"类型的数据包,其中的 "code" 值为3表示端口关闭。
tcp.flags.syn == 1 and tcp.flags.ack == 1
过滤条件可以筛选出TCP端口开放的数据包
wireshark打开,但是不确定是鼠标流量还是键盘流量
然后打开Leftover Capture Data查看是键盘还是鼠标流量
使用tshark导出一下数据
下面这个是导出数据的步骤
tshark -r usbtraffic.pcapng -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt
USB数据包可以直接用直接使用UsbKeyboardDataHacker脚本提取内容,可以提取一些用用的东西,可能是密钥,也可能是其他一些
Ps是在python中用的,在虚拟机中用命令
用法如下:
poetry run python UsbKeyboardDataHacker.py ./example.pcap
Usage :
python UsbKeyboardHacker.py data.pcap
Tips :
To use this python script , you must install the tshark first.
You can use `sudo apt-get install tshark` to install it
Author :
WangYihang <wangyihanger@gmail.com>
If you have any questions , please contact me by email.
Thank you for using.
要看以下这个流量分析
oOk解码
在vscode中运行该ook解码的php文件于浏览器上
凯撒加密caesar
gmbhjtdbftbs类似于这样
把偏移量改为1,就可以直接得到最后的多次解码结果
Ntfs数据流隐藏
在终端上用notepad打开 : .txt: .txt
010Editor
010中有时候会遇到文件损坏,有许多类似A1这样的,如下图,这样很可能是对全文进行了异或,binary xor 2进制异或
在题目中有时候会遇到图片中带着txt的压缩包,但用binwalk分离却出不来,要想到txt文件的开头或结尾是否损坏压缩包的文件头504B如下图:
CRC报错,报错信息,RAR结构有4个块:标记块、归档头部块、文件块、结束块。
把文档转为16进制文件
ctrl +shift +c直接变成以16进制的格式复制下来
ctrl +shift +v -粘贴
在yU后可能有16进制需要转换
在一些图片拖进010中在底部有时候会报出错误信息
图片能正常打开,但是出现CRC匹配错误一般是修改了宽高
第二行首先是宽
其次是高 字母在前越往后越大
能对图片进行分析,以十六进制打开图片,也可以又来打开zip等文件
可以查看文件是否加密
未加密:
文件头中的全局方式位标记为00 00
目录中源文件的全局方式位标记为00 00
伪加密:如果题目中存在多个加密文件可能只有一个是真加密,其他都是伪加密
Ps:伪加密可能会加密好几处
注意PK
在010后面会有好多的解译编码,在右边会有pk字样需要留意以下,有可能是在后面的压缩文件进行伪加密
Ps:要出现00 00,或者09 00类似的格式
文件头中的全局方式位标记为00 00
目录中源文件的全局方式位标记为09 00
ps:也不一定要09 00或00 00,只要是奇数都视为加密,而偶数则视为未加密
zip伪加密是在文件头的加密标记位做修改,进而再打开文件时识被别为加密压缩包
真加密:
文件头中的全局方式位标记为09 00
目录中源文件的全局方式位标记为09 00
伪加密就是把全局标记数值修改,改回未加密的全局标记就行了
Binwalk
binwalk中如果提取后内又document文件可以留意一下
在linux中用命令输入然后输入图片或其他文件夹或压缩包路径,可以对该文件隐藏信息进行提取,一般需加-e进行使用
ARCHPR
暴力破解软件,用于一些密码破译,对4~5位密码破解速度快
密码破解中可以对一些编译过的密码进行明文攻击,如果题目中需要进行明文攻击,可以直接在该软件上选择该选项
fcrackzip
Linux中的破解工具
- -b 暴力破解方式
- -D 字典破解方式
- -c 暴力破解的字符类型,1=1~9,a=a~z,A=A~Z,!=字符,:=所有字符
- -v 显示实时爆破信息
- -l 指定破解的密码为几位数
- -u 指定爆破文件
- -p 破解的起始位置
CQR Research
扫描二维码的工具
Wireshark
抓取网络流量包,抓包工具,可以用来追踪流量包
一些题目中会显示icmp包,要注意留意,可能在末尾藏东西
ICMP包的尾部发现html代码,其中有打印base64信息
Tshark
Linux中的流量分析命令
提取数据用法如下:
tshark -r out.pcap -T fields -e data > data.txt
出题人一般会把答案藏在TCP和http追踪流中
有些藏在http中的,要看以下这个,然后右键点击“显示分组字节
会显示一串16进制,把该进制改为ASCII编码再改为base64解码
Ps:在解出来的base64编码中==等号应该在最后,如果不是可以选择文本每行倒叙,倒叙完后再次进行base64解码语法:
http.request.method==POST
unzip -P supercomplexpassword
如果在追踪流中发现类似这样的,一般代表是压缩包密码
有时候需要导出http包
如果出现很多的http包,可以直接搜索ctf或者flag在linux中用以下命令
grep -r 'CTF' ./文件名字/
http协议中存在lsass.dmp
所以在流量题中还可以用搜索dmp,查询一下有没有关于该文件的流量信息windows中的
(*dmp文件是windows系统中的错误转储文件,当Windows发生错误蓝屏的时候,系统将当前内存【含虚拟内存】中的数据直接写到文件中去,方便定位故障原因。)
(*里面包含主机用户密码信息)
Stegsolve
在java环境下打开文件或照片在数字取证领域,可以通过Stegsolve检测和分析可疑图像文件,提取其中的隐藏信息,为案件侦破提供有力证据。 此外,在信息安全领域,Stegsolve也可以用于检测和防范信息泄露风险,提高信息系统的安全性。
ASCII 码
对照表是基于罗马字母表的一套电脑编码系统,是为了让使用者快速了解二进制数字化组合对应的八进制、十进制、十六进制编码代表的指令。八字节一组以下是ASCII表
Brainfuck
在线解码大多包括++++和>>>,相当于一种加密编码
每个图片文件在010等文件下都有固定的文件头例如:
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Postscript (eps.or.ps),文件头:252150532D41646F6265
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864
Foremost -i -O out
Foremost +图片
分离图片中的压缩包
Foremost -i 也可以提取流量包
Base64解码脚本 python
import base64
def decode(f):
n = 0;
while True:
try:
f = base64.b64decode(f)
n += 1
except:
print('[+]Base64共decode了{0}次,最终解码结果如下:'.format(n))
print(str(f,'utf-8'))
break
if __name__ == '__main__':
f = open('./base64.txt','r').read()
decode(f)
Audacity
用于音频解码,比如摩斯密码
粗线条是-
细线条是.
Outguess -k -r 命令
outguess -k 'abc' -r mmm.jpg flag.txt
abc是隐写密码
flag.txt 加上这个是为了把解出来的隐写内容添加到这个txt文件中
用于图片的隐写-k 表示密码,-r应该是表示解密的意思
⡇⡓⡄盲文解码
Brainfuck/Ook!编码加密
Ook的格式,先编码然后直接转文本
Base64 隐写
先加密后隐写,一般要用到python写脚本
import base64
b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('ComeOn!.txt', 'rb') as f:
flag = ''
bin_str = ''
for line in f.readlines():
stegb64 = str(line, "utf-8").strip("\n")
rowb64 = str(base64.b64encode(base64.b64decode(stegb64)), "utf-8").strip("\n")
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)
# flag += chr(int(bin(offset)[2:].zfill(equalnum * 2), 2))
# print(flag) 这样写得不出正确结果
print([chr(int(bin_str[i:i + 8], 2)) for i in range(0, len(bin_str), 8)])
字频统计
也是需要用到python脚本
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_+- =\\{\\}[]
就是像这样乱码无序状态的
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_+- =\\{\\}[]"
strings = open('文档路径'.’rb’).read()
result = {}
for i in alphabet:
counts = strings.count(i)
i = '{0}'.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="")