assembly - 面向返回的编程: Why literal number used in ROP chain?

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

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

最佳答案

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

关于assembly - 面向返回的编程: Why literal number used in ROP chain?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19746497/

相关文章:

c - printf 并且在汇编代码中不显示

c - 如何进行无限循环

ASP.NET 模拟问题(第 2 部分)

assembly - ARM 皮质 M0/M3/M4 :Why PC is always Even number in Thumb State

linux - 程序集:试图写入文件,但文本附加到文件名

汇编x86 "enter 0,0"的目的是什么

assembly - 我想手写一个ELF文件。如何让我的elf文件调用c标准库

security - 金丝雀是否可以防止返回到 libc 和面向返回的编程攻击?

windows - 什么是不同类型的 Windows token ,它们有何不同?