我试图通过覆盖位于这里的堆栈异常处理程序(SEH)来解释绕过堆栈cookie的问题:https://www.corelan.be/index.php/2009/09/21/exploit-writing-tutorial-part-6-bypassing-stack-cookies-safeseh-hw-dep-and-aslr/。
我要问的部分是堆栈cookie旁路演示2:网站的虚拟函数调用或PDF的第30页。
登记册的初始状态:
然后帖子上写着:
执行...these 4指令,试图将函数的地址加载到eax…中。
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条指令之后指向覆盖字符串?
我的理解是在第一次指令之后,
MOV EAX,DWORD PTR SS:[EBP-10]
EBP (0012 FF6C)减10 (十六进制?)等于0012 FF5C。位置0012FF5C的值为0012FF78。0012FF78是SEH在作为参数传递的堆栈中的更高位置。所以EAX = 0012FF78。到目前为止还不错,因为0012FF78是指向堆栈上SEH的指针的地址。
第二指令,
MOV EDX,DWORD PTR DS:[EAX]
EDX设置为EAX指向的位置的值。位置0012FF78的值为0040211C。EDX =0040211 C?
第三指令,
MOV ECX,DWORD PTR SS:[EBP-10]
ECX设置为0012FF78,与第一条指令相同,但使用ECX而不是EAX。这一指令对这一背景是否重要?
第四指令,
MOV EAX,DWORD PTR DS:[EDX]
EAX设置为EDX (0040211C)引用的值。EAX =?记忆中那个位置的东西。
我的计算机EAX (?)EDX (0040211C)与EAX (42424242)和EDX (0012FF78)后面的帖子不匹配。
我的解释出了什么问题?EDX == ECX不应该吗?谢谢。
发布于 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.vtable
。edx = 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
。
https://stackoverflow.com/questions/51900804
复制相似问题