對于一個二進制檢測專案,我在 NASM 中撰寫了一段匯編代碼,它在運行時被映射到二進制檔案的地址空間中。
該塊在 address 處加載instrument_addr,并且需要在 addressinstrument_addr data_offset處訪問資料,其中data_offset是某個固定的 31 位數字。由于 ASLR 我不知道instrument_addr在編譯時的價值。
由于我不知道我的檢測代碼的絕對地址,但我的資料的相對偏移量,我想使用 RIP 相對尋址:
; Example for data_offset = 0x1000
0: 48 8b 05 f9 0f 00 00 mov rax, QWORD PTR [rip 0xff9] # 1000
然而,最直接的方法
; This is offset 0 of my assembly file
instrument:
mov rax, qword [rel 0x1000]
只會導致:
$ nasm -f elf64 -o instrument.o instrument.asm
instrument.asm:3: warning: absolute address can not be RIP-relative [-w other]
使用[absolute 0x1000]帶有虛擬標簽產生同樣的警告。
如何強制 NASM 生成對某個固定偏移量的 RIP 相對訪問?
uj5u.com熱心網友回復:
您正在尋找的語法是[rel $ 0x1000]針對當前位置[rel instrument 0x1000]的偏移量,或針對標簽的偏移量。在您問題中的示例中,這些恰好是相同的,因為這mov是標簽之后的第一件事,但是如果兩者之間有任何內容,它們就會有所不同。
uj5u.com熱心網友回復:
Nasm 將您的代碼解釋為“使用 rip 相對尋址的訪問地址 0x1000”,因此它失敗了。你可以做的是使用$符號指定一個相對地址,它代表當前指令的地址:
mov rax, qword [rel $ 0x1000]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/349316.html
下一篇:用匯編語言列印輸入的字串
