操作系统
文章平均质量分 65
call就不要ret
大菜鸡一个,致力于向各位师傅学习,喜爱二进制安全。热爱钻研技术
展开
-
fastbins_Double Free调试
在我们程序第一次分配内存的时候,bins中是没有任何可以用的内存。此时我们在fastbins中会有三个chunk,因为libc没有再这里设置过硬的检查,并且这块空间在free的时候没有置为NULL,因此这片空间能够被当成正常的chunk在fastbins中链接。到目前为止,程序执行流程大致是glibc在malloc真正执行前,会先去检查是否有用户自定义的hook函数,如果有,就先行调用,如果没有就按正常的malloc执行。我们首先得知道,在fastbins中,被释放的chunk都是单链表链接起来的。原创 2023-11-12 18:16:27 · 131 阅读 · 0 评论 -
Windows驱动开发(一)第一个驱动程序
在我们提供的卸载函数中,我们目前也只提供打印一句话的功能。后来我想明白了,在我们想要加载我们的驱动程序的时候,操作系统其实为我们做好了初始化,为我们创建一个驱动对象。首先我们需要了解,在操作系统中,是分两种权限的,一种是内核态,我们也称为0环,一种是用户态,称之为3环。而在我们的电脑中,驱动程序是运行在内核态的,这意味着和操作系统内核是在同一权限的,而普通的应用程序的权限是最低的。我第一次接触这段代码的时候非常陌生和惶恐,竟然没有一句看懂的,但是只要我们耐下性子来研究这个东西,没什么难的。原创 2023-09-14 00:49:55 · 573 阅读 · 0 评论 -
判断网站是否开启CDN加速
由多个地段同时发起ping请求。通过CDN的原理我们知道,它是一种提速。如果多地ping延迟都很低多半是开启了CDN。如果有部分延迟较高多半是没有开启CDN。我们看到它跳转到xxxx.com去了,这说明csdn这个网页很可能开启了CDN加速的。我们可以在CMD中ping一下想要测试的网站。比如baidu.com。我们看到转向的还是baidu.com。这种情况下一般是没有做CDN加速。原创 2023-08-26 11:50:29 · 575 阅读 · 0 评论 -
手写操作系统--进入保护模式的开篇
低32位的16-31比特位与高32位的0-7和24-31共同组成了一个32位的线性地址(这个地址不是真实的物理地址是需要转换的)。低32位的0-15位和高32位的16-19位组成一个20位的界限,记录了这个段的长度。讲完了特权级我们回到段选择子中,看到第三个比特位TI,这是表示访问的是GDT还是LDT,如果为1访问的是GDT,如果为0访问的是LDT。为了兼容8086,A20线默认是关闭的,想要访问超过实模式下1M的内存,我们必须把这个A20线打开,有兴趣的可以查查这A20的历史,我也不是很懂。原创 2023-07-08 02:54:32 · 187 阅读 · 0 评论 -
手写操作系统--读写硬盘操作
在划分一下就会出现我们的扇区,每个扇区的大小是固定的,一般来说是512个字节。这个端口不同于网络协议中的端口,它是外部设备内部的寄存器,是用来提供一个通道给我们操控这个外部设备的。LBA模式也有2种,一种是用28位比特来表示一个扇区,一个是48位比特来表示一个扇区,分别成为LBA28,LBA48,我们只用LBA28模式就好了。效果图可以参考内核加载器那篇文章,用的就是此套函数将加载器加载到0x1000的内存位置,写硬盘逻辑刚好是相反的,目前还没用到,就没有实现此功能。有了上图的基础,我们就能用。原创 2023-07-07 16:17:13 · 1226 阅读 · 0 评论 -
手写操作系统--完善内核加载器之内存检测
注意: 在获取列表之后,可能希望对列表进行排序,合并相邻的相同类型范围,将任何重叠的区域更改为最严格的类型,并将任何无法识别的 "类型 "值更改为类型2。实际上,这个功能返回一个未排序的列表,可能包含未使用的条目,并且(在罕见/不稳定的情况下)可能返回重叠的区域。这一篇我们来完善内核加载器的功能,我们知道内存是很重要的区域,我们需要对内存有个大致的描述,哪些可用,那些不可用,内存有多大。代码完善后在内存检测开始前下了断点,效果图是这样的,首先看到内存中内核加载器的内容,在内核加载器下面是清一色的0。原创 2023-07-06 01:15:55 · 232 阅读 · 2 评论 -
手写操作系统--主引导扇区以及内核加载器
这个内核加载器并没有实现很多功能,只是模拟主引导扇区是否成功加载内核加载器。主引导扇区的功能主要是要将内核加载器加载到内存中。因此我们此次实验就模拟一个内核加载器,内核加载器的功能我们将慢慢完善。因为我的第一句代码是mov ax,0x0003,是占用3个字节,因此实际代码将会从0x7c02开始。3,调用硬盘读写功能,将硬盘中的第二个扇区开始的内核加载器写入内存0x1000的位置。屏幕输出了内核加载器的内容,并且确实加载进来了,因此实验成功。4,校检内核加载器的完备性,如果出现错误则跳转到输出错误语句。原创 2023-07-05 23:55:28 · 243 阅读 · 0 评论 -
汇编语言基础--IO输入输出解决光标问题
in指令 ---------------------------- out指令。我们之前在屏幕上输出数据的时候下标总是在前面,如何解决光标一直在前面的问题呢?想要控制光标位置,我们需要两个指令--输入输出指令来控制硬件。想要控制硬件,我们还需要往对应的端口上写上数据。一个是CRT 地址端口 0x3D4。一个是CRT 数据端口 0x3D5。0x0E 是光标位置的高八位。0x0F是光标位置的低八位。原创 2023-07-04 22:51:04 · 446 阅读 · 0 评论 -
汇编语言基础--内中断
里面放的其实是4个字节的地址(地址处放着对应的中断处理函数)。我们知道在8086实模式下,是通过cs:ip来找到要执行的指令。cs是2个字节,ip是2个字节,因此是4个字节。其中比较重要的有0号中断,有0x80中断,这就是Linux系统下的系统调用。是在386上才出现的。最后我在讲解下iret,其实他是中断返回指令。也就是中断函数执行完毕,将会把压入的cs,ip,flags弹出栈,接着执行下一条指令。我们看到在000-3FF的位置是放着中断向量表。执行到此处,我们的函数调用栈就完成了。原创 2023-07-04 19:06:35 · 194 阅读 · 0 评论 -
汇编语言基础--nasm语法数据类型
dd //define 一个字节 例如:dd 100dw //define 一个字 也就是两个字节例如:dw 0xaa55db //define 双字 也就是4个字节例如:db 0x12345678由于intel x86的架构采用小端存储因此二进制序列如下:如果是16进制在后面输入h例如:dw 0xaa55h如果是二进制在后面输入b例如:db 0x11001100bnasm语法允许使用下划线分割二进制方便观看例如:db 0x110原创 2023-07-04 17:12:55 · 434 阅读 · 0 评论 -
windows第三大结构体--KPCR
前面我们介绍了windows的两大结构体,一个是进程结构体,一个是线程结构体。KPCR是什么呢,是用于描述CPU的结构体。每一个CPU都有一个这样的结构体来描述CPU干了什么事。这三个成员和线程切换有关,第一个描述了当前在跑的线程,第二个描述了一会要切换的线程是谁,第三个是当没有线程需要执行的时候,执行的空闲线程是谁。在KPCR最后一个成员叫PrcbData,他是一个扩展结构体,也是放了很多有用的信息。1.在当线程切换的时候,也就是线程从3环进入0环时,FS:[0]->TEB切换成KPCR。原创 2023-06-23 22:22:26 · 757 阅读 · 0 评论 -
windows操作系统线程结构体
上一节讲进程结构体的时候,我没有介绍这个成员。依旧是一大堆成员,我们只关注一些比较重要的结构体成员。用于描述线程的线程环境块,存在于用户态。上一篇我们介绍了进程结构体,这节我们介绍下线程结构体:ETHREAD。这依然是一个双向链表,和上面存在于_KTHREAD的ThreadListEntry是一样的值。这三个成员是和堆栈切换相关的。我们知道在线程切换的时候,一定是伴随着堆栈切换的。这个成员描述当前线程的状态,是就绪态,还是运行态,还是阻塞态。这也是一个双向链表。一个进程的所有线程,都用这个链表串起来了。原创 2023-06-23 21:54:43 · 421 阅读 · 0 评论 -
windows进程结构体
这个成员规定了进程里面所有的线程能在哪个CPU上跑,我们知道CPU是有很多核心的,而且是多线程的。比如1的二进制是(00000001),一个比特位代表一个CPU,只有第0号比特位是置1的因此只能在0号CPU上跑,32位系统最多能有32个核。当操作系统创建一个进程的时候,它会填充一个结构体,往这个结构体里写入数据,这个结构体就用于管理这个进程了。在windows里面,每个进程在0环都有一个结构体,也就是说这个结构体是在内核中创建的。在0x1b0这个位置的成员是一个Peb,这是三环描述进程的结构体。原创 2023-06-23 15:34:45 · 325 阅读 · 0 评论 -
操作系统--信号量的实现
函数的作用是尝试获取信号量,如果信号量的值大于零,则将其减一并继续执行。当计数值等于零时,表示资源已被占用,需要等待其他线程释放资源(在哈工大操作系统上李志军老师的代码讲解中用sem来表示这个量,稍微有点小不同,但是思想是一样的)。的链表头,用于存储等待该信号量的线程的链表。当一个线程无法获取信号量时,它会被添加到该链表中,等待资源的释放(相当于一个等待队列,不过是用链表实现的)。函数是一个不可中断的下降操作,如果进程在等待过程中被中断信号中断,它将一直等待直到获取到信号量资源或者被显式唤醒。原创 2023-06-22 02:02:19 · 297 阅读 · 0 评论 -
操作系统--进程与线程
我们从计算机发展的历史角度来看,在早期的计算机中,只有一个CPU的时候,只能一个程序一个程序的执行,直到一个程序运行完成或者运行过程中出现问题而停止,下一个程序才会进入内存然后使用CPU。但是单单只是叫法不一样,不能解决我们的问题,我们特此还为进程配置了一个专门的数据结构--TCB(进程控制块)因此,进程比程序多了一个PCB来本质的区别进程和程序。其实可以把PCB理解为一个进程的“自传”,描述它这一生的路程,也就是从诞生到死亡的每一步记录,这是一个内核数据结构,用于表示和管理进程的状态和相关信息。原创 2023-06-16 20:26:57 · 121 阅读 · 1 评论 -
手写操作系统-基础配置
我这里跟大家不一样,因为我开始写这篇博客的时候,之前已经写入了BIOS和mbr,很早之前就写好的,以至于我自己都忘记了。如果是第一次做到这会弹出一个白色框框,报的是PANIC级别的错误,没有启动设备。我这没有跟书本一样是因为我已经写入了BIOS,虽然我删除了写入的代码来做演示写这篇博客,但是数据在里面,因此不一样不用觉得奇怪。接下来尝试运行bochs。做到这里其实需要建立一个虚拟硬盘,bochs都替我们做好了,这个工具是/bin/bximage。进入bochs,接着我们按下回车,接着输入我们的配置文件。原创 2023-06-03 23:34:24 · 248 阅读 · 0 评论