在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

回到顶部