Dlaczego musiałem wpisywać coś z klawiatury

1

Robię zadania z pwnable.kr . Robiłem zadanie fd. Kod z tego zadania:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32];
int main(int argc, char* argv[], char* envp[]){
	if(argc<2){
		printf("pass argv[1] a number\n");
		return 0;
	}
	int fd = atoi( argv[1] ) - 0x1234;
	int len = 0;
	len = read(fd, buf, 32);
	if(!strcmp("LETMEWIN\n", buf)){
		printf("good job :)\n");
		system("/bin/cat flag");
		exit(0);
	}
	printf("learn about Linux file IO\n");
	return 0;

}

Jako argument przy uruchamianiu wpisałem liczbę 4661. Musiałem wtedy coś wpisać(LETMEWIN żeby zdobyć flagę). I moje pytanie. Dlaczego musiałem cokolwiek wpisywać skoro nie użyto w tym kodzie żadnej funkcji wczytującej dane z klawiatury?

5

Jak najbardziej użyto, tylko, że niejawnie (co zresztą musiałeś odkryć, skoro rozwaliłeś zadanko).

0x1234 = 4660

Standardowo deskryptory potoków stdin/stdout/stderr mają odpowiednio wartości 0, 1, 2. Trochę dziwne, bo ja bym się spodziewał, że 4660 będzie poprawną odpowiedzią (fd dla read = 4660-4660 = 0 = stdin), ale najwyraźniej czytałeś z stdout :)

0

Ale jeśli czytałem z stdout to chyba nie powinienem wprowadzać żadnego inputu? Chyba, że czegoś nie rozumiem?

1

Podejrzewam, że to jakieś ub/optymalizacja i czytanie z stdout daja identyczny/podobny rezultat do czytania z stdin. Testy na moim linuksie to potwierdzają.

Fajnie gdyby ktoś bardziej zorientowany się wypowiedział.

4

ls -l /dev/fd/ daje odpowiedź, przynajmniej u mnie ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1