我試圖在Go程序中執行shellcode,類似於您如何使用其他語言來執行。在Go中執行字節數組
實施例1 - Shellcode in C program
實施例2 - http://www.debasish.in/2012/04/execute-shellcode-using-python.html
所有方法都具有大致類似的技術 - 經由所述OS專用分配(MMAP,的VirtualAlloc等)分配的shellcode到可執行存儲器中,然後執行該代碼通過在執行之前創建指向該位置的函數指針。
這是我在Go中執行同樣的事情的可怕的黑客例子。 shellcode在傳遞給函數之前對其執行了操作,所以它的格式爲[]字節是固定的。說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
@ReyCharles一個文件,這將意味着寫入(在Windows等像ELF在Linux上,PE)格式正確的文件。不確定Windows是否仍然允許運行MS-DOS COM格式的文件(這是非常簡單的)。 – kostix
是的,對不起,我沒在想:) – ReyCharles