系统调用功能号与execve函数详解

文章介绍了如何通过系统调用来实现简单的输出和程序执行。在x86架构下,使用int0x80指令进行系统调用,其中eax寄存器存放调用号,ebx,ecx,edx等寄存器传递参数。示例代码展示了write和exit系统调用的使用,以及execve函数调用的详细过程,用于执行新的程序。
摘要由CSDN通过智能技术生成

先看看下面通过系统调用实现的hello world代码:

.section .data
msg:
        .ascii "Hello world!\n"
.section .text
.globl _start
_start:
        movl $4, %eax			; 此为系统调用号,通过系统调用号,我们可以确定这次系统调用是为了使用write函数
        movl $1, %ebx			; write函数的第一个参数,是文件描述符
        movl $msg, %ecx		; write函数的第第二个参数,是输出字符串的地址
        movl $13, %edx			; write函数的第三个参数,是输出字符串的长度
        int $0x80						; 开始系统调用
        movl $1, %eax
        movl $0, %ebx
        int $0x80

系统调用是通过int 0x80来实现的,eax寄存器中为调用的功能号,ebx、ecx、edx、esi等等寄存器则依次为参数,从 /usr/include/asm/unistd.h中可以看到exit的功能号_NR_exit为1,write(_NR_write)功能号为4,因此第一个int 0x80调用之前eax寄存器值为4,ebx为文件描述符,stdout的文件描述符为1,ecx则为buffer的内存地址,edx为buffer长度。第二个int0x80之前eax为1表示调用exit,ebx为0表示返回0。

系统调用和函数调用的参数传递方式具体可以参考:
系统调用和函数调用的参数传递方式

系统调用功能号

这部分可以参考:

  1. https://asm.sourceforge.net/syscall.html#2
  2. Linux System Call Table
  3. LINUX SYSTEM CALL TABLE FOR X86 64
    调用功能号放在了/usr/include/asm/unistd.h之中,打开文件找到(我没找到)。
    总共有383条,就不细细讲述了

总的来说,操作系统是根据系统调用功能号来判断系统调用的功能的,所以要想程序按照我们设想的方式运行,就要正确地在eax中存放系统调用功能号,并且正确地填写系统调用的其他参数,才能实现功能。

execve函数详解

int execve(const char *filename, char *const argv[ ], char *const envp[ ]);

寄存器eax放execve的系统调用号11;
寄存器ebx放文件路径,即第一个参数;
寄存器ecx放第二个参数,是利用数组指针把内容传递给执行文件,并且需要以空指针(NULL)结束;
寄存器edx放最后一个参数,为传递给执行文件的新环境变量数组。

int 0x80:中断
执行系统调用函数execve()时,execve()通过int 0x80指令进入系统调用入口程序,并且把系统调用号11放入eax中,接着把参数放入ebx,ecx和edx中。

实例展示

#include<unistd.h>

int main(){
	char *argv[]={"ls","-al","/etc/passwd",NULL};
	char *envp[]={"PATH=/bin",NULL};
	execve("/bin/ls",argv,envp);   
	return 0;
}

执行后如图:

在这里插入图片描述
参考链接:
BUUCTF刷题——others_shellcode
int 80h系统调用方法

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值