首页
社区
课程
招聘
[旧帖] [原创]__report_gsfailure中UEF的特殊行为 0.00雪花
发表于: 2011-5-9 14:11 3628

[旧帖] [原创]__report_gsfailure中UEF的特殊行为 0.00雪花

2011-5-9 14:11
3628

原本以为对UEF的逻辑已经大概了解了(理解UnhandledExceptionFilter),最近调试__report_gsfailure的时候却碰到了新问题。从VS2005以来,编译器添加了对栈的保护检查以防止buffer overrun的危害。一旦发现栈的内容出现错误,会调用__report_gsfailure,代码如下:­

1. DebuggerWasPresent = IsDebuggerPresent(); ­

2. _CRT_DEBUGGER_HOOK(_CRT_DEBUGGER_GSFAILURE); ­

3. ­

4. SetUnhandledExceptionFilter(NULL); ­

5. UnhandledExceptionFilter((EXCEPTION_POINTERS *)&GS_ExceptionPointers); ­

6. if (!DebuggerWasPresent) ­

7. { ­

8. _CRT_DEBUGGER_HOOK(_CRT_DEBUGGER_GSFAILURE); ­

9. } ­

10.TerminateProcess(GetCurrentProcess(), STATUS_STACK_BUFFER_OVERRUN); ­

使用一小段简单的代码即可测试之,­

char overBuf[8];­

DWORD dwForBuf;­

char anotherBuf[8];­

DWORD dwForAnotherBuf;­

dwForBuf = 0x12341234;­

// break compiler fense­

strcpy( overBuf, "12345678""\xcc\xcc\xcc\xcc""1234" );­

dwForAnotherBuf = 0xabcdabcd;­

strcpy( anotherBuf, "0123" );­

1. 使用VS调试的时候,执行到最后会在第2行_CRT_DEBUGGER_HOOK处断下来,不知道原因,怀疑是VS做了特别的处理,因为使用windbg调试的时候,就象是执行了一个普通的函数,没有任何问题。­

2. 使用windbg的时候,是断在了kernel32!UnhandledExceptionFilter里,也就执行第5行的时候,有个int 3的断点指令。记得UEF的处理逻辑是在调试器里运行的时候直接返回EXCEPTION_CONTINUE_SEARCH, 为什么会产生了断点? ­

3. 如果在调试器外执行,结果应该如何?

第一个问题的答案在这: __report_gsfailure中UEF的特殊行为(1) 

第二个问题的答案在这: __report_gsfailure中UEF的特殊行为(2) 

第三个问题的答案在这: __report_gsfailure中UEF的特殊行为(3) 


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
由这个问题还引出了另一个问题,一个Exe的import table是在加载DLL的时候修改的,那怎么能跟踪这个过程呢。我发现在初始断点的时候我需要跟踪的dll已经被load了,import table里已经填充了正确的值。
2011-5-11 09:27
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
大家对异常处理都没兴趣啊。
2011-6-14 23:09
0
雪    币: 1644
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享,学习。
2011-6-15 00:48
0
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我发现对这些真是不懂了
2011-6-16 01:46
0
游客
登录 | 注册 方可回帖
返回
//