__NR_execve
のシステムコールと混同しています。私はLinuxのシステムコールを学ぶとき。なぜexecveシステムコールは "/ bin/ls"ではなくargv引数なしで "/ bin/sh"を実行できますか?
char *sc[2];
sc[0]="/bin/sh";
sc[1]= NULL;
execve(sc[0],sc,NULL);
次に機能execve
はレジスタEAX
、EBX
、ECX
とEDX
に引数を置くことで、システムのカーネルに入るためにsyscall()
を呼び出します:私はexecve
を使用することを知って正しい方法は、このようなものです。しかし、それはまだ成功し、私は
execve("/bin/sh",NULL,NULL);
を使用しかし、私は"/bin/ls"
で"/bin/sh"
を交換した場合、それはで失敗した場合:
A NULL argv[0] was passed through an exec system call.
"/bin/ls"
が失敗しながら"/bin/sh"
が十分なパラメータなしで正常に実行することができますなぜ私が疑問に思いますか?
。 'execve'のmanページは、' argv'が引数文字列の配列であることを示しています。 'NULL'ポインターは配列への有効なポインターではありません。 ( 'env'には' NULL'を使用しないでください。 'execv'や' execvp'を使うか、 'char * p = NULL'へのポインタを渡してください) –
配列は、渡されたときの最初の要素へのポインタです関数の引数は、NULLが確かにここで有効です。 – fluter