我試圖使用Linux中的LDT(局部描述符表)CS寄存器。我爲新代碼段設置了一個LDT條目LDT [0]。然後我嘗試用ljmp
更新%CS。我找到ljmp
指令後CS更新%,但隨後它只是一個printf
功能後改回原來%CS值。所以我想知道libc
修改%CS寄存器,但我不知道如何發生這種情況,我怎樣才能使用我自己指定的LDT?的libc如何修改Linux中
下面是代碼:
// allocate and setup an LDT entry
struct user_desc *def_seg = (struct user_desc *)malloc(sizeof(struct user_desc));
def_seg->entry_number = 0x0;
def_seg->base_addr = 0x0;
def_seg->limit = 0xfffff;
... ...
ret = modify_ldt(1, (void *)def_seg, sizeof(struct user_desc));
asm("movl %%cs, %0":"=r"(val)::); // get and print the %cs value
printf("val(cs) 0x%x\n", val); // val(cs) 0x73
// load the LDT into %cs, since x86 does not
// allow us to explicitly modify the %cs register
asm("ljmp $0x7, $reload_cs\n\t"
"reload_cs:\n\t");
asm("movl %%cs, %0":"=r"(val)::); // get and print the %cs value
printf("val(cs) 0x%x\n", val); // val(cs) 0x7
asm("movl %%cs, %0":"=r"(val)::); // after a printf. get and print the %cs value again.
printf("val(cs) 0x%x\n", val); // val(cs) 0x73
我使用自己分配的LDT只是想測試一些86分段功能的小型研究項目。
我的工作是i386機器與Ubuntu 14.04(內核版本4.1.9)。這只是一個試圖利用某些分段功能的小型研究項目。
你爲什麼要這麼做?什麼是用例?在哪個處理器和OS架構上? –
@BasileStarynkevitch:我正在使用Ubuntu 14.04(內核版本4.1.9)的i386機器。這只是一個試圖利用某些分段功能的小型研究項目。 – xiaogw