Программы взлома, разработанные с помощью старых компиляторов C/C++?

Используемый компилятор: GCC 3.4.4 ОС: Windows XP 32bit

В более старых компиляторах C/C++ (например, gcc 3.4 или Visual Studio 6) можно манипулировать кадром стека для управления выполнением программы (например, через поврежденные адреса возврата) с переполнением буфера.

Попытка показать это не удалась из-за того, что все данные, которые мне нужно было скопировать, включали байт нулей, на котором копирование всегда останавливалось.

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

int checkauth(char *password)
{
    int authflag = 0;
    char passwordbuffer[10] = "aaaaaaa";


    strcpy(passwordbuffer, password);

    if(strcmp(passwordbuffer, "password")==0)
        authflag = 1;

    return authflag;
}

int main (int argc, char *argv[])
{
    int authflag = 0;
    char password[10] = "bbbbb";

    if (argc < 2)
    {
        printf("Password missing");
        exit(0);
    }

    authflag = checkauth(argv[1]);

    if(authflag > 0)
        printf(" password ok \r\n");
    else
        printf("wrong password, %s \r\n", argv[1]);

    return 0;
}

Как показывает код, я использую аргумент командной строки для заполнения буфера. Это всегда останавливается на первом пробеле. Я искал несколько примеров (книга: Взлом — искусство эксплойта, stackoverflow…), но все работают с адресами, которые не содержат ни байта нулей. Проблема в этом случае зависит от сохраненного указателя стека (адрес включает в себя байты нулей), лежащего в памяти перед адресом возврата, и программа всегда завершается ошибкой, если указатель стека не имеет какого-либо допустимого значения.

Адрес, на который я хотел бы перейти, будет 0x004013BA вместо 0x004013b1. Сохраненный указатель стека получил значение 0x0022ff78. Это означает, что мне нужно заполнить буфер 43 байтами чего-то случайного, а также указателем стека и адресом возврата.

Как решить эту проблему?

Спасибо


person michdich    schedule 09.12.2014    source источник


Ответы (1)


Краткий ответ: Это невозможно.

Причина этого в том, что c-строки заканчиваются нулем. Функция strcpy прекращает копирование, если считывается 0x00. Эта характеристика также используется в некоторых функциях защиты от переполнения буфера, таких как ASCII-armor ASLR (RedHat Exec-Shield).

Эта ссылка может быть также полезно.

person code monkey    schedule 09.12.2014