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

时间:2013-11-02 20:25:19

标签: assembly exploit windows-security

an article在Windows上引入ROP之后,我发现作者在ROP链中添加了一些文字数字。

生成shellcode的代码段:

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链中使用这些文字数字吗?谢谢。

1 个答案:

答案 0 :(得分:1)

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