«Взлом - искусство эксплуатации» - несоответствия в сегментации памяти - PullRequest
0 голосов
/ 04 мая 2019

Я сейчас изучаю "Взлом - Искусство Эксплуатации". Существует код с именем auth_overflow.c:

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

int check_authentication(char *password) {
    int auth_flag = 0;
    char password_buffer[16];

    strcpy(password_buffer, password);

    if(strcmp(password_buffer, "brillig")==0)
        auth_flag = 1;
    if(strcmp(password_buffer, "outgrabe")==0)
        auth_flag = 1;

    return auth_flag;
}

int main(int argc, char *argv[]) {
    if(argc < 2) {
        printf("Usage: %s <password>\n", argv[0]);
        exit(0);
    }
    if(check_authentication(argv[1])) {
        printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
        printf("        ACCESS GRANTED!\n");
        printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
    }else{
        printf("\nAccess Denied.\n");
    }
}

Программа уязвима для аргумента «A» x30 из-за порядка «auth_flag» и «password_buffer» в памяти. Согласно книге, это изменение должно исправить:

    char password_buffer[16];
    int auth_flag = 0;

Но в моем случае это все равно ведет себя так же. Посмотрев в gdb, я заметил, что в обеих программах «auth_flag» находится по более низкому адресу памяти по сравнению с «password_buffer», независимо от того, какой код я использую. Что вызывает эту проблему? Это из-за использования более нового компилятора? Версия моей системы: 4.19.0-kali4-amd64

И пока я здесь ... Мне очень нравится изучать эту книгу, но я знаю о многих несоответствиях с новыми инструментами и системами. Есть ли что-нибудь подобное, более новая книга, которую стоит порекомендовать и т.д.?

...