0x00漏洞信息 漏洞影響:本地提權 漏洞文件:win32kfull.sys 漏洞函數:vStrWrite04 漏洞原因:越界讀寫 分析系統:Windows 1903 0x01漏洞分析 崩潰時的堆棧: nt!KiBugCheckDebugBreak+0x12 nt!KeBugCheck2+0x952 ...
第一節
Hello,world!
背景知識
彙編語言是最基本的。程式員在實際硬體之上的唯一介面是內核本身。為了在彙編中構建有用的程式,我們需要使用內核提供的 Linux 系統調用。這些系統調用是內置於操作系統中的庫,可提供諸如從鍵盤讀取輸入和將輸出寫入屏幕等功能。
當您調用系統調用時,內核將立即暫停執行您的程式。然後它將執行您請求的任務所需的必要驅動程式,最後再將控制權返回給您的程式。
Note: 驅動程式 (Drivers) 之所以稱為“驅動程式”,是因為內核確實是使用它們來“驅動”硬體。
我們可以在彙編中完成這一切,方法是將我們要執行的函數號(即 OPCODE)載入到 EAX
中,並用我們要傳遞給系統調用的參數填充剩餘的寄存器。最後使用 INT
指令請求軟體中斷,內核將接管並使用我們的參數調用庫中的函數。
例如,當 EAX=1
時請求中斷將調用 sys_exit
,而當 EAX=4
時請求中斷將調用 sys_write
。如果函數需要,EBX
、ECX
和 EDX
將作為參數傳遞。單擊此處查看 Linux 系統調用表及其相應 OPCODES 的示例。
寫程式
首先,我們在 .data
部分創建一個變數“msg”
,併為其分配我們想要輸出的字元串,在本例中為“Hello, world!”
。在我們的 .text
部分中,我們通過為內核提供全局標簽 _start
: 來指示程式入口點來告訴內核從哪裡開始執行。
我們使用系統調用 sys_write
將信息輸出到控制台視窗。此函數在 Linux 系統調用表中指定為 OPCODE 4
。在請求執行任務的軟體中斷之前,該函數還接受 3 個參數,這些參數依次載入到 EDX
、ECX
和 EBX
中。
下麵這些就是傳入的參數:
EDX
字元串的長度ECX
在.data
段創建的字元串變數EBX
想要寫入的文件,例如STDOUT
傳遞的參數的數據類型和含義可以在函數的定義中找到。
使用以下命令編譯、鏈接和運行程式。
; Hello World Program - asmtutor.com
; 文件名:helloworld.asm
; 編譯:nasm -f elf helloworld.asm
; 鏈接(64位系統需要 elf_i386 選項):ld -m elf_i386 helloworld.o -o helloworld
; 運行:./helloworld
SECTION .data
msg db 'Hello World!', 0Ah ; 初始化變數msg
SECTION .text
global _start
_start:
mov edx, 13 ; 待寫入的位元組數(每個字母一個位元組,再加上換行符0Ah)
mov ecx, msg ; 將msg的記憶體地址移入ecx
mov ebx, 1 ; 表示寫入到標準輸出STDOUT
mov eax, 4 ; 調用SYS_WRITE(OPCODE是4)
int 80h
~$ nasm -f elf helloworld.asm
~$ ld -m elf_i386 helloworld.o -o helloworld
~$ ./helloworld
Hello World!
Segmentation fault