前言
在学习的时候发现很多地方都涉及到编码,特别是在学xss绕过的时候,一大堆编码,于是想学习一下编码方面的知识,并python和php写出编码的转换方式。最重要的是要了解生成编码的过程。
进制转换
在编码中很多都是用一个符号添加一个十六进制或者是十进制。
int('0xf',16);#十六进制转十进制,结果为15
int('17',8);#八进制转十进制,结果为15
int('10100111110',2);#二进制转十进制,结果为1342
-------------------------------------------------------------------------------
hex(1033);#十进制转十六进制,结果为0x409
hex(int('101010',2));#二进制转十六进制,结果为0x2a
hex(int('17',8));#八进制转十六进制,结果为0xf
-------------------------------------------------------------------------------
bin(10);#十进制转二进制,结果为0b1010
bin(int('ff',16));#十六进制转二进制,结果为0b11111111
bin(int('17',8));#八进制转二进制,结果为0b1111
-------------------------------------------------------------------------------
bin(10);#十进制转二进制,结果为0b1010
bin(int('ff',16));#十六进制转二进制,结果为0b11111111
bin(int('17',8));#八进制转二进制,结果为0b1111
-------------------------------------------------------------------------------
oct(0b1010);#二进制转八进制,结果为012
oct(11);#十进制转八进制,结果为013
oct(0xf) ;#十六进制转八进制,结果为017
ASCII
ASCII编码大致可以分作三部分组成:
- 第一部分是:ASCII非打印控制字符(参详ASCII码表中0-31);
- 第二部分是:ASCII打印字符,也就是CTF中常用到的转换;
- 第三部分是:扩展ASCII打印字符(第一第三部分详见 ASCII表 解释)。
Base编码
Base编码分为很多类,主要的是Base64、Base32、Base16
Base64
Base64只要学习过网安的都听过,是现在最常见的传输8bit字节代码的编码方式之一。
在网络刚出现的时候传输信息都是使用的都是英文,但随着用户的增多,使用如:中文、日文、阿拉丁文之类的用户也有需求,这时Base64就登场了。通过转换来让浏览器识别各种文字。Base64是由[A-Z]+[a-z]+[0-9]+[+ /]
共64位字符组成的,一般结尾会加上==
这样的符号。
转换过程
例子:字符串Man
-
第一步将每三个字节作为一组,每个字节占
8bit
,总共是24个二进制位。如果不够三字节,有几位算几位。 -
第二步,将这24个二进制位分为四组,每个组有6个二进制位。
-
第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节。
-
第四步,根据下表,得到扩展后的每个字节的对应符号,这就是Base64的编码值。
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y
简单阐述
-
先将字符分成三个一组,不够三个的就自己组合,如
abcde
,abc
为一组,de
为一组。 -
然后对应
ASCII表
获取十进制 -
将十进制转化为二进制
-
将二进制拆分开,以
6bit
为格式分成了四组,这里要看第一步,如果不够三个的在后面补上0补齐6的倍数。
-
将这四组前面都加上
00
让6bit
变成8bit
-
将
8bit
转为十进制 -
将十进制对应
Base64表
找到对应的字符
代码
python
python3和python2不一样,由于python3采用了unicode编码,而b64encode函数参数为byte类型,所以需要转换才可以使用。
import base64
a = 'Man';
b = base64.b64encode(a.encode('utf-8'))
c = base64.b64decode(b)
print(b);
print(str(c,'utf-8'));
------------------------------------
b'TWFu'
Man
PHP
<?php
$a = 'Man';
$b = base64_encode($a);
echo $b.'<br>';
echo base64_decode($b);
?>
-----------------------------
TWFu
Man
Base32、16
可以使用Python代码将64改成32或16进行使用,其他的只是在Base64进行修改。
shellcode编码
这个编码常见于拿shell
使用,所以叫shellcode
。
由\x
+十六进制
组合合成,在xss
和系统漏洞
中比较常用。
XXencode编码
和Base64非常像,差别就是UUencode多一个“-” 字符,少一个”/” 字符。
UUencode编码
这个好像很少用,先不学习。
URL编码
url编码又叫做百分号编码,是统一资源定位(URL)编码方式。
由%
+十六进制
组合合成
可以发现很多都是对十六进制的修改
Unicode编码
这个编码在xss中最常见,用来绕过WAF用的
源文本: The
&#x [Hex]: The(十六进制)
&# [Decimal]: The(十进制)
\U [Hex]: \U0054\U0068\U0065(十六进制)
\U+ [Hex]: \U+0054\U+0068\U+0065(十六进制)
敲击码
敲击码(Tap code)是一种以非常简单的方式对文本信息进行编码的方法。因该编码对信息通过使用一系列的点击声音来编码而命名,敲击码是基于5×5方格波利比奥斯方阵来实现的,不同点是是用K字母被整合到C中。
敲击码表
3 4 5
A B C/K D E
F G H I J
L M N O P
Q R S T U
V W X Y Z
莫尔斯电码
摩尔斯电码(Morse Code)是由美国人萨缪尔·摩尔斯在1836年发明的一种时通时断的且通过不同的排列顺序来表达不同英文字母、数字和标点符号的信号代码,摩尔斯电码主要由以下5种它的代码组成:
- 点(.)
- 划(-)
- 每个字符间短的停顿(通常用空格表示停顿)
- 每个词之间中等的停顿(通常用 / 划分)
- 以及句子之间长的停顿
摩尔斯电码字母和数字对应表:
A .- N -. . .-.-.- + .-.-. 1 .----
B -... O --- , --..-- _ ..--.- 2 ..---
C -.-. P .--. : ---... $ ...-..- 3 ...--
D -.. Q --.- " .-..-. & .-... 4 ....-
E . R .-. ' .----. / -..-. 5 .....
F ..-. S ... ! -.-.-- 6 -....
G --. T - ? ..--.. 7 --...
H .... U ..- @ .--.-. 8 ---..
I .. V ...- - -....- 9 ----.
J .--- W .-- ; -.-.-. 0 -----
K -.- X -..- ( -.--.
L .-.. Y -.-- ) -.--.-
M -- Z --.. = -...-