我正在尝试在Go程序中执行shellcode,类似于其他语言的做法。
示例1 - C程序中的Shellcode
示例2 - http://www.debasish.in/2012/04/execute-shellcode-using-python.html
所有方法的技术大致相似 - 通过操作系统特定分配(mmap、virtualalloc等)将shellcode分配到可执行内存中,然后创建一个指向该位置的函数指针并执行代码。
这是我用Go进行同样操作的可怕示例。在传递给函数之前,对shellcode进行了操作,因此其[]byte格式已固定。尽管如此,由于mmap期望传递文件描述符,因此存在可怕的“写入临时文件”的部分。
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频道上提问,但有人建议这可能是不可能的。
非常感谢任何帮助。
干杯。