主要通过IOPL和I/O位图来实现。 IOPL IOPL位于寄存器eflags的第12、13位。 I/O敏感指令如in、out等只有在CPLIOPL时才能执行。
也就是异常里可以出现异常 系统调用采用int和iret指令,可以进行堆栈切换以及特权级的转换,函数调用采用call和ret指令,一般情况下没有堆栈切换 遗漏的知识点参考kiprey,仅记录本人不熟悉的知识点 bios/linux.../dos中断的区别 bios/dos建立在实模式下,他们建立的中断调用都采用中断向量表,linux则是在进入保护模式后才建立中断例程,通过中断描述符表idt实现中断 文件 os通过文件系统的magic...IOPL(I/O Privilege Level)即I/O特权标志,位于eflag寄存器中,用两位二进制位来表示,也称为I/O特权级字段。该字段指定了要求执行I/O指令的特权级。...如 果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。 只有当CPL=0时,可以改变IOPL的值,当CPLIOPL时,可以改变IF标志位。...create_target,ucore.img) 其中dd命令和cp差不多,但dd更多的针对底层文件的复制. if和ifeq差不多,仍是实现条件判断的语句,实际上是判断后面的文件是否存在,比如/dev/zero就存在于linux
---- ---- linux下代码如下 #include #include #include #include #define...dev, fun; DWORD addr, data; printf("\nbus#\tdev#\tfun#\tvendor#\t\tdevice#\n"); if ( iopl...(3) < 0 ) { printf("iopl set error\n"); return -1; } for (bus = 0; bus...printf("\n--------------------------------------------\n"); } } if (iopl...(0) < 0 ) { printf("iopl set error\n"); return -1; } return 0; }
02bfe000 ecx=00000001 edx=0099b720 esi=00991100 edi=00991100 eip=00992158 esp=0098f9c0 ebp=0098f9dc iopl...02bfe000 ecx=00000001 edx=0099b720 esi=00991100 edi=00991100 eip=0099215d esp=0098f9c0 ebp=0098f9dc iopl...02bfe000 ecx=00000001 edx=0099b720 esi=00991100 edi=00991100 eip=00992158 esp=0098f9c0 ebp=0098f9dc iopl...02bfe000 ecx=009913a0 edx=00000000 esi=0098f9c0 edi=0098f9bc eip=009921d1 esp=0098f9bc ebp=0098f9dc iopl...02bfe000 ecx=009913a0 edx=10100444 esi=0098f9c0 edi=0098f9bc eip=009921d7 esp=0098f9bc ebp=0098f9dc iopl
linux的上下文切换就是进程线程的切换,也就是切换struct task_struct结构体,一个任务的上下文包括cpu的寄存器,内核栈等,由于1个cpu上的所有任务共享一套寄存器,所以在任务挂起的时候需要保存寄存器...但是Linux为了适用更多的cpu架构没使用处理器相关的上下文切换技术,而是大部分通过软件实现。linux上下文切换就在schedule()函数里,很多地方都会调用这个函数。...先看一段linux2.6.18版本还使用O(1)调度算法的schedule函数代码: /* * schedule() is the main scheduler function. */ asmlinkage...next->gs) loadsegment(gs, next->gs); /* * 如果prev和next的IO特权级不一样则需要重新装载 */ if (unlikely(prev->iopl...= next->iopl)) set_iopl_mask(next->iopl); /* * 处理debug寄存器和IO位图 */ if (unlikely((task_thread_info
记录管理着文件的信息,当可执行文件被加载到内存当作进程执行后,也有类似的数据结构来记录管理进程的执行情况,这个数据结构就是 $PCB(Process\ Control\ Block)$,进程控制块,$Linux...而 $IO$ 端口映射,使用 in/out 指令访问外设端口的方式也有特权级检查,这是由 EFLAGS 的 IOPL 位和 $TSS$ 的 $IO$ 位图共同决定 EFLAGS 的 IOPL 位共 $2...\ bit$,四种组合分别对应 $0,1,2,3$ 四种特权级,IOPL 是一个总开关,“只有”当前特权级大于 IOPL 才允许使用 $IO$ 指令,也就是说数值上 $CPL \leq IOPL$ 时才能使用...$IO$ 位图这个局部开关要在 $CPL \geq IOPL$ 的时候才有效,$CPL \leq IOPL$ 的时候本身就允许使用 $IO$ 指令对所有端口访问,$IO$ 位图是不起作用的。...准确点来说应该是下图这样: 图中有鲜明显色的区域都是实际映射到了物理内存的区域,其中蓝色部分才是 $malloc\ free$ 作用的区域,在 $Linux$ 中程序在内存中的映像有个属性叫做 $break
记录当前正在运行的代码所在内存段的特权级 描述符特权级 DPL — 位于 GDT 与 LDT 对应字段内,定义了一段内存的特权级 访问特权级 RPL — 位于段选择子中的低两位,用于在程序跳转中动态决定权限与 CPL IO 特权级 IOPL...IO 特权级 — IOPL 上文已经提到,位于 eflags 的 12、13 位的 IOPL 字段,控制了 IO 敏感指令的执行。...IO 敏感指令包括:in、ins、out、outs、cli、sti 这些指令只有在 CPL IOPL 时才能够执行。...而有两个非常特殊的指令:popf和iretf,他们能够改变 eflags 的 IF 位,这显然也是一个很敏感的操作,因此同样限制了只有在 CPL IOPL 时,这两个指令才能够实现 eflags...IO 的保护 通过 eflags 上的 IOPL 特权级与 TSS 指向的 IO 位图,IO 敏感操作也具有了严格的权限限制。
Docker Container Capabilities 在docker run命令中,我们可以通过--cap-add和--cap-drop来给容器添加linux Capabilities。...Docker’s capabilities Linux capabilities Capability Description SETPCAP CAP_SETPCAP Modify process capabilities...SYS_RAWIO CAP_SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2))....Implemented for the Smack Linux Security Module (LSM)....LINUX_IMMUTABLE CAP_LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags.
它新增加了四个控制标志位,它们是:IOPL、NT、RF和VM,这些标志位在实方式下不起作用。其它标志位的位置和作用与先前的完全相同。 其主要标志位的分布如下表所示。...31 … 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 … … VM RF NT IOPL OF DF IF TF SF ZF AF PF CF 一...三、32位标志寄存器增加的标志位 1、I/O特权标志IOPL(I/O Privilege Level) I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。...如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。 2、嵌套任务标志NT(Nested Task) 嵌套任务标志NT用来控制中断返回指令IRET的执行。
三、32位标志寄存器增加的标志位 1、I/O特权标志IOPL(I/O Privilege Level) I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。...如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。 2、嵌套任务标志NT(Nested Task) 嵌套任务标志NT用来控制中断返回指令IRET的执行。
00000000 ecx=7b324750 edx=00000000 esi=90909090 edi=7b324750 eip=7b2dd35c esp=012fcd68 ebp=012fce6c iopl...03128f00 ecx=012fd0c0 edx=00000001 esi=012fd0c0 edi=00000000 eip=00000032 esp=012fce7c ebp=012fce88 iopl...Linux提供了一些出色的工具,Valve经常忘记strip在macOS上发生了一件事情(许多其他开发人员也是如此)。 我们可以查看WinDBG提供的堆栈跟踪,以确定发生了什么。...03128f00 ecx=012fd0c0 edx=00000001 esi=012fd0c0 edi=00000000 eip=00000032 esp=012fce7c ebp=012fce88 iopl
ffffb70dd7eb7230 r12=fffff80ad4bc73d0 r13=00000000c0000001 r14=00000000000021f0 r15=fffff80ad4bc7360 iopl...运行 PoC 的最简单方法是创建一个运行最新Ubuntu Focal的 Linux 虚拟机。...完成后,克隆匹配的内核源: $ uname -a Linux Tourdeforce 5.4.0-73-generic # 82-Ubuntu SMP Wed Apr 14 17:39:42 UTC 2021...x86_64 x86_64 x86_64 GNU/Linux $ git clone git://kernel.ubuntu.com/ubuntu/ubuntu-focal.git $ cd ubuntu
ffffb70dd7eb7230 r12=fffff80ad4bc73d0 r13=00000000c0000001 r14=00000000000021f0 r15=fffff80ad4bc7360 iopl...PoC 的最简单方法是创建一个运行最新 Ubuntu Focal 的 Linux 虚拟机。...$ uname -a Linux tourdeforce 5.4.0-73-generic #82-Ubuntu SMP Wed Apr 14 17:39:42 UTC 2021 x86_64 x86_...64 x86_64 GNU/Linux $ git clone git://kernel.ubuntu.com/ubuntu/ubuntu-focal.git $ cd ubuntu-focal $ git
0x555555964520 [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu...= iopl(3)) { perror("iopl permissions"); return -1; } // leak srand, 分两次一次泄露4个byte...= iopl(3)) { perror("iopl permissions"); return -1; } // leak srand, 分两次一次泄露...Strng.html 其他参考 https://ray-cp.github.io/archivers/qemu-pwn-basic-knowledge https://web.cs.elte.hu/local/Linux-bible.../IO-Port-Programming/node2.html http://man7.org/linux/man-pages/man2/ioperm.2.html
QEMU是一个指令级模拟器的自由软件实现,被广泛用于各大GNU/Linux发行版。...QEMU是一个指令级模拟器的自由软件实现,被广泛用于各大GNU/Linux发行版(包括Debian, Gentoo, SUSE, RedHat, CentOS等)。...漏洞POC #include #define FIFO 0x3f5 int main() { int i; iopl(3); outb
05000000 ecx=00123e98 edx=00000000 esi=00f11100 edi=00124060 eip=30f0b5f8 esp=00123e7c ebp=00123ea8 iopl...05000000 ecx=0000c8ac edx=00000000 esi=1104000c edi=00123e98 eip=30ed4427 esp=00123e70 ebp=00123ea8 iopl...05000000 ecx=0000c8ac edx=00000000 esi=1104000c edi=00123e98 eip=30ed4429 esp=00123e70 ebp=00123ea8 iopl...05000000 ecx=0000322b edx=00000000 esi=1104000c edi=00123e98 eip=30ed442c esp=00123e70 ebp=00123ea8 iopl
04bdcfd8 ecx=6e61d340 edx=00000000 esi=01fbf144 edi=00000000 eip=6e6ac957 esp=01fbeb58 ebp=01fbf040 iopl...003fac98 ecx=00000003 edx=000000f7 esi=001bbdd4 edi=003fb000 eip=7d0706d0 esp=02a5f650 ebp=02a5f658 iopl...003f0000 ecx=41414141 edx=03128e40 esi=03128e38 edi=00000012 eip=7c930efe esp=0465f998 ebp=0465fbb8 iopl...0000035b ecx=00000000 edx=00000001 esi=088c8000 edi=00000000 eip=6887746f esp=044dee84 ebp=044dee88 iopl...138f0020 ecx=6e287a7e edx=10028a70 esi=008a0000 edi=00000000 eip=77691f88 esp=0011bbe8 ebp=0011bbf8 iopl
Linux 文件系统 目录 说明 bin 存放二进制可执行文件 sbin 存放二进制可执行文件,只有 root 才能访问 boot 存放用于系统引导时使用的各种文件 dev 用于存放设备文件 etc...是超级管理员 localhost 表示主机名 ~ 表示当前目录(家目录),其中超级管理员家目录为 /root,普通用户家目录为 /home/chan $ 表示普通用户提示符,# 表示超级管理员提示符 Linux...test.tar.gz 文件搜索命令 locate:在后台数据库搜索文件 updatedb:更新后台数据库 whereis:搜索系统命令所在位置 which:搜索命令所在路径及别名 find:搜索文件或文件夹 用户和组 Linux
004bec08 ecx=0049c2e0 edx=00000000 esi=0268e8f0 edi=00000000 eip=00000000 esp=0268e8c0 ebp=0268e8dc iopl...079d2fb0 ecx=082d1fc8 edx=00000000 esi=045eee50 edi=00000000 eip=6663c400 esp=045eee24 ebp=045eee3c iopl
0b7a00e0 ecx=7c93003d edx=0ef10020 esi=08ece6bc edi=00000000 eip=275a2738 esp=001216dc ebp=00121708 iopl...0b7a00e0 ecx=7c93003d edx=00140608 esi=08ece6bc edi=00000000 eip=275a273d esp=001216dc ebp=00121708 iopl
领取专属 10元无门槛券
手把手带您无忧上云