详解pwn-内核相关知识(1) – 作者:星云博创科技有限公司

由于一些原因,从ctf退役之后,从web转pwn的过程中,研究了一下0.11版本的linux内核,发现了很多之前在web层面想不明白的知识,虽然说操作系统是底层了,但是随着学习的深入,发现里面确实还有很多更深入的知识。笔者想要写一个系列的内核知识,此篇为第一篇,可以说此系列会见证一个内核选手的成长吧,笔者也相信自己会一直坚持下去的。

此篇的主要内容有:处理器、大小端序、存储相关知识、linux中断机制的原理。

0x01:Linux基础

Linux 5.x:支持很多CPU架构,目前较流行的
X86_64:PC和服务器
ARM64:主要用于移动设备

1)  处理器

复杂指令集计算机:具有80%复杂指令很少用到。

精简指令集计算机:去掉了不常用的指令,大部分简单指令能在一个周期内完成。

2)大小端序

1byte=8bit

16、32位的寄存器,寄存器宽度大于1字节,就会存在如何安排多字节的问题。

因此产生了大端序和小端序:

1、大端模式:高字节保存在内存的低地址
2、小端模式:高字节保存在内存的高地址
大小端序模式在处理器访问内存时用于描述:寄存器的字节顺序和内存中的字节顺序之间的关系。
v2-3ea5de19af3fd04bed5738f21321183b_720w.png
这两种都是读取0x12345678

可以看到:

大端序模式下地址的增长顺序和值的增长顺序相同。

小端序模式下地址的增长顺序和值的增长顺序相反。

如何判断CPU是大端序还是小端序:

联合体特性:存放顺序是所有成员从低地址开始存放。
代码解释:

v2-e3e6f1cf64bb866e6fbd2c48cd66f8ce_720w.pngv2-3adc23049b73b7b81193f75b02ecc7f8_720w.png

根据上面的图,一幕了然。

3)存储读写指令的全过程

CPU架构流水线:取指、译码、执行、数据内存访问、写回。

现代处理器:采用了超标量架构和乱序执行—->提高了指令级的并行效率、增加整个高速缓存和内存层次结构的实现难度。

存储—读—写:

指令首先进入流水线前端(预取、decode)
经过分发和调度进入执行单元,最后提交执行结果。
指令采用顺序方式通过前端,采用乱序方式进行发射,乱序执行,顺序方式提交执行结果。

最终结果更新到加载-存储队列中。

0x02:Linux中断机制

目的:

1. 硬件中的中断响应—->内核驱动中的中断

2. 系统调用的函数响应sys_call—–>系统调用

3. 自定义中断——->软件的软中断模式(下断点)

4. 信号中断——>了解信号使用创建

5. 系统的异常和错误——>系统的异常获取      了解异常作用

分类:

硬件中断、软件中断

硬中断:由电脑中主机的8259A类似的硬件中断控制芯片发出的中断

ARM中断控制器发出的中断

软中断:异常

第一类:CPU 自行保留的中断

第二类:系统调用异常

代码结构:

kernel 中

asm.s                       trap.c

system_call.s                 fork.c      signal.c    exit.c    sys.c

中断的工作流程:

做CPU工作模式的转化

进行寄存器的拷贝和压栈

设置中断异常向量表

保存正常运行的函数返回值

跳转到对应的中断服务函数上运行

进行模式的复原以及寄存器的复原

跳转回正常工作的函数地址继续运行

v2-6397ac1beaefd99dbff5ba01cd26578c_720w.png

中断前的处理过程,中断恢复过程,中断的执行过程
硬件中断的处理过程 asm.s trap.s
软件及系统调用的处理过程    system_call.s fork.c    signal.c    exit.c    sys.c

v2-da0dca51e9c511d5842995397b37afdc_720w.pngv2-a3c0c93b71582ee652f6dca18f4adf9e_720w.png
v2-46e8c72edcf4deea29866e7a14065b93_720w.png

0x03:小结

在文章末尾附上了源码,同时预告一下,下篇文章将与读者一起剖析kernel中的汇编源码,以及C语言程序。

最后附上笔者的联系方式:[email protected],希望能够与大家一起交流。

_divide_error:pushl $_do_divide_errorno_error_code:xchgl %eax,(%esp)pushl %ebxpushl %ecxpushl %edxpushl %edipushl %esipushl %ebppush %dspush %espush %fspushl $0    # "error code"lea 44(%esp),%edxpushl %edxmovl $0x10,%edxmov %dx,%dsmov %dx,%esmov %dx,%fscall *%eaxaddl $8,%esppop %fspop %espop %dspopl %ebppopl %esipopl %edipopl %edxpopl %ecxpopl %ebxpopl %eaxiret

来源:freebuf.com 2021-05-27 10:45:37 by: 星云博创科技有限公司

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论