在Go中执行字节数组
我正在尝试在Go程序中执行shellcode,类似于您如何使用其他语言来执行它。
示例- http://www.debasish.in/2012/04/execute-shellcode-using-
python.html
所有方法都具有大致相似的技术-
通过操作系统特定的分配(mmap,virtualalloc等)将shellcode分配给可执行内存,然后通过在执行之前创建指向该位置的函数指针来执行代码。
这是我在Go中执行相同操作的可怕示例。shellcode在传递给函数之前已对其执行了一些操作,因此其格式为[]
byte是固定的。说mmap期望传入一个文件描述符,这就是为什么存在可怕的“写入tmp文件”部分的原因。
func osxExec(shellcode []byte) { f, err := os.Create("data/shellcode.tmp")
if err != nil {
fmt.Println(err)
}
defer f.Close()
_,_ = f.Write(shellcode)
f.Sync()
b, err := syscall.Mmap(int(f.Fd()), 0, len(shellcode), syscall.PROT_READ|syscall.PROT_WRITE|syscall.PROT_EXEC, syscall.MAP_SHARED)
if err != nil {
fmt.Println(err)
}
fmt.Printf("%p", b)
}
在代码的末尾,我以为假定的代码为可执行文件内存指向代码(切片?),但是我不知道如何将该地址转换为函数指针以便执行。我在一些IRC频道上询问过,但有人建议这可能是不可能的。
任何帮助是极大的赞赏。
干杯。
回答:
有多种方法可以做到这一点,尽管我自己还没有对其进行测试。
您可能想看看https://github.com/nelhage/gojit/blob/master/jit.go。
它实现了基于cgo的解决方案(比较安全,但速度较慢)和基于直接的解决方案。呼叫。查看所有与构建相关的功能。
以上是 在Go中执行字节数组 的全部内容, 来源链接: utcz.com/qa/409466.html