官术网_书友最值得收藏!

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]包含返回導向編程的一個更完整的教程。雖然返回導向編程可能看起來很復雜,但這種復雜性可以被編程語言和編譯器抽象和隱藏,使得它成為一種可行的編寫利用代碼的技術。

主站蜘蛛池模板: 南开区| 响水县| 天峻县| 尼勒克县| 始兴县| 临漳县| 靖州| 开阳县| 凤阳县| 叶城县| 简阳市| 永安市| 开化县| 桃园县| 义马市| 石嘴山市| 长岛县| 嘉峪关市| 鱼台县| 雅安市| 贵港市| 营口市| 合江县| 穆棱市| 林州市| 基隆市| 长岭县| 高要市| 韩城市| 乌拉特中旗| 云梦县| 连南| 达尔| 高雄市| 正安县| 山阴县| 万年县| 木里| 陈巴尔虎旗| 凤台县| 三河市|