CTF中常见的编码,代码混淆及加、解密
其实刚开始我对编码与加密的概念区分的不是非常清楚,一度以为加密就是对信息进行编码,这是一种错误的观点。编码是将数据信息转化成一种固定格式的编码信息,而加密是为了保证信息传输的安全性,两者还是有区别的。接下来就给大家讲讲编码与加密、解密。
一,编码
编码是为了方便不同系统间的信息传输,将数据转化成固定格式的信息,通过编码可以得到原始信息。常见的编码我们都已经很熟悉了,比如ASCII编码、URL编码、HTML实体编码以及Base编码等。
1,ASCII编码
ASCII编码大致可以分作三部分组成:
第一部分是:ASCII非打印控制字符(参详ASCII码表中0-31);
第二部分是:ASCII打印字符,也就是CTF中常用到的转换;
第三部分是:扩展ASCII打印字符(详见 ASCII码表 二)。
例:easy—101 97 115 121
(ASCII表——来自百度百科)
(ASCII码表 二)
2,URL编码
又叫百分号编码,是统一资源定位编码方式。URL 地址(常说网址) 规定了常用地数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通过%xx 编码处理。编码方法很简单,在该字节 ascii 码的的 16 进制字符前面加%. 如空格字符,ascii 码是 32,对应16 进制是’20′,那么 urlencode 编码结果是:%20。
例:https://baike.baidu.com/item/ABC
URL转码: %68%74%74%70%73%3A%2F%2F%62%61%69%6B%65%2E%62%61%69%64%75%2E%63%6F%6D%2F%69%74%65%6D%2F%41%42%43
3,HTML实体编码
一些字符在 HTML 中是预留的,拥有特殊的含义,比如小于号‘<’用于定义 HTML 标签的开始。如果我们希望浏览器正确地显示这些字符,我们必须在 HTML 源码中插入字符实体。用一个编号写入HTML代码中来代替一个字符,在使用浏览器访问网页时会将这个编号解析还原为字符以供阅读。
(来自http://www.w3school.com.cn/html/html_entities.asp)
例:easy——easy
4,Base编码
Base家族主要有Base16、Base32、Base64。Base64由大小写字母和数字,+/组成(=号用作填充字符),Base32则是只有大写字母和234567。其中Base64/32是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。Base64编码保证了二进制数据的安全。
例:Base64:easy—ZWFzeQ==
(Base64的代码实现:https://baike.baidu.com/item/base64/8545775)
5、Unicode编码
Unicode编码有以下四种编码方式:
源文本:The
&#x [Hex]:The
&# [Decimal]:The
\U [Hex]:\U0054\U0068\U0065
\U+ [Hex]:\U+0054\U+0068\U+0065
6、莫尔斯电码(Morse Code)
摩尔斯电码(又译为摩斯密码,Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。是早期的数字化通信形式,但是它不同于现代只使用零和一两种状态的二进制代码,它的代码包括五种:点、划、点和划之间的停顿、每个字符之间短的停顿、每个词之间中等的停顿以及句子之间长的停顿。
除此之外,常用的编码方式还有敲击码(Tap code)等。编码在电子计算机、电视、遥控和通讯等方面广泛使用。编码是信息从一种形式或格式转换为另一种形式的过程;解码,是编码的逆过程。
二、常见的代码混淆
代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。目前已经存在许多种功能各异的代码混淆器。常用的代码混淆有jsfuck、brainfuck,Vbscript.encode加密等
1、Jsfuck
jsfuck源于一门编程语言brainfuck,其主要的思想就是只使用8种特定的符号来编写代码。而jsfuck也是沿用了这个思想,它可以让你只用 6 个字符`[ ]( ) ! + `来编写 JavaScript 程序。此外,JSFuck可用于绕过恶意代码检测,且可以被用于跨站脚本攻击。因为缺乏原生JavaScript应有的特征,类似JSFuck的JavaScript混淆技术可帮助恶意代码绕过入侵防御系统或内容过滤器。现实中,因为JSFuck中缺少字母数字字符,且eBay中的内容过滤器曾存在缺陷,使得卖家曾经可以在他们的eBay拍卖页面中嵌入任意JSFuck脚本
例:http://utf-8.jp/public/jsfuck.html
2、Brainfuck
Brainfuck是一种极小化的计算机语言,目标是建立一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。BrainFuck 语言只有八种符号,所有的操作都由这八种符号(` > < + – . , [ ] `)的组合来完成。
例:hello world
+++++ +++++ [->++ +++++ +++<] >++++ .—. +++++ ++..+ ++.
<+ +++++ ++[->----- ---<] >—- —– —– -.<++ +++++ ++[-> ++
+++ ++++< ]>+++ +++.—— –.++ +.— —.- —– –.<
在线解密工具: https://www.splitbrain.org/services/ook
3、Vbscript.encode加密
VBScript.encode是针对asp代码进行的一种加密混淆操作。
样题: http://ctf5.shiyanbar.com:8080/aspencode/
在线工具:http://adophper.com/encode.html
4、Jjencode
jjencode 将 JS 代码转换成只有符号的字符串,类似于 rrencode,介绍的,aaencode 可以将 JS 代码转换成常用的网络表情,也就是我们说的颜文字 js 加密。
例: http://utf-8.jp/public/aaencode.html
三、加密
密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。主要分为古典加密算法和现代密码学。
1,古典加密算法
古典密码算法曾经被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要对象是文字信息,利用密码算法实现文字信息的加密和解密。古典密码编码方法归根结底主要有两种,即置换和代换。比较经典的有凯撒密码、栅栏密码、培根密码、仿射密码和维吉尼亚密码等。
(1)凯撒密码
是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母按照按顺序进行 n 个字符错位转换后被替换成密文。
例:ABCDE(偏移量为3)—DEFGH
(2)栅栏密码
把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话即为栅栏密码。
例:明 文:The quick brown fox jumps over the lazy dog
去空格:Thequickbrownfoxjumpsoverthelazydog
分 组:Th eq ui ck br ow nf ox ju mp so ve rt he la zy do g
密 文:Teucbonojmsvrhlzdghqikrwfxupoeteayo
(3)培根密码
又名倍康尼密码(英语:Bacon’s cipher)是由法兰西斯·培根发明的一种隐写术。是一种替换密码,每个明文字母被一个由5字符组成的序列替换。最初的加密方式就是由‘A’和’B'组成序列替换明文
例:明文:THE DOG
密文:baabb aabbb aabaa aaabb abbba aabba
(4)仿射密码
仿射密码(Affine Cipher)是一种单表代换密码,字母表中的每个字母相应的值使用一个简单的数学函数映射到对应的数值,再把对应数值转换成字母。每一个字母都是通过函数(ax + b)mod m加密,其中B是位移量,为了保证仿射密码的可逆性,a和m需要满足gcd(a , m)=1,一般m为设置为26。
(5)维吉尼亚密码
维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。以其简单易用而著称,同时初学者通常难以破解,因而又被称为“不可破译的密码”。这也让很多人使用维吉尼亚密码来加密的目的就是为了将其破解。
例:明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
密钥(循环使用,密钥越长相对破解难度越大):CULTURE
加密过程:如果第一行为明文字母,第一列为密钥字母,那么明文字母’T'列和密钥字母’C'行的交点就是密文字母’V',以此类推。
密文:VBP JOZGM VCHQE JQR UNGGW QPPK NYI NUKR XFK
解密网站:https://www.qqxiuzi.cn/bianma/weijiniyamima.php
2,现代密码学
现代密码学研究信息从发端到收端的安全传输和安全存储,核心是密码编码学和密码分析学。1949年香农发表《保密系统的通信理论》标志着现代密码学的真正开始(第一次质的飞跃)。1976年,Diffie和Hellman发表《密码学的新方向》,标志着公钥密码体制的诞生(第二次质的飞跃)。
现代密码学根据功能分为三类:
①、对称加密算法:DES,AES,RC4等。
②、公钥密码算法:RSA等
③、HASH函数:md5,sha1
(1),对称加密算法
在对称加密算法中,数据发信方将原始数据和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去,收信方需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。特点是算法公开、计算量小、加密速度快、加密效率高。
对称加密的分类:流加密与分组加密
* 流加密每次加密数据流的一位(bit)或者一个字节(byte)。如RC4。
* 分组加密(通常也成为块加密)是将明文进行分组,加密算法对每个分组分别加密,通常明文分组和加密后得到的密文分组等长。典型的分组大小是64bit或128bit。如DES,3DES,AES。
(2),HASH算法
可直接音译为“哈希”,一般翻译为“散列”把任意长度的输入(又叫做预映射, pre-image),通过散列算法变换成固定长度的输出,该输出就是散列值。它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙。
常见HASH算法主要有MD5、SHA-1等。主要用于文件校验,数字签名,鉴权协议。另外这里还有一篇利用Hash碰撞而产生DOS攻击的案例,有兴趣的可以阅读一下:http://www.cnblogs.com/rush/archive/2012/02/05/2339037.html
(其实把hash算法当成是一种加密算法,这是不准确的,我们知道加密总是相对于解密而言的,没有解密何谈加密呢,HASH的设计以无法解为目的的。并且如果我们不附加一个随机的salt值,HASH口令是很容易被字典攻击入侵的)
(3),RSA算法
RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用,是现今使用最广泛的公钥密码算法。和其它加密过程一样,对RSA来说分配公钥的过程是非常重要的。分配公钥的过程必须能够抵挡中间人攻击。假设Eve交给Bob一个公钥,并使Bob相信这是Alice的公钥,并且她可以截下Alice和Bob之间的信息传递,那么她可以将她自己的公钥传给Bob,Bob以为这是Alice的公钥。Eve可以将所有Bob传递给Alice的消息截下来,将这个消息用她自己的密钥解密,读这个消息,然后将这个消息再用Alice的公钥加密后传给Alice。理论上Alice和Bob都不会发现Eve在偷听他们的消息。今天人们一般用可靠的第三方机构签发证书来防止这样的攻击。根据密钥的使用方法,可以将密码分为对称密码和公钥密码。
对称密码:加密和解密使用同一种密钥的方式
公钥密码:加密和解密使用不同的密码的方式,因此公钥密码通常也称为非对称密码。
RSA的加密过程可以使用一个通式来表达
密文=明文^E mod N
也就是说RSA加密是对明文的E次方后除以N后求余数的过程。
从通式可知,只要知道E和N任何人都可以进行RSA加密了,所以说E、N是RSA加密的密钥,即E和N的组合就是公钥,用(E,N)来表示公钥。
RSA的解密同样可以使用一个通式来表达
明文=密文^D mod N
即对密文进行D次方后除以N的余数就是明文,所以D和N的组合就是私钥,私钥=(D,N)
RSA常见攻击方式
①、利用rsa加密流程求参数
②、分解N求私钥
• 如果n的大小小于256bit,那么我们通过本地工具即可爆破成功。
• 如果n在768bit或者更高,可以尝试使用一些在线的n分解网站,这些网站会存储一些已经分解成功的n,比如:http://factordb.com
• 如果有多个n,可以尝试用求公约数的方式来求解两个N共同的素因子p,进而求解q
• 在p,q的取值差异过大,或者p,q的取值过于相近的时候,Format方法与Pollard rho方法都可以很快将n分解成功。此类分解方法有一个开源项目yafu将其自动化实现了,不论n的大小,只要p和q存在相差过大或者过近时,都可以通过yafu很快地分解成功。
③、共模攻击
如果在RSA的使用中使用了相同的模n对相同的明文m进行了加密,那么就可以在不分解n的情况下还原出明文m的值。
http://www.bystudent.com/?p=236
密码学在信息技术高速发展的当代具有很重要的意义,发展范围广且深。本文在写作过程中参考了许多资料,在此一并表示感谢。同时对于文章中涉及的知识只是粗略地简要介绍,如有不当之处还请指正。网上对密码学还有很多的资料,大家有兴趣的可以看一下。此外,文章中提到的各种解码及解密方式都可在这个网站中找到相应的工具(http://ctf.ssleye.com/)
**** 以下列出对于密码学学习很有帮助的参考资料 ****
密码学 – 维基百科,自由的百科全书
https://zh.wikipedia.org/zh-my/%E5%AF%86%E7%A0%81%E5%AD%A6
CTF中那些脑洞大开的编码和加密 – DaBan – 博客园
https://www.cnblogs.com/daban/p/5680451.html
代码混淆的重要性
密码学起源——由「凯撒加密」到「一次一密」
https://baijiahao.baidu.com/s?id=1621013260155177917&wfr=spider&for=pc
《现代密码学》 – WittPeng – 博客园
https://www.cnblogs.com/WittPeng/p/8978737.html
http://archive.keyllo.com/L-编程/Code-现代密码学—原理与协议.pdf
80%94%E5%8E%9F%E7%90%86%E4%B8%8E%E5%8D%8F%E8%AE%AE.pdf