2016-04-17 17 views
5

__NR_execve syscall ile karıştırıldım. Linux sistem çağrısını öğrendiğimde. Ben execve kullanmayı biliyorum doğru yolu şu şekildedir: Neden yürütme sistemi herhangi bir argv argümanı olmaksızın "/ bin/sh" çalıştırır, ancak "/ bin/ls" değil?

char *sc[2]; 
sc[0]="/bin/sh"; 
sc[1]= NULL; 
execve(sc[0],sc,NULL); 

Sonra işlev execve Kütükleri EAX, EBX, ECX ve EDX üzerine argümanlar koyarak sistem çekirdeğin içine almak için syscall() arayacak.

A NULL argv[0] was passed through an exec system call. 

"/bin/sh" yeterli parametreler olmadan başarıyla yürütülebilir Acaba neden "/bin/ls" ederken başarısız: Ben

execve("/bin/sh",NULL,NULL); 

kullanmak Ama "/bin/ls" ile "/bin/sh" yerine, eğer başarısız olursa Ancak, hala başarılı?

+0

Ben NULL' hiç orada çalışan 'güvenmeyin ediyorum; 'execve' man sayfası, argv'nin argüman dizileri dizisi olduğunu; Bir 'NULL' işaretçisi, bir diziye geçerli bir işaretçi değildir. ('' Nv' '' env'' için iyi görünüyor, daha ziyade 'execv' veya' execvp' komutunu kullanın ya da 'char * p = NULL'' a bir işaretçiyi iletin. –

+0

Diziler, iletilen ilk öğesinin işaretçileridir. işlev argümanları, dolayısıyla NULL kesinlikle burada geçerlidir. – fluter

cevap

4

Bu değil bir çekirdek sorunları, çekirdek bakılmaksızın argv ve envp vardır NULL veya execve ait filename arg çalışacak, bu sadece bir unix kongre olduğunu program adının argv[0] puan.

Ve gördüğünüz şey normal, hiçbir şey yanlış değil. ls GNU coreutils bir parçasıdır ve coreutils paket çağrısı set_program_name tüm programlar bazı kurulum işi yapmak için olduğundan, kaynak görebilirsiniz, o zaman NULL ise ve bu abort arayacak argv[0] olmadığını kontrol eder. Diğer taraftan, /bin/sh görünüşte, coreutils'e ait olmayan ve argv[0] karşı denetlemeyen bir programdır, bu nedenle sorun olmadan çalışır.

kaynak koduna bakınız:

http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c#n1285

http://git.savannah.gnu.org/cgit/gnulib.git/tree/lib/progname.c#n51

+0

@ArvinX. bunu bildiğine sevindim yardımcı olur. – fluter

+0

Ve burada herhangi bir argv olmaksızın minimal bir örnek: http://stackoverflow.com/a/42290873/895245 –

İlgili konular