真理教教会

学习是美德,知识是财富,求道是目的

0%

逆向之什么是int 80h

https://0xinfection.github.io/reversing/pages/part-22-asm-program-1-moving-immediate-data.html

虽然文章给了很多信息,但对某些核心的要点表述太多,还好我有文心一言

内存空间

linux系统的内存空间分为:USER SPACE 和 LINUX KERNEL SPACE

其中,汇编产生的程序,其运行时的内容都在USER SPACE,int 80h在这里出现

其工作流程是:

  1. 准备参数:
    1. %eax寄存器:用于存放系统调用号,即要执行的系统调用的唯一标识符。
    2. %ebx%ecx%edx等寄存器:用于按顺序存放系统调用所需的参数。对于需要超过三个参数的系统调用,可能还会使用%esi%edi%ebp寄存器,或者在内存中分配空间并通过寄存器传递指向该空间的指针。
  2. 保存上下文,例如USERSPACE里的下一条指令,FLAGS和重要的寄存器数据,它们都会推送到栈里
  3. 跳转到中断描述符表(IDT)(或者中断向量符表)的第0x80项:中断服务例程(ISR)(下面有解释👇)
  4. 根据寄存器的内容,执行特定的系统调用
  5. 执行完之后,从内核态转到用户态 这个过程叫IRET
  6. pop被保存的上下文,即来到int80h下的第一条指令

中断向量符表

Interrupt Descriptor Table

其前身(不确定)Interrupt Vector Table

在内存的最底部,段地址和偏移地址都为0的地方,存在名为Interrupt Vector Table的数据结构
其包含256个条目,每个条目有4bytes,每个条目都是一个内存地址称为中断向量

其中第0x80项:中断服务例程(ISR)会读取%eax寄存器中的系统调用号,并根据该号码查找并调用相应的系统调用处理函数

总结

int 80h是进行系统调用的方法

一杯咖啡钱能温暖一个人的心