2016-03-27 9 views
0

最近gccのインラインアセンブリーに入って基本的なアセンブリーに関する知識があるので、1つ以上の引き数を使って簡単なsys_execveを実行しようとするまで、syscallをうまく作成する方法を理解しました。 システムコール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); 

でこれをテストしているし、期待どおりに働いていたように私は、間違って行くことができるものは考えています。

+2

[sys_execve](http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html)のapiを見ると、パラメータが正しいかどうかわかりません。また、x64用にコンパイルしていますか?もしそうなら、あなたはint 0x80を使うべきではありません。 –

+0

x64のためにコンパイルしていますが、現在実行中のファイル名の部分は正しいです。私が立ち往生している部分は、それに何らかのパラメータを与えています。私は何を渡す必要があったのかを判断するためにユーザー[this](http://syscalls.kernelgrok.com/)にアクセスしてください。 – LazyShpee

答えて

4

これは32ビットの表記法を使用した32ビットコードです。 gcc -m32を使用してコンパイルすると動作します。

#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を期待:また、のような適切な64ビット・バージョンに切り替えます。

+2

'= a'は明示的に指摘する価値があります。システムコールは' eax'(または 'rax')レジスタに値を返します。そのためコンパイラはこれが起こっていることを知る必要があります。そうでなければ、asmコードは 'eax'を変更しないままにして、コードの後ろに59の値が必要な場合、' eax'からロードしようとするかもしれません。実際に 'eax'がシステムコールの戻り値で上書きされたため、問題が発生します。実際にこのコードで問題を引き起こす可能性は低いでしょうが、一般的に注意を払うことが重要です。 –

+2

ところで、私がamd64 abiで読んだところから、システムコールは 'r11'と' rcx'をぶち壊すかもしれません。 –

+1

@NateEldredge:正しいことですが、 'syscall' /' sysret'の設計は ''システムコール ''が常にrcxとr11を(RIPとRFLAGSで)壊してしまうことを保証します。カーネルにこれらの規則に含まれていたものが何であるかを見ても、ユーザスペースの協力が必要となります(スタック上に置くなど)。 Linuxのシステムコールはユーザー空間のスタックを調べていないので、ABIはそれを単純に保ち、 'eax'だけが変更された32ビット' int 0x80'(戻り値)とは異なり、amd64の2つのregをシステムコールで壊してしまいます。 –

関連する問題