当前位置:首页 > 经验 >

shellcode应该放在哪(shellcode使用教程)

来源:原点资讯(www.yd166.com)时间:2022-11-07 08:38:25作者:YD166手机阅读>>

在开始今天课程之前,先回忆下上一讲在结束时,我提出的windows平台下的几个关键问题:

1:缓冲区距离返回地址间的距离确定,或者说缓冲区大小的确定。一般我们通过调试可以直接看出缓冲区的大小。但是实际漏洞利用中,有时缓冲区的大小甚至是动态 的,这台机器上返回地址是200个字节的偏移,下个机器就可能变成208字节了。

2:定位shellcode的位置。栈帧中的缓冲区地址经常是不定的,尤其是在windows平台下。要想在淹没返回地址后准确的返回到shellcode上,像第5讲那样直接在调试中查出来写死在password.txt文件中肯定不行

3:定位需要的API。在shellcode中一般要完绑定端口建立socket侦听等功能,需要调用一系列windowsAPI。这些API的入口地址根据操作系统的版本,补丁版本会有很大差异。像第5讲中那样直接把API地址查出来是没办法写出稳定的,通用的shellcode的

4:shellcode对特定字节的敏感。在跟贴中已经有同学发现这个问题了,strcpy,fscan对于一些特定的字节有特殊的处理,如串截断符0x00等。当限制较少时,编写shellcode还可以通过选用特殊指令来避免这些值,但有时会限制比较苛刻,这将对shellcode的开发带来很大困难——用汇编写程序本来就够难了,还要考虑指令对应的机器码的值

5:shellcode的大小也很重要。即便是高手,完成一个比较通用的用于绑定端口的shellcode也要300~400字节。当缓冲区非常狭小时,有什么办法能够优化shellcode让它变得更精悍些呢?

这些内容就是接下来几讲我们将要关注的东西。今天我们主要来看第2个问题,怎样做到比较通用和稳定的确定缓冲区(shellcode)的位置。

回忆上一讲中的代码植入实验,当我们可以用越界的字符完全控制返回地址后,需要将返回地址改写成shellcode在内存中的起始地址。在实际的漏洞利用过程中,由于动态链接库的装入和卸载等原因,windows进程的函数栈帧很有可能会产生“移位”,即shellcode在内存中的地址是会动态变化的,因此像第5讲中那样将返回地址简单地覆盖成一个定值的作法往往不能让exploit奏效。

shellcode应该放在哪,shellcode使用教程(1)

图1

因此,要想使exploit不致于10次中只有2次能成功地运行shellcode,我们必须想出一种方法能够在程序运行时动态定位栈中的shellcode。

回顾上一讲中实验在verify_password函数返回后栈中的情况:

shellcode应该放在哪,shellcode使用教程(2)

图2

绿色的线条体现了代码植入的流程:将返回地址淹没为我们手工查出的shellcode起始地址0x0012FAF0,函数返回时这个地址被弹入EIP寄存器,处理器按照EIP寄存器中的地址取指令,最后栈中的数据被处理器当成指令得以执行。

红色的线条则点出了这样一个细节:在函数返回的时候,ESP恰好指向栈帧中返回地址的后一个位置!

一般情况下,ESP寄存器中的地址总是指向系统栈中且不会被溢出的数据破坏。函数返回时,ESP所指的位置恰好是我们所淹没的返回地址的下一个位置。

注意:函数返回时ESP所指位置与函数调用约定、返回指令等有关。如retn 3与retn 4在返回后,ESP所指的位置都会有所差异。



shellcode应该放在哪,shellcode使用教程(3)

图3

由于ESP寄存器在函数返回后不被溢出数据干扰,且始终指向返回地址之后的位置,我们可以使用上图所示的这种定位shellcode的方法来进行动态定位:

用内存中任意一个jmp esp指令的地址覆盖函数返回地址,而不是原来用手工查出的shellcode起始地址直接覆盖

函数返回后被重定向去执行内存中的这条jmp esp指令,而不是直接开始执行shellcode

由于esp在函数返回时仍指向栈区(函数返回地址之后),jmp esp指令被执行后,处理器会到栈区函数返回地址之后的地方取指令执行。

重新布置shellcode。在淹没函数返回地址后,继续淹没一片栈空间。将缓冲区前边一段地方用任意数据填充,把shellcode恰好摆放在函数返回地址之后。这样jmp esp指令执行过后会恰好跳进shellcode。

这种定位shellcode的方法使用进程空间里一条jmp esp指令做“跳板”,不论栈帧怎么“移位”,都能够精确的跳回栈区,从而适应程序运行中shellcode内存地址的动态变化。

下面就请和我一起把第5讲中的password.txt文件改造成上述思路的exploit,并加入安全退出的代码避免点击消息框后程序的崩溃。

我们必须首先获得进程空间内一条jmp esp指令的地址作为“跳板”。

上一讲中的有漏洞的密码验证程序已经加载了user32.dll,所以我们准备使用user32.dll中的jmp esp指令做为跳板。这里给出两种方法获得跳转指令。第一种当然是编程了,自己动手,丰衣足食。事实上所有的问题都能够通过自己编程来解决的。这是我的程序

#include <windows.h>

#include <stdio.h>

#define DLL_NAME "user32.dll"

main()

{

BYTE* ptr;

int position,address;

HINSTANCE handle;

BOOL done_flag = FALSE;

handle=LoadLibrary(DLL_NAME);

if(!handle)

{

printf(" load dll erro !");

exit(0);

}

ptr = (BYTE*)handle;

for(position = 0; !done_flag; position )

{

try

{

if(ptr[position] == 0xFF && ptr[position 1] == 0xE4)

{

//0xFFE4 is the opcode of jmp esp

int address = (int)ptr position;

printf("OPCODE found at 0x%x\n",address);

}

}

catch(...)

{

int address = (int)ptr position;

printf("END OF 0x%x\n", address);

done_flag = true;

}

}

}

jmp esp对应的机器码是0xFFE4,上述程序的作用就是从user32.dll在内存中的基地址开始向后搜索0xFFE4,如果找到就返回其内存地址(指针值)。

如果您想使用别的动态链接库中的地址如“kernel32.dll”,“mfc42.dll”等;或者使用其他类型的跳转地址如call esp,jmp ebp等的话,也可以通过对上述程序稍加修改而轻易获得。

除此以外,还可以通过OllyDbg的插件轻易的获得整个进程空间中的各类跳转地址。

这里给出这个插件,点击下载插件OllyUni.dll:OllyUni.rar.

把它放在OllyDbg目录下的Plugins文件夹内,重新启动OllyDbg进行调试,在代码框内单击右键,就可以使用这个插件了,如图:



shellcode应该放在哪,shellcode使用教程(4)

首页 123下一页

栏目热文

shellcode类书(shell编程零基础的书籍)

shellcode类书(shell编程零基础的书籍)

书籍简介黑客与渗透测试编程之道本书是畅销书《Python 灰帽子—黑客与逆向工程师的 Python 编程之道》的姊妹篇,...

2022-11-07 08:07:13查看全文 >>

shellcode执行方式(shell脚本的执行方法)

shellcode执行方式(shell脚本的执行方法)

本篇主要是以x64系统为例对系统调用中一些功能性函数的解读和实际运用。目前网络上流传的通用shellcode,均使用系统...

2022-11-07 08:13:07查看全文 >>

shellcode到底是啥(shellcode使用教程)

shellcode到底是啥(shellcode使用教程)

零基础学黑客领资料搜公众号:白帽子左一因前段时间退出了内网的学习,现在开始复习web方面的漏洞了,于是乎,开始了挖洞之旅...

2022-11-07 08:17:00查看全文 >>

shellcode生成可执行文件(shell脚本怎么变成可执行文件)

shellcode生成可执行文件(shell脚本怎么变成可执行文件)

原创: EDI-VOID 合天智汇0x00 shellcode编写首先shellcode的编写可以用纯汇编也可以用c ...

2022-11-07 08:36:40查看全文 >>

shellcode编码(shellcode代码)

shellcode编码(shellcode代码)

前言在做红蓝攻防时,常常要用到cs、msf等工具,使用工具生成shellcode或可执行程序,那么小小的shellcod...

2022-11-07 08:22:18查看全文 >>

通用shellcode编写实例(shellcode执行原理)

通用shellcode编写实例(shellcode执行原理)

1)编写 hello world 脚本#!/bin/bash # 编写hello world脚本 echo "...

2022-11-07 08:06:54查看全文 >>

shellcode怎么写(shellcode开发)

shellcode怎么写(shellcode开发)

这是2008年写的文章, 没有正式发表过,里面使用的环境不记得是i386Linux还是AMD64的Linux了。其实,叫...

2022-11-07 08:12:49查看全文 >>

shell脚本原理(shell脚本 基本知识)

shell脚本原理(shell脚本 基本知识)

Spring框架最新的PoC这两天出来的一个RCE漏洞,但是有以下的条件限制才行:必须是jdk9及以上必须是部署在tom...

2022-11-07 08:01:55查看全文 >>

shellcode免杀原理(shellcode免杀技巧)

shellcode免杀原理(shellcode免杀技巧)

原创AgeloVito合天智汇0x01 前言​ 2019年,告别了coder的世界,告别了从前的生活。我决定暂时抛开金钱...

2022-11-07 08:06:49查看全文 >>

shellcode一般满足什么要求(shellcode编程揭秘)

shellcode一般满足什么要求(shellcode编程揭秘)

作者:WeaponX预估稿费:400RMB投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿背景最近在...

2022-11-07 08:08:51查看全文 >>

文档排行