发布于2022年11月8日3年前 0x00 前言 在渗透测试中,关键代码(如shellcode)经常被混淆,以对抗静态检测和分析。 最近看到一个有趣的样本,用盲文图案(盲文模型)混淆字符串,给静态分析造成很大困难。 如下图 示例地址: https://www . virus total . com/GUI/file/06f 90 a 471 f 65 de 9 f 9805 a 9 e 907d 365 a 04 f 4 ebed 1 BF 28 b 458397 ad 19 AfDB 9 AC 00/detection 本文将介绍这种利用Unicode编码混淆字符串的方法,并通过程序实现盲文图案(盲文图案模型)的编码和解码,并将编码和解码的思路分享给其他Unicode字符列表。 0x01 简介 本文将介绍以下内容: 样本字符的实现原理 用程序实现编码。 解码由程序实现。 关于使用其他Unicode字符表进行编码和解码的思考 0x02 样本字符的实现原理 基础知识1:Unicode Unicode是一种编码方案,它的产生是为了解决传统字符编码方案的局限性。它为每种语言中的每个字符设置了统一的、唯一的二进制代码,以满足跨语言、跨平台的文本转换和处理的要求。 简单理解:我们在电脑中看到的任何一个字符都对应一个唯一的Unicode编码。 与上面提到的样本相对应,虽然使用了盲文图案(盲文图案模型),人工分析有一定难度,但如果把每个字符都转换成Unicode编码,这个问题是可以克服的。 基础知识2:Braille Patterns(盲文点字模型) 是盲人读写的一种文字符号。 盲文有64个字符,即每个字符有64种样式。 盲文模型在Unicode编码表中有256个位置,即256个Unicode编码对应盲文模型。 为了支持更多的字符,在通信中使用了以下方法: 英文字母对应单个Unicode代码。 阿拉伯数字对应两个Unicode编码,第一个Unicode编码固定为U283C。 英文大写字母对应两个Unicode编码,第一个Unicode编码固定为U2820。 注: 英文小写字母也对应两个Unicode编码。第一个Unicode代码固定为U2830,但第一个Unicode代码通常会被省略。 在代码混淆的过程中,我们可以不遵循上面的语法来提高代码分析的难度。 例如,代码采用base64编码(共64个字符),然后随机对应盲文图案中的256个位置。 综上,我们可以得到实现原理:把要加密的字符转换成Unicode码,再把Unicode码转换成实际的符号。 所以解密也很简单:不需要考虑符号的复杂程度,先转换成Unicode码,再分析。 为了提高效率,下面介绍程序编码和解码的方法。 为了直观理解,程序实现采用盲文一级码,即逐字母转换,不包括缩写等词。 0x03 通过程序实现编码 对于编码的实现,优先考虑简单实用,所以我们选择通过网页实现编码。 可用信息: http://www.byronknoll.com/braille.html 本网站支持盲文1级编码。 查看源代码可以发现,http://www.byronknoll.com/braille.html通过js脚本实现盲文一级编码。 所以我们只需要简单的修改(修复一些转码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 支持以下字符:1234567890 abcdefghijklmnopqrstuvwxyzabcdefgijklmnoqrstuvwxyz)!/-.$ 测试下图 注: 我的代码只是作为开发的模板,所以用!的转换错误未修复,并且= 0x04 通过程序实现解码 为了和利用模式结合(比如在内存中加载PE文件),这里用的是C调。 关于在内存中加载PE文件的详细信息,请参考之前的文章《通过.NET实现内存加载PE文件》。 程序流程如下: 1.从BrailleGenerator.html获得的盲文字符存储在一个数组中。 2.要将盲文字符转码为Unicode字符,需要注意的是,阿拉伯数字和大写字母占用两个Unicode字符。 3.通过对应将Unicode字符转换为实际字符。 代码已经上传到github,地址如下: https://github . com/3g student/home-of-C-Sharp/blob/master/brailletoascii . cs 支持以下字符:1234567890 abcdefghijklmnopqrstuvwxyzabcdefgijklmnoqrstuvwxyz)!/-.$ 支持。Net3.5和更高版本 按如下方式编译该命令: C:\Windows\Microsoft。NET \ Framework \ v 3.5 \ CSC . exe brailletoascii . cs 或者 C:\Windows\Microsoft。NET \ Framework \ v 4 . 0 . 30319 \ CSC . exe brailletoascii . cs 0x05 使用其他Unicode字符表编码和解码的思路 1.编码 将代码转换成Unicode代码,通过自定义的映射关系生成新的Unicode代码,最后转换成相应的符号。 可供参考的代码: https://github . com/3g student/3g student . github . io/blob/master/tool/braille generator . html 2.解码 按照使用中的加密映射关系解密就好了。 如果是分析代码的混淆样本,可以在代码加载过程之前设置断点,获取解码后的内容。 0x06 小结 以盲文图案(盲文图案模型)为例,介绍了用Unicode编码混淆字符串的基本方法,并用程序实现了盲文图案(盲文图案模型)的编码和解码,并简要介绍了用其他Unicode字符表进行编码和解码的思路。 留下回复
创建帐户或登录后发表意见