首页
社区
课程
招聘
[求助][求助]内核中想自己汇编构造seh,怎么却老失败
发表于: 2011-7-16 18:31 8641

[求助][求助]内核中想自己汇编构造seh,怎么却老失败

2011-7-16 18:31
8641


DWORD  scratch;

EXCEPTION_DISPOSITION
__cdecl
_except_handler(
struct _EXCEPTION_RECORD *ExceptionRecord,
	void * EstablisherFrame,
struct _CONTEXT *ContextRecord,
	void * DispatcherContext )
{
	unsigned i;

	// Indicate that we made it to our exception handler
	DbgPrint( "Hello from an exception handler\n" );

	// Change EAX in the context record so that it points to someplace
	// where we can successfully write
	ContextRecord->Eax = (DWORD)&scratch;

	// Tell the OS to restart the faulting instruction
	return ExceptionContinueExecution;
}

void TestException()
{

	DWORD handler = (DWORD)_except_handler; 
	__asm
	{ 
		// 创建 EXCEPTION_REGISTRATION 结构:
		push handler 	// handler函数的地址
		push FS:[0] 	// 前一个handler函数的地址
		mov FS:[0],ESP 	// 装入新的EXECEPTION_REGISTRATION结构
	} 

	__asm
	{
		mov eax,0     	// EAX清零
		mov [eax], 1 	// 写EAX指向的内存从而故意引发一个错误
	} 

	DbgPrint( "After writing!\n" ); 
	__asm
	{ 
		// 移去我们的 EXECEPTION_REGISTRATION 结构记录
		mov eax,[ESP]    	// 获取前一个结构
		mov FS:[0], EAX 	// 装入前一个结构
		add esp, 8       	// 将 EXECEPTION_REGISTRATION 弹出堆栈
	} 

}


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
有点意思,我现在手上没有环境,建议你断点下RtlDispatchException或者RtlpExecuteHandlerForException,看看里面的判断逻辑。RtlDispatchException在用户态和内核态有均有自己的实现,你应该分析的是内核中的那个版本。

再给一个链接,大牛写的,虽然很老,97年的 ,但有不错的参考价值。
http://www.microsoft.com/msj/0197/exception/exception.aspx
2011-7-16 21:39
0
雪    币: 237
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个问题之前也google 啊baidu啊,其实是搜索的关键字不恰当,
当我断定RtlDispatchException后,很快就看到
nt!RtlDispatchException中有个nt!RtlIsValidHandler

于是用SEH RtlIsValidHandler作为关键字搜索后才点恍然大悟感觉……
不能责怪MS的诡异,看来MS对这个Handler的校验确实有必要,比如溢出后有些手段是通过覆盖SEH的handler来达到触发shellcode的,这样就很有校验下handler的必要性。
我在帖子中疑惑_except_handler函数像像“未注册”,确实是这样,好像牵涉到PE里的Load Config Table,可以说是编译器自己编译的_except_handler4在这个table里“注册”了,

我主要翻了如下文章,有兴趣的自己看
内联汇编时使用SEH失败的原因 http://hi.baidu.com/fenjianren/blog/item/d90f941fceddcd64f724e442.html
Please don't DEP me, Sir  https://www.xfocus.net/bbs/index.php?act=ST&f=2&t=58881
绕过SEHOP安全机制 http://bbs.pediy.com/showthread.php?t=104707
SEH处理 http://wenku.baidu.com/view/aa892fce050876323112123b.html

相关关键字
SEH RtlIsValidHandler
SEH Load Config Table

感谢看雪。
2011-7-17 12:41
0
雪    币: 347
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不懂,先马克下
2011-7-17 13:11
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
你帖子中谈到用户态是可以的,是不是用户态下不会调用RtlIsValidHandler API?
2011-7-17 15:11
0
雪    币: 237
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
用户态我看了下,ntdll里面也会有这个函数触发,正好参数也是校验那个handler,但是我发现ring3下,这个校验函数我测试的一个情况都返回1,win7下和xp sp3都一样,就算传递个栈地址的handler或123这样的值也居然都返回1, 晕鸟,ring3这RtlIsValidHandler 不会是MS有bug吧

但是xp 下的内核中这个RtlIsValidHandler 则严格了,我设定的函数他就返回了0
2011-7-17 15:54
0
雪    币: 435
活跃值: (1277)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
7
push handler之前push一个struct指针试试
试试这个
typedef struct _msEH
{
DWORD unknow;//0xffffffff
DWORD filter;//指向一个函数,返回EXCEPTION_EXECUTE_HANDLER即可
DWORD exitproc;//指向一个地址,在这里卸载异常处理过程
}
2011-8-4 20:04
0
游客
登录 | 注册 方可回帖
返回
//