CTF编码加密整理

同步于博客:http://dragonliu.tk/

01 常见编码

0x01 莫尔斯电码(Morse Code)

01 原理

摩尔斯电码也被称作摩斯密码,是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。

02 特征

  1. . -组成的字符串;
  2. 0 1组成的字符串,且为空格间隔得一组一组的。

03 解题

string = '...'
dic= {    '01': 'A',
        '1000': 'B',
        '1010': 'C',
         '100': 'D',
           '0': 'E',
        '0010': 'F',
         '110': 'G',
        '0000': 'H',
          '00': 'I',
        '0111': 'J',
         '101': 'K',
        '0100': 'L',
          '11': 'M',
          '10': 'N',
        '111': 'O',
        '0110': 'P',
        '1101': 'Q',
        '010': 'R',
        '000': 'S',
        '1': 'T',
        '001': 'U',
        '0001': 'V',
        '011': 'W',
        '1001': 'X',
        '1011': 'Y',
        '1100': 'Z',
        '01111': '1',
        '00111': '2',
        '00011': '3',
        '00001': '4',
        '00000': '5',
        '10000': '6',
        '11000': '7',
        '11100': '8',
        '11110': '9',
        '11111': '0',
        '001100': '?',
        '10010': '/',
        '101101': '()',
        '100001': '-',
        '010101': '.',
        '110011':',',
        '011010':'@',
        '111000':':',
        '101010':':',
        '10001':'=',
        '011110':"'",
        '101011':'!',
        '001101':'_',
        '010010':'"',
        '10110':'(',
        '1111011':'{',
        '1111101':'}'
        }; 

flag = ''
for item in key:
    flag += dic[item]
print( flag )
print( flag.lower() )

0x02 Base64/32/16编码

01 原理

base64、base32、base16可以分别编码转化8位字节为6位、5位、4位,16、32、64分别表示用多少个字符来编码。以base64为例:Base64编码要求把3个8位字节转化为4个6位的字节,之后在6位的前面补两个0,形成8位一个字节的形式,6位2进制能表示的最大数是2的6次方是64,这也是为什么是64个字符(A-Z,a-z,0-9,+,/这64个编码字符,=号不属于编码字符,而是填充字符)的原因。

02 特征

有大写、小写、数字,密文末尾一般为==

03 解题


0x03 Escape/Unescape编码

01 原理

Escape/Unescape加密解码/编码解码,又叫%u编码,采用UTF-16BE模式, Escape编码/加密,就是字符对应UTF-16 16进制表示方式前面加%u。Unescape解码/解密,就是去掉"%u"后,将16进制字符还原后,由utf-16转码到自己目标字符。如:字符“中”,UTF-16BE是:“6d93”,因此Escape是“%u6d93”。

02 特征

密文中含有%u

03 解题


0x04 HTML编码

01 原理

完整编码手册:我跳

02 特征

由元素&构成,26可为别的数字。

03 解题


0x05 Unicode编码

01 原理

Unicode编码有以下四种编码方式:

  • 源文本: The
  • &#x [Hex]: The
  • &# [Decimal]: The
  • \U [Hex]: \U0054\U0068\U0065
  • \U+ [Hex]: \U+0054\U+0068\U+0065

02 解题


0x06 URL编码

01 原理

url编码又叫百分号编码,是统一资源定位(URL)编码方式。URL地址(常说网址)规定了常用地数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通过%xx编码处理。 现在已经成为一种规范了,基本所有程序语言都有这种编码,如js:有encodeURI、encodeURIComponent,PHP有 urlencode、urldecode等。编码方法很简单,在该字节ascii码的的16进制字符前面加%. 如 空格字符,ascii码是32,对应16进制是’20’,那么urlencode编码结果是:%20。

02 解题


02 代换密码

0x01 凯撒密码(Caesar Cipher)

01 原理

凯撒密码(Caesar Cipher或称恺撒加密、恺撒变换、变换加密、位移加密)是一种替换加密,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。

  • 加密 c = E 3 ( m ) = m + 3 (   m o d   26 )   0 ≤ m ≤ 25 c=E_3(m)=m+3(\bmod 26) 0\leq m\leq 25 c=E3(m)=m+3(mod26) 0m25
  • 解密 m = D 3 ( c ) = c − 3 (   m o d   26 )   0 ≤ c ≤ 25 m=D_3(c)=c-3(\bmod 26) 0\leq c\leq 25 m=D3(c)=c3(mod26) 0c25

凯撒有两种编码脚本,一种是字母26内循环移位,一种是127次非字母内的循环移位。

02 样例

  • c = xyz
  • m = abc

03 解题

c = """...""" #密文

for p in range(127):
    m = '' #明文
    for i in c:
        temp = chr( (ord(i) + p) % 127 )
        if 32 < ord(temp) < 127:
            m += temp
            flag = 1
        else:
            flag = 0
            break
    if flag == 1:
        print('****%d****:'%p, m)

0x02 Brainfuck加密

01 原理

Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck在英语中是脏话,这种语言有时被称为brainf*ck或brainf**k,甚至被简称为BF。brainfuck语言用> < + - . , [ ]八种符号来替换C语言的各种语法和命令。

02 解题


0x03 Ook加密

01 原理

Ook密码中只含Ook. Ook? Ook!三个不同的语法元素。

02 解题


0x04 .!?加密

01 原理

.!?密码中只含. ? !三个不同的语法元素,使用Ook解密即可。

02 解题


0x05 社会主义核心价值观

01 原理

富强、民主、文明、和谐,自由、平等、公正、法治,爱国、敬业、诚信、友善。

02 解题


0x06 标准银河字母

01 原理

标准银河字母(Standard Galactic Alphabet)出自游戏《指挥官基恩》系列。是系列中使用的书写系统。字母对应如下:


0x07 仿射加密

01 原理

仿射密码是一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母。

  • 加密 c = E a , b ( m ) ≡ a m + b (   m o d   26 ) c = E_{a,b}(m) \equiv am+b(\bmod 26) c=Ea,b(m)am+b(mod26)
  • 解密 m = D a , b ≡ a − 1 ( c − d ) (   m o d   26 ) m = D_{a,b} \equiv a^{-1}(c-d)(\bmod 26) m=Da,ba1(cd)(mod26)

其中,a、b是密钥,为满足 0 ≤ a , b ≤ 25 0\leq a,b\leq 25 0a,b25 g c d ( a , 26 ) = 1 gcd(a,26) = 1 gcd(a,26)=1的整数。其中 g c d ( a , 26 ) = 1 gcd(a,26) = 1 gcd(a,26)=1表示a和26的最大公因子, a − 1 a_{-1} a1表示a的逆元,即 a − 1 ∗ a ≡ 1 ( m o d    26 ) a_{-1}*a \equiv 1(\mod26) a1a1(mod26)

02 解题

  • 常规解法
import gmpy2

a = ... #密钥
b = ... #密钥
text = "..." #密文
flag = ""    #明文
 
text_list = []
 
for i in text:
    text_list.append( ord(i) - 97 )

aa = gmpy2.invert(a, 26) #求解模逆元
for i in text_list:
    tmp = (aa * (i - b)) % 26
    flag += chr(tmp + 97)

print(flag)
  • 暴力破解
text = "..."
 
text_list = []
 
for i in text:
    text_list.append( ord(i) - 97 )
 
flag = ""
for i in text_list:
    for j in range(0, 26):
        c = (17 * j - 8) % 26
        if(c == i):
            flag += chr(j + 97)
print(flag)

0x08

01 原理

02 解题


03 换位加密

0x01 栅栏密码(Rail-fence Cipher)

01 原理

栅栏密码(Rail-fence Cipher)就是把要加密的明文分成N个一组,然后把每组的第1个字符组合,每组第2个字符组合…每组的第N(最后一个分组可能不足N个)个字符组合,最后把他们全部连接起来就是密文。

02 样例

  • c = KYsd3js2E{a2jda}
    • KYsd3js2
    • E{a2jda}
  • m = KEY{sad23jjdsa2}

03 解题


0x02 转盘加密

01 原理

题目

1: <ZWAXJGDLUBVIQHKYPNTCRMOSFE <
2: <KPBELNACZDTRXMJQOYHGVSFUWI <
3: <BDMAIZVRNSJUWFHTEQGYXPLOCK <
4: <RPLNDVHGFCUKTEBSXQYIZMJWAO <
5: <IHFRLABEUOTSGJVDKCPMNZQWXY <
6: <AMKGHIWPNYCJBFZDRUSLOQXVET <
7: <GWTHSPYBXIZULVKMRAFDCEONJQ <
8: <NOZUTWDCVRJLXKISEFAPMYGHBQ <
9: <QWATDSRFHENYVUBMCOIKZGJXPL <
10:<WABMCXPLTDSRJQZGOIKFHENYVU <
11:<XPLTDAOIKFZGHENYSRUBMCQWVJ <
12:<TDSWAYXPLVUBOIKZGJRFHENMCQ <
13:<BMCSRFHLTDENQWAOXPYVUIKZGJ <
14:<XPHKZGJTDSENYVUBMLAOIRFCQW <

密钥: 2,5,1,3,6,4,9,7,8,14,10,13,11,12
密文:HCBTSXWCRQGLES
flag格式 flag{你解密的内容}

解答

这个转盘加密,比如第一个密钥匙:2、密文匙:H

把转盘第二行单独提出来 2: <KPBELNACZDTRXMJQOYHGVSFUWI < ;从H的地方一直剪切,把剪切的内容放在最前面,变成 2: <HGVSFUWIKPBELNACZDTRXMJQOY <

依次类推把14行都按这样的方式整一遍就得到这个:

2:  <HGVSFUWIKPBELNACZDTRXMJQOY <
5:  <CPMNZQWXYIHFRLABEUOTSGJVDK <
1:  <BVIQHKYPNTCRMOSFEZWAXJGDLU <
3:  <TEQGYXPLOCKBDMAIZVRNSJUWFH <
6:  <SLOQXVETAMKGHIWPNYCJBFZDRU <
4:  <XQYIZMJWAORPLNDVHGFCUKTEBS <
9:  <WATDSRFHENYVUBMCOIKZGJXPLQ <
7:  <CEONJQGWTHSPYBXIZULVKMRAFD <
8:  <RJLXKISEFAPMYGHBQNOZUTWDCV <
14:	<QWXPHKZGJTDSENYVUBMLAOIRFC <
10:	<GOIKFHENYVUWABMCXPLTDSRJQZ <
13:	<LTDENQWAOXPYVUIKZGJBMCSRFH <
11:	<ENYSRUBMCQWVJXPLTDAOIKFZGH <
12:	<SWAYXPLVUBOIKZGJRFHENMCQTD <

flag在倒数第六列。

flag{XSXSBUGKUADMIN},可能要转化为小写。


04 文件加密

0x01 zip压缩包破解

我跳

0x02 Linux shadow 文件破解密码

john爆破:john filename

05 其他加密

01 键盘布局加密

密文:r5yG lp9I BjM tFhBT6uh y7iJ QsZ bhM

明文:TONGYUAN

0x 参考

  • [CTF中那些脑洞大开的编码和加密](http://blog.neargle.com/SecNewsBak/drops/CTF中那些脑洞大开的编码和加密 .html)
  • 具体请看:https://ctf-wiki.github.io/ctf-wiki/crypto/classical/introduction-zh/
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CTF(Capture The Flag)竞赛中,常见的一个攻击技术是PHP代码注入(PHP Code Injection)。这种攻击利用了应用程序对用户输入的不充分验证和过滤,使得攻击者能够将恶意的PHP代码注入到应用程序中,从而执行任意代码或实施其他攻击。 以下是一些常见的PHP代码注入漏洞场景和防范措施: 1. 用户输入的直接执行:如果应用程序直接将用户输入作为PHP代码执行,而没有进行充分的验证和过滤,攻击者可以通过提交恶意代码来执行任意操作。防范措施是使用合适的输入验证和过滤,例如使用白名单来限制允许的操作或使用安全的函数来处理用户输入。 2. 变量覆盖:如果应用程序在解析用户输入时,没有正确处理变量覆盖的情况,攻击者可以通过构造特殊的输入来覆盖应用程序中的变量,并执行恶意操作。防范措施是在处理用户输入之前,将其赋值给新的变量,并确保不会被覆盖已有的变量。 3. 文件包含漏洞:如果应用程序在包含文件时没有进行充分的验证和过滤,攻击者可以通过构造特殊的文件路径来包含恶意的PHP代码文件。防范措施是使用白名单来限制允许包含的文件路径,并对用户输入进行适当的过滤和验证。 4. 数据库查询注入:虽然不是直接的PHP代码注入,但数据库查询注入漏洞可能导致执行恶意的SQL语句,从而进一步执行PHP代码。防范措施是使用参数化查询或预处理语句,避免直接将用户输入拼接到SQL查询中。 总之,要防范PHP代码注入漏洞,开发者应该始终进行充分的输入验证和过滤,使用安全的函数和方法处理用户输入,避免直接执行或拼接用户输入作为代码执行。同时,定期更新和修复应用程序中使用的框架、库和组件,以确保使用的是最新的安全版本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值