CTF_密码学_常见题目分析思路

竞赛常见编码类型

·单一类:直接将flag值通过工具实现一次转换

·组合类:主要以多种编码形式存在

·异常类:将密文值大小写篡改或增加多余的1~2位字符,然后需要脚本进行遍历猜解

常考密码算法:

·古典密码:凯撒密码、替换密码、移位密码、栅栏密码、简单替换密码、防射密码、培根密码——通过工具或脚本实现

·对称密码:DES、AES、3DES、RC4、A5等

·公钥密码算法:主要以RSA和DSA衍生算法为主

★ASCII码的特点

70 76 65 71 73 83 66 65 66 89

猜想是ASCII的十进制表示

★二进制编码

01100110001100101010001010100010000111111000001010101

密文由0和1组成,使用converter工具进行测试。,单击binary to text转换成明文

★Base64编码

ZmxhZ3tJX0xPVkVfQkFTRTY0fQ==

Base64编码中把符号=放在字符串最后,将字符串长度补齐为4的倍数

base64编码的多次利用——通过解密脚本多次解码(py文件)

import base64

file = open('desc.txt')

#print(file.read().split())

st=file.read().split()

#print st

str = ''

for i in st:

try:

str = base64.b64decode(str)

print(i,str)

except TypeError:

str = base64.b64encode(str)

break;

print(str)

★Base系列编码

Base64解码失败,尝试使用Base32解码成功

全部是数字的密文,属于base16编码的特点

可是考虑使用脚本遍历解码

#!/usr/env python

#coding:utf-8

from base64 import *

s = open('desc.txt','r').read().split()

result={

'16':lambda x:b16decode(x),

'32':lambda x:b32decode(x),

'64':lambda x:b64decode(x)

}

for i_1 in ['16','32','64']:

for i_2 in ['16','32','64']:

for i_3 in ['16','32','64']:

for i_4 in ['16','32','64']:

for i_5 in ['16','32','64']:

for i_6 in ['16','32','64']:

for i_7 in ['16','32','64']:

for i_8 in ['16','32','64']:

for i_9 in ['16','32','64']:

for i_10 in ['16','32','64']:

try:

print result[i_10](result[i_9](result[i_8](result[i_7](result[i_6](result[i_5](result[i_4](result[i_3](result[i_2](result[i_1])))))))))

print i_10,i_9,i_8,i_7,i_6,i_5,i_4,i_3,i_2,i_1

except:

Continue

★URL编码

形式为%加上十六进制数值,很明显是URL编码的风格

工具:小葵转码器

★HTML编码

在HTML编码中不能使用小于号和大于号,因为浏览器会误认为是标签

★Unicode编码

假如题目给出如下文本文件:

\u0066\u006c\u0061\u0067\u0020\u0069......

“u+四位数字”的组合方法——Unicode编码。

该编码用两个字节编码一个字符。

★敲击码

方方格格,不断敲击——通过在键盘上敲每段字符,发现敲出来的字符分别对应不同字母

★摩斯电码

只有“·”和“-”两种字符,可以采用工具解码

★JSFuck-JS编码变异

也称Jother编码,是JavaScript的一种变形编码

特点:有中括号和小括号加上感叹号构成的字符串

所有浏览器内置各种JS引擎,在浏览器控制台中调试输出,将代码通过alert()函数进行弹框解析。

★Quoted-Printable编码

该编码表示“可打印字符引用编码”,是多用途互联网邮件扩展(MIME)的一种实现方式。

原理:任何一个八位的字节值都可以编码为三个字符,一个等号后跟随两个十六进制数字(0~9或A~F)

使用工具解码得到明文。

★BrainFuck编码

该编码是一种极小化的计算机语言,按照“完整图灵机”思想进行设计。

特点:只有八种符号,>、<、+、-、.、,.[、]

通过在线解码网站或工具解码

★Ook编码

特点:全由Ook、.、?、!组成的字符串

解法:先将Ook编码转化为BrainFuck编码,然后解码即可。

★UUencode编码

特点:二进制到文字,将输入文本以每三个字节为单位进行编译,最后剩下的资料少于三个字节,则不够的部分用0补齐。三个字节共有24位,以6位为单位分为4个组,每个组以十进制表示所出现的字节的数值。

数值只会落在0~63之间,然后将每个数加上32,结果刚好落在ASCII码的可打印字符范围,一共64个字符。

★XXencode编码

它较UUencode编码的优点在于其64个字符是常见字符,没有任何特殊字符。

★AAencode编码

特点:将JS代码转换成网络表情,也称颜文字。

解法:将密文放到浏览器的控制带中,直接回车就可解码得到明文

(是否需要加上alert(),书中未提到)

★Base64变异爆破

特点:密文值大小写统一,不论是全大写还是全小写,解码后均有乱码。

#!/usr/bin/ebv python

import base64
import re
from itertools import combinations

s = list('需要解码字符值')

for i in range(len(s)):
    for j in list(combinations([x for x in range(len(s))],i)):
    
        #c = list(combinations([x for x in range(len(s))],i))
        a=list(s)
        #print c
        
        for k in j:
            a[k]= a[k].lower()
            
        r=repr(base64.b64decode(''.join(a)))
        
        if '\\x' not in r:
            print r [1:-1]

★古典密码学

换位加密方式

eg:有大括号、flag字符串,只不过顺序全部打乱

写一个脚本重新调整位置还原密文

未完待续......

文章内容参考清华大学出版的《CTF安全竞赛入门》(启明星辰网络空间安全学院主编)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值