堆栈溢出:Windows系统下的远程堆栈溢出1来源: 发布时间:星期三, 2008年12月17日 浏览:7次 评论:0
我们来研究windows系统下远程溢出思路方法
我们目是研究如何利用windows溢出来进行远程攻击 如果对于windows下缓冲区溢出不是很熟悉请大家复习我前面文章: window系统下堆栈溢出(IsBaseMagzine 20003) 本文以及后续实战篇都是建立在该文基础上 让我们从头开始windows 2000 Advanced Server(Build 5.00.2195) 第篇 原理篇 ----远程溢出算法 如何开个远程shell呢? 思路是这样:首先使敌人溢出让他执行我们shellcode 我们shellcode功能就是在敌人机器上用某个端口开个telnetd 服务器 然后等待客户来连接当客户连接上的后为这个客户开创个cmd.exe 把客户输入输出和cmd.exe输入输出联系起来我们 远程使用者就有了个远程shell(跟telnet样啦) 上面算法我想大家都该想得到这里面部分比较简单和Unix下基本 差不多就是加了个WSAStartup;为客户开创个cmd.exe就是用CreateProcess 来创建这个子进程;但是如何把客户输入输出和cmd.exe输出输入联系起来呢? 我使用了匿名管道(Anonymous Pipe)来完成这个联系过程 管道(Pipe)是种简单进程间通信(IPC)机制在Windows NT,2000,98,95下都 可以使用管道分有名和匿名两种命名管道可以在同台机器区别进程间以及区别 机器 上区别进程的间进行双向通信(使用UNC命名规范标准) 匿名管道只是在父子进程的间或者个进程两个子进程的间进行通信他是单向 匿名管道其实是通过用给了个指定名字有名管道来实现 管道最大好处在于:他可以象对普通文件样进行操作 他操作标示符是HANDLE,也就是说他可以使用readFile WriteFile来进行和底层实现无关读写操作!用户根本就不必了解网络间/进程间 通信具体细节 下面就是这个算法C实现: /*************************************************************************** */ /* Telnetd.cpp By Ipxodi tested in win2000 To illustrated the method of telnetd. Only _disibledevent= true; } } (we_loaded_it) FreeLibrary(h); /****************************************************************************/ 2)shellcode所使用问题 在shellcode里面使用了很多win32比如ReadFile,CreateProcess等等 这些必须加载到了敌人进程空间里面后我们才能使用 我们将攻击敌人远程服务里面并不能保证已经load了我们所需要 所有 我们希望可以作出个平台无关shellcode,这就必须: 不直接使用OS版本相关入口地址 这是入口地址是根据OS/SP/升级版本区别而可能区别 唯办法就是对使用每个win32都使用LoadLibrary加载dll 用GetProcAddress来获得地址这需要我们shellcode里面有个名表 保存每个所使用名并且在shellcode执行前上述两个 获得这些地址 但是又有个问题就是LoadLibrary和GetProcAddress本身地址如何获得呢? 我们想想这两个作用?"取得所有其他地址" 没错他们太重要了每个win32都要使用它们!那么我们目标呢? 肯定也会有它们所以在写exploit时候这两个地址都是确定 如何找到这两个在目标里面加载地址呢?它们会不会是根据敌人操作系统 区别而变化呢?不是这些动态加载都是在目标里面设置了个入口表 由目标自己去加载但是他入口表地址是固定 你可以使用wdasm32来搜索LoadLibrary和GetProcAddress, 可以看到它们对应入口表地址AAAA在shell 0
相关文章
读者评论
发表评论 |