Ich bin verwirrt mit dem Syscall von __NR_execve
. Wenn ich Linux-Systemanruf lerne. Die richtige Art und Weise, die ich kenne execve
zu verwenden, ist wie folgt:Warum kann der Execve-Systemaufruf "/ bin/sh" ohne argv-Argumente, aber nicht "/ bin/ls" ausführen?
char *sc[2];
sc[0]="/bin/sh";
sc[1]= NULL;
execve(sc[0],sc,NULL);
Dann ist die Funktion execve
syscall()
nennen mit setzt die Argumente auf Register in Systemkern erhalten EAX
, EBX
, ECX
und EDX
. Es ist noch jedoch erfolgreich sein, wenn ich
execve("/bin/sh",NULL,NULL);
verwenden Aber wenn ich "/bin/sh"
mit "/bin/ls"
ersetzen, es nicht mit:
A NULL argv[0] was passed through an exec system call.
Ich frage mich, warum "/bin/sh"
erfolgreich ohne genügend Parameter während "/bin/ls"
nicht ausgeführt werden?
Ich würde nicht darauf verlassen, 'NULL' überhaupt dort zu arbeiten; die 'execve'-man-Seite sagt, dass das' argv' ein Array von Argument-Strings ist; Ein 'NULL'-Zeiger ist kein gültiger Zeiger auf ein Array. (Auch die Verwendung von 'NULL' für' env' sieht nicht gut aus, sondern 'execv' oder' execvp' oder ein Zeiger auf 'char * p = NULL'.) –
Arrays sind Zeiger auf ihr erstes Element, wenn sie als übergeben werden Funktionen Argumente, so NULL ist hier sicherlich gültig. – fluter