Чтобы получить флаг:
./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