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
- 在program中尋找所有c3(ret)字節。
- 向前搜索,看前面的字節是否包含一個有效指令,這裡可以指定最大搜索字節數,以獲得不同長度的gadgets。
- 紀錄我們找到的所有有效指令序列。
理論上我们是可以這樣尋找 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; ret
,xor edx,edx; ret
- 系統調用
- 執行kernel中斷
- 如:
int 0x80; ret
,call gs:[0x10]; ret
- 會影響stack frame的gadgets
- 這些 gadgets 會改變 ebp 的值,從而影響stack frame,在一些操作如 stack pivot 時我們需要這樣的指令来轉移stack frame。
- 如:
leave; ret
,pop ebp; ret
ROP
http://example.com/2021/11/03/ROP/