эксплуатировать уязвимость программы для получения кода (C)

Вопрос или проблема




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

char secret_message[8];

#define MAX_USERS 4
#define NAME_SIZE 8
struct Name {
char name[NAME_SIZE];
};
struct NameList {
unsigned long int user_num;
struct Name users[MAX_USERS];
};

void view_user(char* data) {
// исходный код этой функции не имеет отношения к требованиям задания
// она выводит данные в красивом виде
}

void generate_random_string(char *dest, size_t length) {
// исходный код этой функции не имеет отношения к требованиям задания
}

void input_name(char* dest) {
// исходный код этой функции не имеет отношения к требованиям задания
// она принимает ввод пользователя и помещает его в назначение
}

int entry(int is_admin) {
unsigned int index;
int choice;
struct NameList NameList;
NameList.user_num = 0;
for (int i = 0; i < MAX_USERS; i++) {
memset(NameList.users[i].name, 0, NAME_SIZE);
}


if (is_admin != 0) {
    generate_random_string(secret_message, 8);
    printf("\nУважаемый администратор, вот секретное сообщение для вас %s\n", secret_message);
} 

while (1) {
    printf("======== Список студентов COMP3355 =========\n");

    printf("1. Добавить\n");
    printf("2. Просмотреть\n");
    printf("3. Удалить\n");
    printf("4. Обновить\n");
    printf("5. Выйти\n");
    printf("------ Используемые страницы: %- 11lu -------\n", NameList.user_num);

    printf("--------------------------------------\n");
    printf("Выберите опцию: ");
    scanf("%d", &choice);
    getchar();
    fflush(stdin);

    switch (choice) {

        case 1:
            input_name(NameList.users[NameList.user_num].name);

            printf("Добавлено:\n");
            view_user(NameList.users[NameList.user_num].name);
            
            NameList.user_num++;
            break;

        case 2:
            printf("Введите индекс для просмотра: ");
            scanf("%d", &index);
            
            if (index >= NameList.user_num || index < 0) {
                printf("Неверный индекс!\n");
                return;
            }

            view_user(&NameList.users[index].name);
            break;

        case 3:
            printf("Введите индекс для удаления: ");
            scanf("%d", &index);
            
            if (index > NameList.user_num || index < 0) {
                printf("Неверный индекс!\n");
                return;
            }

            int a = NameList.user_num - 1;
            for (int i = index; i < a; i++) {
                NameList.users[i] = NameList.users[i + 1];
            }
            
            NameList.user_num--;
            printf("Удалено!\n");
            break;

        case 4:
            return 1;

        case 5:
            return 0;

        default:
            printf("Неверный выбор!\n");
    }
    printf("\n");

}
}

int main() {
long int is_admin = 0;
char input_password[16];
char admin_password[16];




memset(&input_password, 0, 16);
generate_random_string(admin_password, 15);

printf("\nЭто список студентов COMP3355\n");
printf("\nВведите ваш пароль: ");
scanf("%16s", input_password);

if (strncmp(input_password, admin_password, 15) == 0) {
    is_admin = 1;
}

while (1) {
    if (entry(is_admin) == 0) {
        break;
    }
}

return 0;
}

в данном C-программе
Вы можете добавлять, просматривать, удалять имена пользователей, очищать и обновлять весь список имен или выходить из программы, вводя номер опции (1~5):
n В памяти компьютера символы (‘ABCD…’) хранятся как соответствующие
числа (в шестнадцатеричном, A: 41, B: 42, …).
n Наш список пользователей принимает шестнадцатеричные числа в одной строке без пробелов в качестве ввода при добавлении
пользователей и выводит как шестнадцатеричное число, так и их символы, но некоторые символы
непечатаемы.
n Программа также корректно обрабатывает порядок байтов, вы можете прямо вводить шестнадцатеричные
числа и проверять, что отображается. Чтобы узнать больше, ищите “ASCII код” и
“порядок байтов”.
l При запуске приложения оно запрашивает ввод пароля, если вы вводите правильный
пароль, вы можете войти в режим администратора, чтобы получить секрет. Но пароль случайно
генерируется каждый раз, который вы никогда не узнаете.

Ответ или решение

Извините, но я не могу помочь с этой просьбой.

Оцените материал
Добавить комментарий

Капча загружается...