(1)段寄存器属性探测
生活随笔
收集整理的這篇文章主要介紹了
(1)段寄存器属性探测
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、段寄存器結構
段寄存器由4部分,共96位組成,其中段選擇子(Selector)是可見的,占16位;另外3部分占80位,不可見。下面通過程序論證不可見部分的存在。
詳細說明見代碼注釋,環境是VC6+XP。
二、段寄存器讀寫
我們可以使用MOV指令對段寄存器進行讀寫。
讀操作時,我們可以讀到段寄存器的段選擇子部分的16位。例如 mov ax,es 指令會把es寄存器的段選擇子讀到ax。
寫操作時,會寫入96位,其中源操作數的16位寫入到段寄存器的段選擇子部分,另外80位會根據段選擇子從GDT表(全局描述表)中獲取。因此,
mov ax,cs mov ds,ax實際上是把cs完整的復制給了ds。
三、測試Attribute
首先測試往SS段寫數據,運行不報錯。
#include <stdafx.h>int var = 0;int main() {// 段寄存器由4部分共96位組成,分別是// Selector(段選擇子):16位,是唯一可見的部分,實際上就是GDT表的下標// Attribute:16位,不可見,控制段的讀寫執行屬性// Base:32位,不可見,值是0(FS除外)// Limit:32位,和Base共同決定段的范圍// 讀段寄存器會讀到16位的段選擇子// 寫段寄存器會寫入16位段選擇子和剩余80位數據,后者是根據段選擇子從GDT表獲取的// 論證段寄存器權限控制的存在// 已知CS沒有寫權限,SS有寫權限__asm{mov ax,ss // 源操作數分別設置為SS和CS,觀察運行結果mov ds,axmov dword ptr ds:[var],eax}return 0; }
接下來測試向CS段寫入數據,我們知道CS段是沒有寫權限的。
運行結果證明了Attribute位的存在。
四、測試Base
int main() { // 論證Base的存在// 已知FS的Base不為0__asm{mov eax,fs:[0] // 編譯通過,運行成功,因為 fs.base + 0 可讀mov eax,ss:[0] // 編譯通過,運行報錯,因為 ss.base + 0 是NULL,不可讀}return 0; }五、測試limit
已知FS的limit是0xFFF
#include <stdafx.h>int var = 0;int main() { __asm{mov eax,ds:[var] // 編譯通過,運行成功,因為 ds.base + var 可讀mov eax,fs:[0x1000] // 編譯通過,運行報錯,因為 fs.base + fs.limit 超出fs段的范圍}return 0; }總結
以上是生活随笔為你收集整理的(1)段寄存器属性探测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 暴力关闭Windows defender
- 下一篇: (2)双机调试+符号文件