渗透基础——利用 Unicode 编码混淆字符串

发布于 2024-11-08 13:48:58 字数 4732 浏览 0 评论 0

0x00 前言

在渗透测试中,通常会对关键代码(例如 shellcode) 进行混淆,以此来对抗静态检测和分析。 我最近看到了一个有趣的样本,使用 Braille Patterns (盲文点字模型) 对字符串进行混淆,这对静态分析造成了很大的困难。

如下图

Alt text

Alt text

样本地址:https://www.virustotal.com/gui/file/06f90a471f65de9f9805a9e907d365a04f4ebed1bf28b458397ad19afdb9ac00/detection

本文将会介绍这种利用 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),!/-.?;'$

测试如下图

Alt text

注:我的代码只作为开发的模板,所以 + 的转换 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

书信已泛黄

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

悲喜皆因你

文章 0 评论 0

亽野灬性zι浪

文章 0 评论 0

做个ˇ局外人

文章 0 评论 0

qq_QvE5B3

文章 0 评论 0

qq_E2Iff7

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文