执行内联汇编
Execve inline assembly
我最近接触了 gcc 的内联汇编并掌握了基本的汇编知识,在尝试使用一个或多个参数进行简单的 sys_execve 之前,我了解如何很好地进行系统调用。
如果我没有向它传递任何附加参数,系统调用 execve 工作正常,并且在尝试传递任何参数时只运行不带参数的可执行文件。
#include <stdio.h>
char *argv[]={"/bin/echo","parameter test", NULL};
int main(){
__asm__ volatile ("int [=10=]x80"
:
:"a"(11), // syscall number (execve)
"b"(argv[0]), // filename
"c"(argv), // arguments
"d"(0)); // env
return 0;
}
我不知道会出什么问题,因为我已经用
测试过了
execve(argv[0], argv, NULL);
它按预期工作。
这是 32 位代码,使用 32 位约定。使用 gcc -m32
编译,它会工作。或者,切换到正确的 64 位版本,例如:
#include <stdio.h>
char *argv[]={"/bin/echo","parameter test", NULL};
int main(){
int ret;
__asm__ volatile ("syscall"
:"=a" (ret)
:"a"(59), // syscall number (execve)
"D"(argv[0]), // filename
"S"(argv), // arguments
"d"(0) // env
:"rcx","r11","cc");
return 0;
}
实际问题是数组中有 64 位指针,但您使用的 32 位兼容性中断当然需要 32 位指针。
我最近接触了 gcc 的内联汇编并掌握了基本的汇编知识,在尝试使用一个或多个参数进行简单的 sys_execve 之前,我了解如何很好地进行系统调用。 如果我没有向它传递任何附加参数,系统调用 execve 工作正常,并且在尝试传递任何参数时只运行不带参数的可执行文件。
#include <stdio.h>
char *argv[]={"/bin/echo","parameter test", NULL};
int main(){
__asm__ volatile ("int [=10=]x80"
:
:"a"(11), // syscall number (execve)
"b"(argv[0]), // filename
"c"(argv), // arguments
"d"(0)); // env
return 0;
}
我不知道会出什么问题,因为我已经用
测试过了execve(argv[0], argv, NULL);
它按预期工作。
这是 32 位代码,使用 32 位约定。使用 gcc -m32
编译,它会工作。或者,切换到正确的 64 位版本,例如:
#include <stdio.h>
char *argv[]={"/bin/echo","parameter test", NULL};
int main(){
int ret;
__asm__ volatile ("syscall"
:"=a" (ret)
:"a"(59), // syscall number (execve)
"D"(argv[0]), // filename
"S"(argv), // arguments
"d"(0) // env
:"rcx","r11","cc");
return 0;
}
实际问题是数组中有 64 位指针,但您使用的 32 位兼容性中断当然需要 32 位指针。