/ / Jak używać funkcji chroot w programowaniu C? - c, linux, chroot

Jak korzystać z funkcji chroot w programowaniu C? - c, linux, chroot

Wiem, że użycie polecenia „chroot” w Linuksie wymaga plików lub katalogów, takich jak usr, bin i tak dalej. Ale kiedy używam funkcji chroot() w C potrzebuję tych plików?

Oto mój kod, który „hw.out” jest plikiem binarnym, który po prostu wypisuje „Hello, world”. Skompilowałem go i uruchomiłem jako root, ale nie udało się wydrukować „Hello, world”. Co jeszcze powinienem zrobić? Dziękuję Ci!

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int result = chroot(".");

if(result == 0)
printf("Chroot Succese.n");

char *arrays[]={"./hw.out",NULL};
execvp("./hw.out", arrays);
return 0;
}

Odpowiedzi:

4 dla odpowiedzi № 1

execvp najprawdopodobniej zawodzi, prawdopodobnie z ENOENT: no such file or directory, gdyby hw.out to dynamicznie połączony plik wykonywalny.

Aby to działało, wszystkie biblioteki wymagane przez hw.out muszą być dostępne w chrooted środowisko.

Spróbuj połączyć hw.out statycznie i powinno działać. (I dodaj błąd sprawdzania po execvp zobaczyć co errno jest ustawiany po zakończeniu połączenia, jeśli powróci.)


1 dla odpowiedzi nr 2

Sprawdź, czy twój hw.out działa z chroot linii poleceń.

Być może hw.out jest dynamicznie połączony i brakuje niektórych bibliotek lub ld-linux.so w katalogu chroot.

Nitpicks 1, o co chodzi return 0 po execvp? nigdy nie zostanie wykonany, chyba że wystąpi błąd. wolałbym mieć perror("can"t exec"); return 1;

Nitpick 2, chroot () nie zmienia katalogu roboczego, chociaż działa w twoim przypadku, ponieważ chrootujesz na ".", nie zadziała tak, jak się spodziewasz, jeśli później zmienisz go na chroot („somedir”).


0 dla odpowiedzi № 3

Upewnić się, że hw.out jest we właściwej linii. Być może łatwiej jest mieć statyczne połączenie, jeśli używa bibliotek. W przeciwnym razie należy włączyć po chroot, aby mógł uzyskać dostęp do dynamicznych bibliotek.