x80指令来执行系统调用,参数使用如下: x86_64引入了一个新指令syscall来执行系统"og:type" content="webpage">x80指令来执行系统调用,参数使用如下: x86_64引入了一个新指令syscall来执行系统" /> x80指令来执行系统调用,参数使用如下: x86_64引入了一个新指令syscall来执行系统"> LINUX系统调用_软件运维_内存溢出

阅读 5

LINUX系统调用,第1张

系统调用是用户程序和linux内核交互的接口,linux的

系统

调用有下面三种方式:

在x86与x86_64的系统中,都可以使用int $0x80指令来执行系统调用,参数使用如下:

x86_64引入了一个新指令syscall来执行系统调用,耐纳局参数使用如下:

正茄卖常调用库函数( man 3 execve ),传参方式见 x86 调用约定

查看调用号:头文件

/usr/include/asm/unistd.h 内容如下,所以32位和64位的调用号可以分别在unistd_32.h和unistd_64.h中找到

查看参数: man 2 execve

以 execve 为例, man 2 execve 查看其接口如下: int execve(const char *pathname, char *const argv[], char *const envp[])

下面汇编实现了 execve("/bin/sh"昌让, 0, 0) :

32位:

64位:C语言有一个system函数(在<stdlib.h>头中,C++则为<cstdlib>头),可以用来调用终端命令

。虚则原型如下:

int system(const char *cmdline /* 命令字符串 */

)

例如,Linux系统中,调用system("ls -la")将输出当前目录下的所有文件详细信息。备誉槐

Windows系统的“终端”(命令提示符)和Linux中的终端不一样,仿友Windows系统中要实现同样功能,需要调用system("dir /a")

对system函数的详细解释见http://baike.baidu.com/subview/627587/14965930.htm。

根据调用需求,可以分为两种:

一、仅执行系统命令,不需要该命令的打印结果。

这种情况可以用system函数。形式为

system(cmd)

其中颂笑cmd为char*类型的字符串,包含要执行的命令,命令的执行结果会输出到标准输出。

比如

system("mkdir test")

这个执行,会在当前文件夹下创建test文件夹。

二、需要命令执行的打野历含印。

虽然同样可以使用system并重定向到文件,然后打开文件读取,最终删除文件。但这样做比较繁琐,更好的做法是使用popen。

FILE *fp = popen(cmd)

执行cmd中的命令,然后可以以C文件 *** 作方式,读取命令的输出结果。比如:

if((fp=popen("pwd","r"))==NULL)//执行获取当前目录的系统命令pwd。

{

    printf("执行失败\n")//fp为NULL表示命令执行失败。 

}

else

{

    char 烂段s[100]

    while(fgets(s, 100, fp))//获取文件内容。

        printf("%s", s)//输出结果。

    pclose(fp)//关闭。


}

欢迎分享,转载请注明来源:

内存溢出

原文地址:

https://outofmemory.cn/yw/12485253.html
结果
(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
互联网运营 互联网运营 一级用户组
如何把篆字转换成汉字
上一篇
2023-05-25
微信公众号里小程序appid如何获取
2023-05-25

发表评论
请登录后评论... 登录
提交

    评论列表(0条)
保存
{label} {label} x80指令来执行系统调用,参数使用如下: x86_64引入了一个新指令syscall来执行系统', author : '互联网运营', cat_name : '软件运维', time_y_m : '2023年05月', time_d : '25', site_motto : '内存溢出' }; {script} {script}