日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

防止stack buffer overflows攻击的方法 : ShadowCallStack

發(fā)布時間:2025/3/21 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 防止stack buffer overflows攻击的方法 : ShadowCallStack 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

快速鏈接:
.
👉👉👉 個人博客筆記導(dǎo)讀目錄(全部) 👈👈👈

目錄

        • 1、介紹
        • 2、用法
        • 3、相關(guān)API
          • (1)、__has_feature(shadow_call_stack)
          • (2)、__attribute__((no_sanitize("shadow-call-stack")))
        • 4、示例
        • 5、總結(jié)
        • 6、參考

1、介紹

ShadowCallStack 是一個檢測通道,目前只為 aarch64 實現(xiàn),它可以保護程序免受返回地址覆蓋(例如堆棧緩沖區(qū)溢出 : stack buffer overflows)。它的工作原理是將函數(shù)的返回地址保存到函數(shù)序言中單獨分配的“shadow call stack”,子函數(shù)并從函數(shù)結(jié)語中的shadow call stack加載返回地址。

2、用法

要啟用 ShadowCallStack,只需將-fsanitize=shadow-call-stack 標志傳遞給編譯和鏈接命令行。在 aarch64 上,默認使用x18,即-ffixed-x18。

3、相關(guān)API

(1)、__has_feature(shadow_call_stack)

在某些情況下,可能需要根據(jù)是否啟用 ShadowCallStack 來執(zhí)行不同的代碼。宏__has_feature(shadow_call_stack)可用于此目的

#if defined(__has_feature) # if __has_feature(shadow_call_stack) // code that builds only under ShadowCallStack # endif #endif
(2)、attribute((no_sanitize(“shadow-call-stack”)))

用于__attribute__((no_sanitize("shadow-call-stack")))函數(shù)聲明以指定ShadowCallStack檢測不應(yīng)應(yīng)用于該函數(shù)

4、示例

示例代碼

int foo() {return bar() + 1; }

編譯時生成以下 aarch64 程序集

stp x29, x30, [sp, #-16]! mov x29, sp bl bar add w0, w0, #1 ldp x29, x30, [sp], #16 ret

添加-fsanitize=shadow-call-stack將輸出以下程序集

str x30, [x18], #8 stp x29, x30, [sp, #-16]! mov x29, sp bl bar add w0, w0, #1 ldp x29, x30, [sp], #16 ldr x30, [x18, #-8]! ret

5、總結(jié)

傳統(tǒng)的aarch64程序,在一進入子函數(shù)時,就會將LR、FP(x30、x29)保存到SP指向的棧中,在函數(shù)結(jié)束返回之前,再從棧中恢復(fù)這兩個寄存器。
然后加入-fsanitize=shadow-call-stack編譯選項后,在一進入子函數(shù)時,增加一步驟將LR(X30)也保存到X18寄存器指向的地址中,在函數(shù)返回時,再從X18指向的地址處恢復(fù)LR。
這種使用單獨的地址(X18指向的地址)來保存LR的值,就可以有效地避免了stack buffer overflows對LR值的攻擊

6、參考

Clang 13 documentation

總結(jié)

以上是生活随笔為你收集整理的防止stack buffer overflows攻击的方法 : ShadowCallStack的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。