Чтобы получить флаг:

./fd 4661
LETMEWIN
хорошая работа :)
‹FLAG›

Почему это работает:

Аргумент 4661:
Сначала программа проверяет наличие аргумента, проверяя длину argc, и возвращается без него.

if(argc‹2){
printf('передать argv[1] число\n');
вернуть 0;

$ ./fd
pass argv[1] a number

После этого создается целое число с именем «fd».

int fd = atoi( argv[1] )-0x1234;

Это целое число является файловым дескриптором.
Через две строки программа выполняет read() и читает в buf (массив символов длиной 32 символа) в соответствии с файловым дескриптором.

целая длина = 0;
len = read(fd, buf, 32);

Если fd равно 0, то read() будет читать из стандартного ввода, если равно 1, то из стандартного вывода, а если 2, то из ошибки спутникового ввода. Как мы видим в коде, fd изначально присваивается не 0, 1 или 2, а atoi( argv[1] ) - 0x1234. atoi( argv[1] ) Принимает первый аргумент, переданный программе (в "Чтобы получить флаг" выше, это 4661) и преобразует его в число, поскольку изначально это строка. - 0x1234 уменьшает 0x1234 (4660 в десятичном формате) из возвращаемого числа atoi( argv[1] ), оставив нас с fd = 1 в «Чтобы получить флаг» выше.

Поэтому, если мы попробуем 4600 или 4662, это все равно должно работать, потому что 0 и 2 также являются файловыми дескрипторами.

$ ./fd 4660
LETMEWIN
good job :)
$ ./fd 4662
LETMEWIN
good job :)

Но если мы попробуем другой номер, это не сработает, потому что только 0, 1 и 2 являются файловыми дескрипторами.

$ ./fd 4663
learn about Linux file IO

Функция read() считывает 32 байта в buf, поэтому мы можем вводить текст. текст, который нам нужно ввести, это LETMEWIN, потому что после функции read() есть оператор if, который проверяет, ввели ли мы LETMEWIN. Если мы это сделали, он печатает «хорошая работа :)», дает нам флаг и существует.

if(!strcmp("LETMEWIN\n", buf)){
printf("хорошая работа :)\n");
system("/bin/cat flag");< br /> выход(0);

Если мы ввели текст, отличный от LETMEWIN, например D0ntL3tM3W1n, он не введет оператор if и не напечатает «узнать о файловом вводе-выводе Linux».

./fd 4660
D0ntL3tM3W1n
learn about Linux file IO