【问题标题】:Return-Oriented Programming: Why literal number used in ROP chain?面向返回的编程:为什么在 ROP 链中使用文字数字?
【发布时间】:2013-11-13 19:39:03
【问题描述】:

an article介绍Windows上的ROP之后,发现作者在ROP链中放了一些文字数字。

生成shellcode的代码sn-p:

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链应该由指向gadget的内存地址组成,因此CPU会顺序执行相应内存地址的指令。然而,作者将0xffffffff0x90909090 放在了小工具链中。

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

【问题讨论】:

  • pop EBX 指令使用堆栈中的下一个 dword 作为数据,而不是作为下一个小工具的地址

标签: assembly exploit windows-security


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

【讨论】:

    猜你喜欢
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多