【发布时间】:2015-05-15 15:38:33
【问题描述】:
我正在尝试在 Go 程序中执行 shellcode,类似于使用其他语言执行此操作的方式。
示例 1 - Shellcode in C program
示例 2 - http://www.debasish.in/2012/04/execute-shellcode-using-python.html
所有方法都有大体相似的技术——通过特定于操作系统的分配(mmap、virtualalloc 等)将 shellcode 分配给可执行内存,然后在执行前通过创建指向该位置的函数指针来执行代码。
这是我在 Go 中执行相同操作的可怕 hacky 示例。 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 频道上询问过,但有人建议这可能是不可能的。
非常感谢任何帮助。
干杯。
【问题讨论】:
-
如果你把它写到一个文件中,你不妨在它上面调用 syscall.Exec
-
@ReyCharles,这意味着编写格式正确的文件(如 Linux 上的 ELF、Windows 上的 PE 等)。不确定 Windows 是否仍然允许运行 MS-DOS COM 格式的文件(非常简单)。
-
是的,抱歉,我没想到 :)
标签: go function-pointers shellcode