Scapy的第二篇文章今晚发。
execve函数的使用方法本身来说没什么重要,但这是学习strace工具中比较重要的一个环节。
execve函数接受三个参数,execve(value1,value2,value3)
value1:这是命令所在的路径,一般来说是在bin下面
value2:命令的集合,比如说我在Terminal下输入的命令是ls -l ,那么命令的集合就是["ls", "-l"]
value3:传递给执行文件的环境变量集
下面我们来编写一段c语言程序实现ls -l的功能
//lstest.c
#include <stdio.h>
#include <unistd.h>
int main(int arg,char **args)
{
//char *name="/usr/bin/ls";
char *argv[]={"ls","-l","/root/",NULL};
char *envp[]={0,NULL};
execve("/bin/ls",argv,envp);
}
先让我们来编译运行一下,编译命令为gcc -o lstest lstest.c,输入命令./lstest运行,结果如下:
下面我们来看上面的代码,核心执行的代码就一句话execve("/bin/ls",argv,envp);
1、其中"/bin/ls"是参数一,代表的是执行的路径,这个相信大家都懂。
【ls是个可执行文件,用来显示文件,在bin目录下面】
2、然后参数二是一个命令的集合,比如说我们在Terminal输入的命令是ls -l /root/。那么这个命令分三段,第一段是ls,也就是上面说的可执行文件,第二段是可选参数,-l的意思是使用长列表的形式显示出来。第三个就是要显示的文件夹路径了。
【大家可能比较疑惑char *argv[]这种写法,其实这是种指针数组,千万不要跟数组指针搞混了,数组指针应该写成char (*argv)[],顾名思义,指针数组是一个数组,数组里面存储的是指针,根据上面对argv数组的定义,argv[0]是一个指针,指针指向的是一个字符数组,字符数组的第一位存的是字符‘l’,第二位存的是字符‘s’,所以argv[0][0]=='l',这下大家明白了吧,不清楚的可以自己写段c语言的程序试验一下,小镇就不详细说明了】
3、传递给执行文件的环境变量集,变量集就是{0,NULL},意义不明确,但是对大家理解没有太大用处。
execve函数执行成功不会反悔,但是执行失败则返回-1,失败的原因存在errno中。
错误代码
EACCES
1. 欲执行的文件不具有用户可执行的权限。
2. 欲执行的文件所属的文件系统是以noexec 方式挂上。
3. 欲执行的文件或script翻译器非一般文件。
EPERM
1.进程处于被追踪模式,执行者并不具有root权限,欲执行的文件具有SUID 或SGID 位。
2.欲执行的文件所属的文件系统是以nosuid方式挂上,欲执行的文件具有SUID 或SGID 位元,但执行者并不具有root权限
execve函数的使用方法本身来说没什么重要,但这是学习strace工具中比较重要的一个环节。
execve函数接受三个参数,execve(value1,value2,value3)
value1:这是命令所在的路径,一般来说是在bin下面
value2:命令的集合,比如说我在Terminal下输入的命令是ls -l ,那么命令的集合就是["ls", "-l"]
value3:传递给执行文件的环境变量集
下面我们来编写一段c语言程序实现ls -l的功能
//lstest.c
#include <stdio.h>
#include <unistd.h>
int main(int arg,char **args)
{
//char *name="/usr/bin/ls";
char *argv[]={"ls","-l","/root/",NULL};
char *envp[]={0,NULL};
execve("/bin/ls",argv,envp);
}
先让我们来编译运行一下,编译命令为gcc -o lstest lstest.c,输入命令./lstest运行,结果如下:
下面我们来看上面的代码,核心执行的代码就一句话execve("/bin/ls",argv,envp);
1、其中"/bin/ls"是参数一,代表的是执行的路径,这个相信大家都懂。
【ls是个可执行文件,用来显示文件,在bin目录下面】
2、然后参数二是一个命令的集合,比如说我们在Terminal输入的命令是ls -l /root/。那么这个命令分三段,第一段是ls,也就是上面说的可执行文件,第二段是可选参数,-l的意思是使用长列表的形式显示出来。第三个就是要显示的文件夹路径了。
【大家可能比较疑惑char *argv[]这种写法,其实这是种指针数组,千万不要跟数组指针搞混了,数组指针应该写成char (*argv)[],顾名思义,指针数组是一个数组,数组里面存储的是指针,根据上面对argv数组的定义,argv[0]是一个指针,指针指向的是一个字符数组,字符数组的第一位存的是字符‘l’,第二位存的是字符‘s’,所以argv[0][0]=='l',这下大家明白了吧,不清楚的可以自己写段c语言的程序试验一下,小镇就不详细说明了】
3、传递给执行文件的环境变量集,变量集就是{0,NULL},意义不明确,但是对大家理解没有太大用处。
execve函数执行成功不会反悔,但是执行失败则返回-1,失败的原因存在errno中。
错误代码
EACCES
1. 欲执行的文件不具有用户可执行的权限。
2. 欲执行的文件所属的文件系统是以noexec 方式挂上。
3. 欲执行的文件或script翻译器非一般文件。
EPERM
1.进程处于被追踪模式,执行者并不具有root权限,欲执行的文件具有SUID 或SGID 位。
2.欲执行的文件所属的文件系统是以nosuid方式挂上,欲执行的文件具有SUID 或SGID 位元,但执行者并不具有root权限