亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

`%fs:0xfffffffffffffff8` 的真實地址是什么?

`%fs:0xfffffffffffffff8` 的真實地址是什么?

Go
慕容森 2022-05-23 15:50:36
我想使用ebpf.在閱讀了一些帖子和博客之后,我知道%fs:0xfffffffffffffff8指向ggo 的結構和mov %fs:0xfffffffffffffff8,%rcx指令總是出現在 go 函數的開頭。舉main.main個例子:func main() { 177341   458330:   64 48 8b 0c 25 f8 ff    mov    %fs:0xfffffffffffffff8,%rcx 177342   458337:   ff ff 177343   458339:   48 3b 61 10             cmp    0x10(%rcx),%rsp 177344   45833d:   76 1a                   jbe    458359 <main.main+0x29> 177345   45833f:   48 83 ec 08             sub    $0x8,%rsp 177346   458343:   48 89 2c 24             mov    %rbp,(%rsp) 177347   458347:   48 8d 2c 24             lea    (%rsp),%rbp 177348     myFunc() 177349   45834b:   e8 10 00 00 00          callq  458360 <main.myFunc> 177350 }我也知道 goid 信息存儲在ggo 的 struct 中。fs 寄存器的值可以通過函數的ctx參數獲取ebpf。但我不知道真正的地址是什么,%fs:0xfffffffffffffff8因為我是匯編語言的新手。誰能給我一些提示?如果 fs 寄存器的值為 0x88,那么 的值是%fs:0xfffffffffffffff8多少?
查看完整描述

1 回答

?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

這是一個負數,所以它是 FS 基數之前的一個 qword。您需要 FS 基地址,它不是您可以通過調試器看到的 FS 段寄存器中的選擇器值。

您的進程可能進行了系統調用以要求操作系統對其進行設置,或者可能wrfsbase在支持它的系統上的某個時候使用了該指令。

請注意,至少在 Go 之外,Linux 通常使用 FS 進行線程本地存儲。

(我不確定實際找到 FS 基礎的標準方法是什么;在rdmsr不可用的用戶空間中執行此操作顯然取決于操作系統;FS 和 GS 基礎作為 MSR 公開,因此操作系統使用它而不是實際修改 GDT 或 LDT 條目。 rdfsbase需要通過內核在支持 FSGSBASE ISA 擴展的 CPU 上的 CR4 中設置一個位來啟用,所以你不能指望它工作。)

@MargaretBloom 建議用戶空間可能觸發無效頁面錯誤;大多數操作系統將錯誤的虛擬地址報告回用戶空間。例如,在 Linux 中,SIGSEGV 具有地址。(如果它是非規范的,則為 SIGBUS,IIRC。即不在虛擬地址空間的低 47 位或高 47 位中,而是在地址不是低 48 的符號擴展的“洞”中。)

因此,您需要為這些信號安裝信號處理程序,并嘗試從位于內核空間中間的偏移量(基數為 0)或類似的地方加載。如果由于某種原因沒有故障,請將虛擬地址增加 1TiB 或循環中的某些內容。通常沒有 MMIO 映射到用戶空間的虛擬地址空間,因此僅讀取沒有副作用。


查看完整回答
反對 回復 2022-05-23
  • 1 回答
  • 0 關注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號