打造Windows下自己的ShellCode

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

打造Windows下自己的ShellCode

适合读者:漏洞分析员、黑迷

前置知识:汇编阅读能力,漏洞调试基本步骤,VC使用方法

WTF:这几次的菜鸟版EXP系列文章都是重点讲解溢出编程的原理和思路,包括漏洞的定位,利用构造以及遇到限制时ShellCode的编码技巧等,但对ShellCode本身的编写,特别是Windows 环境下

适合读者:漏洞分析员、黑迷

前置知识:汇编阅读能力,漏洞调试基本步骤,VC使用方法

WTF:这几次的菜鸟版EXP系列文章都是重点讲解溢出编程的原理和思路,包括漏洞的定位,利用构造以及遇到限制时ShellCode的编码技巧等,但对ShellCode本身的编写,特别是Windows环境下ShellCode的初步编写,却很少提及。在文章中都是说发扬“拿来主义”,看准外面现成的ShellCode,直接拿来用,对不合规范的地方稍微改改就成——其实我们是有策略的,试想一来就一大堆汇编,初学者不晕就懵,不被吓跑才怪,所以前期重点放在激发大家的兴趣上。但作为一个菜鸟,在兴趣激起来后,毕竟要进入到ShellCode的编写中。一是因为Exploit很大的乐趣就在于ShellCode的编写,二是明白了ShellCode的编写,才能更好的使用和改进外面的代码。那,我们开始……

打造Windows下自己的ShellCode

文/图王炜/ww0830

为了帮助初学者了解ShellCode的编写,并能一步一步操作得到自己的

ShellCode,因此将Windows下ShellCode的编写过程作详细的介绍,以利于像我一样的菜鸟,最终能够写出简单的但却是真实的ShellCode;而进一步高级的ShellCode的编写,也会在系列后面的文章中一步一步的演示的,希望大家会发现,Exp真好,ShellCode最美妙!

ShellCode简介和编写步骤

从以前的文章和别人的攻击代码中可以知道,ShellCode是以

“\xFF\x3A\x45\x72……”的形式出现在程序中的,而Exploit的构造就是想方设法地使计算机能转到我们的ShellCode上来,去执行

“\xFF\x3A\x45\x72……”――由此看出,ShellCode才是Exploit攻击的真正主宰(就如同独行者是我们文章的主宰一样)。而ShellCode的

“\xFF\x3A\x45\x72……”那些值,其实是机器码的形式,和一般程序在内存里面存的东东是没什么两样的,攻击程序把内存里面的数据动态改成ShellCode的值,再跳过去执行,就如同执行一个在内存中的一般程序一样,只不过完成的是我们的功能,溢出攻击就这样实现了。

在此可以下个定义:ShellCode就是一段程序的机器码形式,而ShellCode的编写过程,就是得到我们想要程序的机器码的过程。

当然ShellCode的特殊性和Windows下函数调用的特点,决定了和一般的汇编程序有所不同。所以其编写步骤应该是,

1.构想ShellCode的功能;

2.用C语言验证实现;

3.根据C语言实现,改成带有ShellCode特点的汇编;

4.最后得到机器码形式的ShellCode。

其中最重要的是第三步――改成有ShellCode特点的汇编,将在本文的后面讲到。

首先第一步是构想ShellCode的功能。我们想要的功能可能是植入木马,杀掉防火墙,倒流时光,发电磁波找外星人等等(WTF:咳……),但最基本的功能,还是希望开一个DOS窗口,那我们可以在DOS窗口中做很多事情,所以先介绍开DOS 窗口ShellCode的写法吧。

C语言代码

比如下面这个程序就可以完成开DOS窗口的功能,大家详细看下注释:

#include

#include

typedef void (*MYPROC)(LPTSTR); //定义函数指针

int main()

{

HINSTANCE LibHandle;

MYPROC ProcAdd;

LibHandle = LoadLibrary(“msvcrt.dll”);

ProcAdd = (MYPROC) GetProcAddress(LibHandle, "System"); //查找

System函数地址

(ProcAdd) (""); //其实就是执行

System(“”)

return 0;

}

其实执行System(“”)也可以完成开DOS窗口的功能,写成这么复杂是有原因的,解释一下该程序:首先Typedef void (*MYPROC)(LPTSTR)是定义一个函数指针类型,该类型的函数参数为是字符串,返回值为空。接着定义MYPROC ProcAdd,使ProcAdd为指向参数为是字符串,返回值为空的函数指针;使用LoadLibrary(“msvcrt.dll”);装载动态链接库msvcrt.dll;再使用ProcAdd = (MYPROC) GetProcAddress(LibHandle, System)获得 System的真实地址并赋给ProcAdd,之后ProcAdd里存的就是System函数的地址,以后使用这个地址来调用System函数;最后(ProcAdd) ("")就是调用System(""),可以获得一个DOS窗口。在窗口中我们可以执行Dir,Copy等命令。如下图1所示。

图1

获得函数的地址

程序中用GetProcAddress函数获得System的真实地址,但地址究竟是多少,如何查看呢?

在VC中,我们按F10进入调试状态,然后在Debug工具栏中点最后一个按钮Disassemble和第四个按钮Registers,这样出现了源程序的汇编代码和寄存器状态

相关文档
最新文档