ROP

返回導向程式設計(Return-Oriented Programming)

是電腦安全中的一種漏洞利用技術,該技術允許攻擊者在程式啟用了安全保護技術(如堆疊不可執行)的情況下控制程式執行流,執行惡意程式碼。

其核心思想是通過stack overflow等方式控制stack呼叫以劫持程式控制流並執行針對性的機器語言指令序列(稱為Gadgets)。

Gadgets :以 ret (machine code: c3)為結尾的指令序列,通過這些指令序列,我們可以修改某些位址的內容,方便控制程式的執行流程。

ret 指令相當於 pop eip。即,首先將 esp 指向的 4 字節内容讀取並assign给 eip,然後 esp 加上 4 字節指向stack的下一个位置。如果當前執行的指令序列仍然以 ret 指令结束,則這個過程將重複, esp 再次增加並且執行下一个指令序列。

資料防止執行(Data Execution Prevention, DEP)

是一組在記憶體上執行額外檢查的硬體軟體技術,有助於防止惡意程式碼在系統上執行。

尋找gadgets

  1. 在program中尋找所有c3(ret)字節。
  2. 向前搜索,看前面的字節是否包含一個有效指令,這裡可以指定最大搜索字節數,以獲得不同長度的gadgets。
  3. 紀錄我們找到的所有有效指令序列。

理論上我们是可以這樣尋找 gadgets 的,但實際上有很多工具可以完成這個工作,如 ROPgadget,Ropper 等。更完整的搜索可以使用 http://ropshell.com/

常用的 gadgets

  • 保存stack數據到register
    • 將stack頂的數據pop並保存到register中,然後跳轉到新的stack位址。所以當返回位址被一個gadgets的位址覆蓋,程序將在返回位址後執行該指令序列。
    • 如:pop eax; ret
  • 保存memory數據到register
    • 將memory地址處的數據load到memeory中。
    • 如:mov ecx,[eax]; ret
  • 保存register數據到memory
    • 將register的值保存到内存地址處。
    • 如:mov [eax],ecx; ret
  • 算數和邏輯運算
    • add, sub, mul, xor 等。
    • 如:add eax,ebx; retxor edx,edx; ret
  • 系統調用
    • 執行kernel中斷
    • 如:int 0x80; retcall gs:[0x10]; ret
  • 會影響stack frame的gadgets
    • 這些 gadgets 會改變 ebp 的值,從而影響stack frame,在一些操作如 stack pivot 時我們需要這樣的指令来轉移stack frame。
    • 如:leave; retpop ebp; ret

ROP
http://example.com/2021/11/03/ROP/
Author
Xiung
Posted on
November 3, 2021
Licensed under