我读了一篇关于使用ROP绕过DEP/ASLR的文章(exploitresearch.wordpress.com)。接近尾声时,他为他的有效载荷布置了33个台阶。它们按照外壳代码指令写入最终有效载荷的顺序(也显示在最后的HxD映像@偏移量304中)。我对前几句话有点困惑:
1) 0x100016f0 (pop eax)
2) 0x01a19f7f (a value)
3) 0x10002fd7 (pop ecx)
4) 0x100bcc5a (another value)
5) mov [ecx], eax (*0x100bcc5a = 0x01a9f7f, delta between GetTimeZoneInformation and VirtualProtect)pop eax后面跟着值的地址如何将该值保存到eax中?我以为你得先推一下这个值然后再弹出电子邮件。
发布于 2017-03-21 12:50:12
没有必要执行任何推送操作,因为您已经控制了堆栈。您可以将希望存储在您的寄存器中的数据放在您可以方便地使用它们执行操作的位置。
在ROP中,您可以在目标程序中找到一系列有用的代码片段,这些代码段可以称为小工具,通常是正常子程序的尾部,这些子程序执行成功利用所需的操作。在执行“堆栈枢轴”将堆栈指针(尤其是x86中的堆栈)移动到数据之前,可以将希望执行的小工具的地址和希望与它们一起使用的数据排列在内存中的假堆栈中。
在堆栈指针被移动到您的数据后,程序的控制将在下一个ret中被没收到您的假堆栈中。执行此指令时,堆栈上的顶部单词/地址(在您的示例中为0x100016f0)将弹出,并放置到程序计数器中,以便将其重定向到某个函数尾部的小工具中,类似于pop eax; ret;。
在堆栈上的下一个单词是2) 0x01a19f7f (a value),当执行pop指令时,堆栈指针将已经指向该数据,并将这个单词存储在eax寄存器中。
然后,立即跟随的ret从下一个ROP小部件地址弹出,继续执行。
https://security.stackexchange.com/questions/154461
复制相似问题