第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用自修改代碼觀察在x86上獲取過時(shí)的指令

使用自修改代碼觀察在x86上獲取過時(shí)的指令

C
冉冉說 2019-07-30 17:31:19
使用自修改代碼觀察在x86上獲取過時(shí)的指令我被告知并且從英特爾的手冊(cè)中讀到可以將指令寫入內(nèi)存,但是指令預(yù)取隊(duì)列已經(jīng)獲取了陳舊的指令并將執(zhí)行那些舊的指令。我沒有成功觀察到這種行為。我的方法如下。英特爾軟件開發(fā)手冊(cè)從第11.6節(jié)開始說明對(duì)當(dāng)前在處理器中高速緩存的代碼段中的存儲(chǔ)器位置的寫入導(dǎo)致相關(guān)聯(lián)的高速緩存行(或多個(gè)行)無效。此檢查基于指令的物理地址。此外,P6系列和奔騰處理器檢查對(duì)代碼段的寫入是否可以修改已經(jīng)預(yù)取執(zhí)行的指令。如果寫入影響預(yù)取指令,則預(yù)取隊(duì)列無效。后一種檢查基于指令的線性地址。所以,看起來如果我希望執(zhí)行陳舊的指令,我需要有兩個(gè)不同的線性地址指向同一個(gè)物理頁面。所以,我將內(nèi)存映射到兩個(gè)不同的地址。int fd = open("code_area", O_RDWR | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);assert(fd>=0);write(fd, zeros, 0x1000);uint8_t *a1 = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC,         MAP_FILE | MAP_SHARED, fd, 0);uint8_t *a2 = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC,         MAP_FILE | MAP_SHARED, fd, 0);assert(a1 != a2);我有一個(gè)匯編函數(shù),它接受一個(gè)參數(shù),一個(gè)指向我想要更改的指令的指針。fun:     push %rbp     mov %rsp, %rbp     xorq %rax, %rax # Return value 0# A far jump simulated with a far return# Push the current code segment %cs, then the address we want to far jump to     xorq %rsi, %rsi     mov %cs, %rsi     pushq %rsi     leaq copy(%rip), %r15     pushq %r15     lretq copy:# Overwrite the two nops below with `inc %eax'. We will notice the change if the# return value is 1, not zero. The passed in pointer at %rdi points to the same physical# memory location of fun_ins, but the linear addresses will be different.     movw $0xc0ff, (%rdi)fun_ins:     nop   # Two NOPs gives enough space for the inc %eax (opcode FF C0)     nop     pop %rbp     ret fun_end:     nop在C中,我將代碼復(fù)制到內(nèi)存映射文件中。我從線性地址調(diào)用函數(shù)a1,但我將指針傳遞給a2代碼修改的目標(biāo)。#define DIFF(a, b) ((long)(b) - (long)(a))long sz = DIFF(fun, fun_end);memcpy(a1, fun, sz);void *tochange = DIFF(fun, fun_ins);int val = ((int (*)(void*))a1)(tochange);如果CPU選擇了修改后的代碼,則val == 1。否則,如果執(zhí)行過時(shí)指令(兩個(gè)nops),則val == 0。我在1.7GHz Intel Core i5(2011 macbook air)和Intel(R)Xeon(R)CPU X3460 @ 2.80GHz上運(yùn)行。但是,每次都看到val == 1表示CPU始終注意到新指令。有沒有人經(jīng)歷過我想觀察的行為?我的推理是否正確?我對(duì)提到P6和奔騰處理器的手冊(cè)有點(diǎn)困惑,以及缺乏提及我的Core i5處理器的原因。也許正在發(fā)生的其他事情導(dǎo)致CPU刷新其指令預(yù)取隊(duì)列?任何見解都會(huì)非常有幫助!
查看完整描述

3 回答

  • 3 回答
  • 0 關(guān)注
  • 587 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)