渗透基础——利用 Unicode 编码混淆字符串
0x00 前言
在渗透测试中,通常会对关键代码(例如 shellcode) 进行混淆,以此来对抗静态检测和分析。 我最近看到了一个有趣的样本,使用 Braille Patterns (盲文点字模型) 对字符串进行混淆,这对静态分析造成了很大的困难。
如下图
本文将会介绍这种利用 Unicode 编码混淆字符串的方法,通过程序分别实现对 Braille Patterns(盲文点字模型) 的编码和解码,分享使用其他 Unicode 字符表编码和解码的思路。
0x01 简介
本文将会介绍以下内容:
- 样本字符的实现原理
- 通过程序实现编码
- 通过程序实现解码
- 使用其他 Unicode 字符表编码和解码的思路
0x02 样本字符的实现原理
基础知识 1:Unicode
Unicode 是一个编码方案,是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求
简单理解:我们在计算机中看到的任何字符都对应唯一的一个 Unicode 码
对应到上面提到的样本,虽然使用了 Braille Patterns(盲文点字模型) 对人工分析造成了困难,但是如果将每一个字符转换成 Unicode 码,就可以克服这个问题
基础知识 2:Braille Patterns(盲文点字模型)
是专供盲人摸读、书写的文字符号
盲文共有 64 种符形,即每个字符的样式有 64 种
盲文点字模型在 Unicode 码表上共有 256 个区位,即有 256 个 Unicode 码对应盲文点字模型
为了能够支持更多的字符,在对应关系上使用以下方式:
- 小写英文字母对应单个 Unicode 码
- 阿拉伯数字对应两个 Unicode 码,第一个 Unicode 码固定为
U283C
- 大写英文字母对应两个 Unicode 码,第一个 Unicode 码固定为
U2820
注:小写英文字母也对应两个 Unicode 码,第一个 Unicode 码固定为 U2830
,但通常省略第一个 Unicode 码,我们在代码混淆的过程中,可以不遵循以上语法,提高代码分析的难度
例如先将代码作 base64 编码(共有 64 个字符),再随机对应到 Braille Patterns(盲文点字模型) 的 256 个区位上
综上,我们可以得出实现原理:将待加密的字符转换成 Unicode 码,再从 Unicode 码转换成实际的符号,所以解密也十分简单:不需要考虑符号多么复杂,先转换成 Unicode 码,再进行分析,为了提高效率,下面分别介绍程序实现编码和解码的方法
为了直观的理解,程序实现上均使用 Braille Grade 1 编码,即逐个字母的转换,不包括缩写等单词
0x03 通过程序实现编码
对于编码的实现,优先考虑简单实用,所以选择通过网页实现编码
可供参考的资料:http://www.byronknoll.com/braille.html
这个网站支持 Braille Grade 1 编码
通过查看源代码可以发现, http://www.byronknoll.com/braille.html
通过 js 脚本实现 Braille Grade 1 编码
所以我们只需要简单的修改(修复一些转码 bug,去掉一些功能)即可
查看转码过程是否存在 bug,我们需要知道每个盲文字符对应的 Unicode 码和 HTML 码,可供参考的资料:https://www.ziti163.com/uni/2800-28ff.shtml?id=83
Unicode 码同英文字符的对应关系可参考资料:http://www.doc88.com/p-695153826363.html
原来的代码分别支持大、小写字母,数字和部分特殊符号,在特殊符号的处理上存在一些 bug,例如 +
和 !
的转换不正确
我修改过的代码已上传至 github,可直接访问进行编码,地址如下:https://3gstudent.github.io/tool/BrailleGenerator.html
支持以下字符: 1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ),!/-.?;'$
测试如下图
注:我的代码只作为开发的模板,所以 +
和 !
的转换 bug 未修复,未支持 +
和 =
0x04 通过程序实现解码
为了能够同利用方式相结合(例如内存加载 PE 文件),所以这里使用 C sharp 实现
关于内存加载 PE 文件的细节可参考之前的文章 《通过.NET 实现内存加载 PE 文件》
程序实现流程如下:将从 BrailleGenerator.html 获得的盲文字符存储在数组中 2.将盲文字符转码成 Unicode 字符,需要注意阿拉伯数字和大写字母占用两个 Unicode 字符 3.通过对应关系,将 Unicode 字符转换成实际的字符
代码已上传至 github,地址如下:https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/BrailleToASCII.cs
支持以下字符: 1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ),!/-.?;'$
支持.Net3.5 及更新版本
编译命令如下:
C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe BrailleToASCII.cs
or
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe BrailleToASCII.cs
0x05 使用其他 Unicode 字符表编码和解码的思路
1.编码
将代码转换成 Unicode 码,通过自定义的映射关系生成新的 Unicode 码,最后转换成对应的符号
可供参考的代码:https://github.com/3gstudent/3gstudent.github.io/blob/master/tool/BrailleGenerator.html
2.解码
在利用上依照加密的映射关系进行解密就好
如果是分析代码经过混淆的样本,可在代码加载过程前设置断点,获得解码后的内容
0x06 小结
本文以 Braille Patterns(盲文点字模型) 为例,介绍了利用 Unicode 编码混淆字符串的基本方法,通过程序分别实现对 Braille Patterns(盲文点字模型) 的编码和解码,简要介绍使用其他 Unicode 字符表编码和解码的思路。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: Pupy 利用分析——Windows 平台下的屏幕控制
下一篇: Jvm 常量池
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论