一尘不染

在Go中执行字节数组

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频道上询问过,但有人建议这可能是不可能的。

任何帮助是极大的赞赏。

干杯。


阅读 454

收藏
2020-07-02

共1个答案

一尘不染

有多种方法可以做到这一点,尽管我自己还没有对其进行测试。

您可能想看看https://github.com/nelhage/gojit/blob/master/jit.go。
它实现了基于cgo的解决方案(比较安全,但速度较慢)和基于直接的解决方案。呼叫。查看所有与构建相关的功能。

2020-07-02