首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在缓冲区溢出/组装MOV中覆盖堆栈异常处理程序(SEH)

在缓冲区溢出/组装MOV中覆盖堆栈异常处理程序(SEH)
EN

Stack Overflow用户
提问于 2018-08-17 18:05:08
回答 1查看 402关注 0票数 1

我试图通过覆盖位于这里的堆栈异常处理程序(SEH)来解释绕过堆栈cookie的问题:https://www.corelan.be/index.php/2009/09/21/exploit-writing-tutorial-part-6-bypassing-stack-cookies-safeseh-hw-dep-and-aslr/

指向同一页面的PDF链接:https://repo.zenk-security.com/Reversing%20.%20cracking/%20Bypassing%20Stack%20Cookies,%20SafeSeh,%20HW%20DEP%20and%20ASLR.pdf

我要问的部分是堆栈cookie旁路演示2:网站的虚拟函数调用或PDF的第30页。

登记册的初始状态:

然后帖子上写着:

执行...these 4指令,试图将函数的地址加载到eax…中。

代码语言:javascript
运行
复制
 0040104D  |. 8B45 F0        MOV EAX,DWORD PTR SS:[EBP-10]
 00401050  |. 8B10           MOV EDX,DWORD PTR DS:[EAX]
 00401052  |. 8B4D F0        MOV ECX,DWORD PTR SS:[EBP-10]
 00401055  |. 8B02           MOV EAX,DWORD PTR DS:[EDX]

这4条指令的最终结果是

然后调用CALL EAX,在EAX中执行修改后的函数指针地址。

我的问题:

EAX和EDX如何在上述4条指令之后指向覆盖字符串?

我的理解是在第一次指令之后,

代码语言:javascript
运行
复制
 MOV EAX,DWORD PTR SS:[EBP-10]

EBP (0012 FF6C)减10 (十六进制?)等于0012 FF5C。位置0012FF5C的值为0012FF78。0012FF78是SEH在作为参数传递的堆栈中的更高位置。所以EAX = 0012FF78。到目前为止还不错,因为0012FF78是指向堆栈上SEH的指针的地址。

第二指令,

代码语言:javascript
运行
复制
 MOV EDX,DWORD PTR DS:[EAX]

EDX设置为EAX指向的位置的值。位置0012FF78的值为0040211C。EDX =0040211 C?

第三指令,

代码语言:javascript
运行
复制
 MOV ECX,DWORD PTR SS:[EBP-10]

ECX设置为0012FF78,与第一条指令相同,但使用ECX而不是EAX。这一指令对这一背景是否重要?

第四指令,

代码语言:javascript
运行
复制
 MOV EAX,DWORD PTR DS:[EDX]

EAX设置为EDX (0040211C)引用的值。EAX =?记忆中那个位置的东西。

我的计算机EAX (?)EDX (0040211C)与EAX (42424242)和EDX (0012FF78)后面的帖子不匹配。

我的解释出了什么问题?EDX == ECX不应该吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-18 17:06:11

是的,似乎错了

理论

所描述的方法通过在函数返回之前转移执行流来绕过GS保护(并检查金丝雀)。

这是通过通过缓冲区溢出的方式将堆栈中分配到更高位置的C++对象的C++污染来实现的。

带有虚拟成员的C++对象的布局是通过指向vtable的隐藏指针来增强的。

此指针是在内存中布局的类的第一个成员,请参见

对象被分配到堆栈的某个位置,但是指向对象的指针存储在[ebp-10h] (有效地址0x12FF5C),您可以通过查看PDF中显示受害者函数反汇编的第27页中的指令10 00401010 894df0 mov dword ptr [ebp-10h],ecx (更多信息)来看到这一点。

对于MOV EAX,DWORD PTR SS:[EBP-10],我们让eax保存指向C++对象的指针,即this,因为我们在一个成员函数和[ebp-10h] = original ecx中(参见下面)。eax = 12FF78h (ptr to this C++ object)

对于MOV EDX,DWORD PTR DS:[EAX],我们让edx保存指向this[0]的指针,即this.vtableedx = 40211ch (ptr到这个C++对象的vtable)。使用MOV EAX,DWORD PTR DS:[EDX]时,eax持有指向this.vtable[0] ie &bar的指针。eax = 401070h (ptr to bar)

MOV ECX,DWORD PTR SS:[EBP-10]只是将this移动到ecx中,这是thiscall (没有双关意)调用约定。

这也是我认识到[ebp-10h]this而不是指向另一个对象的指针的原因。

实现

复制后的堆栈是(与您发布的完全相同):

我们可以看到,C++对象没有被触摸,复制的缓冲区太短了。

攻击者还需要一个DWORD,在缓冲区中包含一个指针,在其中他们构建了一个新的vtable

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51900804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档