簡體   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