面向返回的编程:为什么在 ROP 链中使用文字数字



在一篇介绍Windows上的ROP的文章之后,我发现作者在ROP链中输入了一些文字数字。

生成外壳代码的代码片段:

rop += struct.pack('<L',0x10013b1c) # POP EBX # RETN
rop += struct.pack('<L',0xffffffff) # will be 0x1
rop += struct.pack('<L',0x100319d3) # INC EBX # FPATAN # RETN
rop += struct.pack('<L',0x100319d3) # INC EBX # FPATAN # RETN
                                    #------------------------------------[dwSize (0x1) -> EBX]-#
rop += struct.pack('<L',0x10030361) # POP EAX # RETN
rop += struct.pack('<L',0x90909090) # NOP
                                    #---------------------------------------------[NOP -> EAX]-#

据我了解,ROP 链应该由指向小工具的内存地址组成,因此 CPU 将按顺序在相应的内存地址执行指令。然而,作者将0xffffffff0x90909090放在小工具链中。

有人可以解释一下这些文字数字在 ROP 链中的使用吗?谢谢。

  • 在这个 ROP 链中,作者需要ebx才能0x1.但是,此二进制文件中堆栈上的条目为 4 个字节,因为这是一个 32 位二进制文件。为了实现这个条目,这个数字应该是0x00000001的,但已知写入空字节在利用中是不好的,因为像strcpy这样的函数在遇到空字节时会停止处理输入。因此,作者弹出 ebx 的 0xffffffff 值(使用前 2 行),然后将 ebx 的值增加 1 。这将环绕 32 位系统上的最大值,该值变为 0x00000001
  • 对于第二个文字数字0x90909090,这是一个NOP雪橇。 0x90NO-oPeration,它什么都不做。这可能是一个无用的雪橇,以满足作者试图溢出的缓冲区。
  • 还可以在绕过 ASLR 时看到其他文本数字,其中包括覆盖动态链接二进制文件的全局偏移表。在这种利用技术中,libc 中的特定函数将与 libc 基址处于特定偏移量。您需要找到此 libc 基址,从从 libc 获得的偏移量中,您可以计算这些函数的地址并在漏洞利用中使用它们。在此处阅读更多内容。

相关内容

  • 没有找到相关文章

最新更新