SGN
SGN是一款功能强大的多模式(多态)二进制编码工具,广大渗透测试人员可以在SGN的帮助下,轻松生成静态且不可检测的二进制Payload。SGN可以使用反馈循环来对给定的二进制指令进行编码,这种方式类似于LSFR。
工具特性
针对网络安全社区来说,原始版本的SGN编码器一开始被认为是最好的Shellcode编码器,直到现在其实也是。但多年以来,安全研究人员发现了静态检测编码器的几个Bug(相关内容可以参考FireEye的文章)。因此,社区不断地在对SGN进行改进,以期实现更好的编码功能。
当前版本的SGN实现了以下改进:
1、64位支持,可正确编码x64 Shellcode。
2、更小型的解码器Stub,LFSR密钥降低为1个字节。
3、使用伪随机模式的编码器Stub,解码器Stub也使用了伪随机模式编码。
4、解码器Stub混淆,添加了随即垃圾指令生成器。
5、安全注册选项,不会影响寄存器。
工具安装
依赖组件
该工具需要的依赖组件为keystone和capstone库,安装这两个库的方法如下:
OS
|
安装命令
|
Ubuntu/Debian
|
sudo apt-get install libcapstone-dev
|
Arch Linux
|
sudo pacman -S capstone keystone
|
Mac
|
brew install keystone capstone
|
Fedora
|
sudo yum install keystone capstone
|
Windows和其他平台
|
【点击这里】
|
在某些情况下,keystone库的安装可能会比较麻烦,如果遇到问题的话,可以参考这篇【文档】。
配置好依赖组件之后,你就可以使用下列命令将SGN项目源码克隆至本地:
go get github.com/egebalci/sgn
工具使用
“-h”选项可以直接查看工具的帮助信息,如果你想要查看编码过程的详细数据,可以使用“-v”选项来开启verbose模式。
以代码库的形式使用
警告!SGN包目前仍处于开发阶段,主要重心在性能提升上,大多数功能可能会因为版本不同而有区别。
package main
import (
"encoding/hex"
"fmt"
"io/ioutil"
sgn "github.com/egebalci/sgn/lib"
)
func main() {
// First open some file
file, err := ioutil.ReadFile("myfile.bin")
if err != nil { // check error
fmt.Println(err)
return
}
// Create a new SGN encoder
encoder := sgn.NewEncoder()
// Set the proper architecture
encoder.SetArchitecture(64)
// Encode the binary
encodedBinary, err := encoder.Encode(file)
if err != nil {
fmt.Println(err)
return
}
// Print out the hex dump of the encoded binary
fmt.Println(hex.Dump(encodedBinary))
}
工具执行流
下图显示的是SGN编码器的基本执行流程,但是请记住,在每次迭代中,垃圾指令、解码器和模式解码器的大小、位置和顺序都会发生变化。
LFSR本身在概率空间方面的功能是非常强大,下图显示了LFSR的特征多项式的伴随矩阵,并将种子表示为列向量,k步后寄存器在Fibonacci配置中的状态。
工具演示
【点我观看】
项目地址
SGN:【GitHub传送门】