到目前为止,我的理解是,如果源代码中没有显式的异常处理程序,则每个线程都会获得一个自动的异常处理程序,另外还会有特定的处理程序。对于容易受到SEH BOF攻击的程序,缓冲区溢出将导致例如免疫调试器可在出现异常时暂停程序。仅在将异常传递给程序之后,
EIP
寄存器才会被恶意缓冲区覆盖。 传递异常后,用我的缓冲区中的值覆盖
EIP
和ESP
,然后将其他寄存器清零(在我的示例中为EAX
,EBX
,ESI
和EDI
)。因此我可以控制EIP
和ESP
,但是教程中提到由于归零寄存器的缘故,它是无用的。但是,他们从不解释为什么归零寄存器是问题所在-这是我的第二个缺乏理解。
问题2:
归零寄存器到底是怎么处理的,为什么它们会中断shellcode的执行?
现在我们也覆盖NSEH和SEH记录并使用模式可以找出确切的偏移量以覆盖这些记录。然后,神奇的是,引用了一些具有
POP POP RET
的模块,从而到达了ESP + 8
。最后跳?我可以利用该漏洞利用程序并且可以像这样处理它,但是如果不真正了解发生了什么,那感觉就很不令人满意,毫无意义。我最近才刚开始使用低级的东西,但仍然有很多东西要学习,因此我非常感谢您的每一次帮助。
#1 楼
首先,请阅读以下内容:https://www.blackhat.com/presentations/bh-asia-03/bh-asia-03-litchfield.pdf
这几乎就是所有的开始。
SEH缓冲区溢出是特定的堆栈溢出,其目标是
EXCEPTION_REGISTRATION_RECORD
沿堆栈向下任意距离。为什么难道不是每个程序都会发生这种情况,因为无论如何都应该有一个自动异常处理程序?
是的,因为您不能在Windows上真正禁用SEH。只要您的缓冲区溢出可以达到
EXCEPTION_REGISTRATION_RECORD
,并且您可以触发异常。在我的示例中为EAX,EBX,ESI和EDI。)从我的
ntdll.dll
版本10.0.17134.254
... />
XOR
拥有指向当前EAX
的指针,因此如果您用有效负载地址覆盖了EXCEPTION_REGISTRATION_RECORD
并将其设置为执行EXCEPTION_REGISTRATION_RECORD->Next
的随机指令,则可能是攻击向量。 > EXCEPTION_REGISTRATION_RECORD->Handler
已在JMP/CALL [EAX]
的开始处设置为EBX
。先前包含0
。RtlDispatchException
是PEXCEPTION_RECORD
,ESI
是PEXCEPTION_RECORD
。究竟是什么被清零的寄存器有什么用,为什么它们会中断Shellcode执行?
它们不一定。在执行处理程序之前,我们必须先经过
EDI
-> PCONTEXT
,最终无论如何都会覆盖所有寄存器。 这就是为什么内核在返回到用户模式之前将它们保存在
ntdll!KiDispatchUserException
结构中的原因。此漏洞利用并不是一个简单的
ntdll!RtlDispatchException
劫持。 为什么我需要POP POP RET和最终跳转?
您是不是为什么不直接将
CONTEXT
设置为shellcode?这是一个ROP小工具,可将执行重定向到
EIP
的值。如果您利用漏洞利用了那么远的地方,那么您可以控制EXCEPTION_REGISTRATION_RECORD->Handler
处的数据,但是您可能不一定事先知道这些数据。和处理程序执行。如果其中任何一个失败,程序将在运行处理程序之前终止。这些内容取决于您要定位的Windows版本。 SafeSEH是其中之一。很简单,它根据白名单验证处理程序地址,但无法验证未使用SafeSEH编译的模块中的处理程序。因此,如果POP / POP / RET来自未经SafeSEH加载和编译的模块,则ntdll无法确定它是否是恶意的。 再加上最后的一次跳动。
这是最好的部分!登陆后,我们可以将shellcode放在这里。除了我们需要完整的
ESP+8
之外,以便ESP+8
成为漏洞利用的第一部分。 POP / RET将返回。x86中的短跳转可以仅用2个字节进行编码。因此,此最后一次跳转在
ESP+8
上跳过了6个字节,因此它对于漏洞利用仍然有效。 2010年10月27日/流行音乐播放器-ret-instruction序列的需要/
评论
可能值得注意的是,这种基于堆栈的攻击在Microsoft的64位环境中不再起作用。请参阅文章osronline.com/article.cfm?article=469。对于32位程序(C ++),MS还提供了/ SAFESEH链接器选项,也可以防止此类攻击(如果我理解正确的话)。
–乔什
18-09-18在11:58