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

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

2011-7-16 18:31
8788


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 弹出堆栈
	} 

}


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

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

再给一个链接,大牛写的,虽然很老,97年的 ,但有不错的参考价值。
8e1K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3#2A6j5%4u0G2M7$3!0X3N6q4)9J5k6h3y4G2L8g2)9J5c8X3#2K6K9W2)9J5c8U0l9I4z5e0N6Q4x3V1k6W2P5r3y4W2M7s2c8A6L8$3&6Q4x3V1k6W2P5r3y4W2M7s2c8A6L8$3&6Q4x3X3g2S2M7%4m8^5
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失败的原因 434K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3S2A6i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3#2Q4x3V1k6X3k6h3&6B7K9h3q4F1M7X3g2F1i4K6u0r3j5X3I4G2k6#2)9J5c8X3W2@1k6h3#2Q4x3V1k6V1z5e0m8X3z5e0b7I4k6X3y4W2k6r3c8U0k6o6j5@1k6U0M7J5y4r3f1@1y4o6u0Q4x3X3g2Z5N6r3#2D9
Please don't DEP me, Sir  413K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2^5k6X3!0U0N6i4y4Q4x3X3g2F1k6i4c8Q4x3V1k6T1j5Y4y4Q4x3V1k6A6L8X3c8W2P5q4)9J5k6i4m8Z5M7q4)9K6c8X3q4U0N6q4)9K6c8q4y4f1i4K6t1$3k6W2)9K6c8o6u0Q4x3U0k6@1i4K6y4p5y4e0R3^5z5o6p5`.
绕过SEHOP安全机制 http://bbs.pediy.com/showthread.php?t=104707
SEH处理 363K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6W2L8X3E0#2i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3#2Q4x3V1k6$3K9h3g2%4i4K6u0r3j5h3p5^5z5e0u0X3j5$3f1H3y4e0l9^5y4K6j5K6x3U0x3I4x3e0t1I4x3U0y4T1i4K6u0W2K9s2c8E0L8l9`.`.

相关关键字
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
活跃值: (1422)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回