原创 pwnable.kr uaf

看題目就知道這是一道讓我們熟悉uaf漏洞的題,由於我本人也是第一次接觸uaf的概念,所以第一次會把概念瞭解詳細一點,還是先從題目入手 爲了方便學習我們先看源碼 #include <fcntl.h> #include <iost

原创 [windows內核]代碼段跳轉流程

代碼段間的跳轉(非調用門之類的) 段間跳轉,有兩種情況,要跳轉的是一致代碼段還是非一致代碼段 同時修改CS和EIP的指令 JMP FAR / CALL FAR / RETF / INT / IRETD 注意 只改變EIP的指令 J

原创 [windows內核]調用門

Windows系統並沒有使用調用門,但是沒用並不等於沒有,所以我們這次主要是靠自己實現,來完成這次的探究 關於調用門的說明在手冊第三卷的5.83中 下面是調用門的段描述符格式 可以看到有些值是固定的,這是調用門特有的,我們來逐

原创 [windows內核]代碼段跳轉實驗

本次實驗是爲了加深對跨段跳轉流程的印象 首先選一個已有的非一致代碼段的段寄存器,將其複製過來,寫入一個GDT表裏無效的位置中,怎麼區分段寄存器是否是代碼段前面已經有了,這裏不再重複 成功寫入 之後打開R3調試器 輸入彙編指令修

原创 pwnable.kr blukat

老樣子連上看看 cat blukat.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> char flag[100]

原创 [windows內核]長調用與短調用

相信大家都不陌生call指令了,但除了常見的段內調用(CS當前指向的段)外,還有其他幾種不同的調用,手冊上說明是有4種,在第 2A 卷: 指令集參考(A-L)中的CALL—Call Procedure 其中我們要說的另一種就是F

原创 [windows內核]段權限檢查

之前我們有提到過RPL和DPL的概念,RPL在段選擇子裏,DPL在段描述符裏 可以看到在Intle32手冊裏是這樣解釋他們的,但是關於段權限還有一個新的概念要提,也就CPL(當前特權級) 簡單理解就是特指CS段選擇子的第1

原创 [windows內核]段描述符屬性:D/B位

我們可以看一下段描述符,發現D/B位在這裏 也有簡單的說明在下面表示了D/B位的影響,下面我們就來詳細說一下具體的影響 情況一:對CS段的影響 D = 1 採用32位尋址方式 D = 0 採用16位尋址方式 前綴67 改變尋址方

原创 [windows內核]段描述符屬性:P位_G位

先說一下段描述符裏屬性P位的作用,也非常簡潔明瞭,P位的作用就是決定這個段描述符是否有效 P = 1 段描述符有效 P = 0 段描述符無效 那怎麼快速確定一個段描述符是否有效呢? 我們來舉一個例子 可以看到圖中紅色部分對應

原创 [windows內核]段描述符屬性:S位_TYPE域

GDT表裏的段描述符可以簡單的分成兩大類 1.代碼或者數據段描述符 2.系統段描述符 怎麼區分這個就需要靠S位 S = 1 代碼段或者數據段描述符 S = 0 系統段描述符 我們先說S=1時候的情況,如果S位等於1那麼他就是

原创 [windows內核]段寄存器屬性探測

上篇說到 段寄存器一共有96位,可見部分只有16位,也就是我們在od看到的段選擇子,還有80位是不可見的,我們可以通過mov指令進行讀寫[LDTR和TR除外] 段寄存器具有以下結構 struct SegMent { WORD S

原创 [windows內核]保護模式

x86 CPU的三個模式:實模式、保護模式和虛擬8086模式 現代的操作系統大多運行再保護模式下,所以我們重點關注在保護模式 保護模式最大的特點就是擁有 1.段的機制 2.頁的機制 這些都涉及保護模式下的內核如何尋址的問題,後面我

原创 [windows內核]段寄存器

什麼是段寄存器? 其實我們平常在OD調試中就可以看到,但是不會在意的,這裏顯示其實是段寄存器的一部分,稱爲段選擇子,下面我們具體會講。 還有就是我們平時在調試中經常會看到的彙編代碼 這裏其實我們真正寫入的地址是ds.base+

原创 [windows內核]段描述符和段選擇子

上面我們已經提到根據段引申出來的一個概念就是GDT(Global Descriptor Table 全局描述符表) GDT表與LDT表 通常情況下,在設計程序時,我們認爲段寄存器爲16-bit(雖然每個段寄存器事實上有一個64-b

原创 pwnable.kr brain fuck

老樣子,先審題 給了兩個文件,先下下來 bf拖ida裏康康,使用F5大法 int __cdecl main(int argc, const char **argv, const char **envp) { size_t i