- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 784字
- 2020-10-30 17:56:41
2.3.9 返回導向編程
返回導向編程攻擊技術與弧注入是類似的,但漏洞利用代碼不是返回函數,而是返回跟在return指令后的指令序列。任何這樣的可使用的指令序列都稱為小工具(gadget)。對于x86架構,一個小工具的圖靈完備集合已可以允許用返回導向語言編寫任意程序。圖靈完備的代碼庫小工具使用Solaris的libc片段,為構建返回導向漏洞的通用的編程語言和編譯器也已經被開發出來[Buchanan 2008]。因此,存在一個假設的返回導向編程漏洞的風險,對其他架構也可能是有效的。
返回導向編程語言,由一組小工具組成。每個小工具指定要放置在棧中的某些值,供代碼段中的一個或多個指令序列使用。小工具執行良好定義的操作,如裝載、加法或跳轉。
返回導向編程由執行所需操作的小工具共同組成。小工具由return指令與棧指針所指的小工具地址來執行。
例如,指令序列
pop %ebx; ret
形成一個小工具,它可以用于加載一個常數到ebx寄存器,如圖2.16所示。
圖2.16 用返回導向編程構建的小工具
圖2.16的左邊顯示把常量$0xdeadbeef復制到ebx寄存器所需的x86-32匯編語言的指令,并在右側顯示了等效的小工具。使用指向小工具的棧指針,CPU執行返回指令。由此導致小工具從棧中彈出該常數,并返回執行棧上的下一個小工具。
返回導向編程也支持有條件的和無條件的分支。在返回導向編程中,棧指針代替指令指針來控制執行流。一個無條件跳轉需要簡單地改變棧指針的值以指向一個新的小工具。這很容易使用如下指令序列來完成:
pop %esp; ret
圖2.17對無條件分支的x86-32位匯編語言編程和返回導向編程的慣用語法進行了對比。
圖2.17 無條件分支在x86-32位匯編語言(左)和返回導向編程的慣用語法
無條件分支可以用于棧上的一個較早的小工具,從而產生一個無限循環。有條件的迭代可以由一個條件分支跳出循環實現。
Hovav Shacham發表的“The Geometry of Innocent Flesh on the Bone”[Shacham 2007]包含返回導向編程的一個更完整的教程。雖然返回導向編程可能看起來很復雜,但這種復雜性可以被編程語言和編譯器抽象和隱藏,使得它成為一種可行的編寫利用代碼的技術。
- Redis入門指南(第3版)
- LabVIEW Graphical Programming Cookbook
- Ceph Cookbook
- HTML5 移動Web開發從入門到精通(微課精編版)
- 程序員數學:用Python學透線性代數和微積分
- Responsive Web Design with HTML5 and CSS3
- C語言最佳實踐
- 64位匯編語言的編程藝術
- Blender 3D Incredible Machines
- MongoDB權威指南(第3版)
- 微信小程序入門指南
- 移動界面(Web/App)Photoshop UI設計十全大補
- Mastering JavaScript Design Patterns(Second Edition)
- 微信小程序全棧開發技術與實戰(微課版)
- Python機器學習:預測分析核心算法