繁体   English   中英

执行内联汇编

[英]Execve inline assembly

我最近接触了gcc的内联汇编并具有基本的汇编知识,我了解如何很好地进行syscall,直到尝试使用一个或多个参数来执行简单的sys_execve为止。 如果我没有传递任何其他参数,则系统调用execve可以正常工作,并且在尝试传递任何参数时仅运行不带参数的可执行文件。

#include <stdio.h>

char *argv[]={"/bin/echo","parameter test", NULL};

int main(){
  __asm__ volatile ("int $0x80"
          :
          :"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位Poiters。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM