Показать сообщение отдельно

  #7  
Старый 18.09.2008, 18:50
paulzey
Познающий
Регистрация: 30.10.2007
Сообщений: 63
Провел на форуме:
299216

Репутация: 59
Отправить сообщение для paulzey с помощью ICQ
По умолчанию

Особой сложности не имеет. Есть два способа обхода.
1) Системный. Часто все забывают, что типовой системный ввод обладает "историей". Достаточно во время ввода нажать кнопку вверх, последнее введённое значение будет подставлено.

2) Программный. В самом деле, внимательно смотрим на два куска кода.
Цитата:
char a_passwords[2][ARRAY_LENGTH]={"xxx","yyy"};
char *p_user = NULL;
char *p_etalon =NULL;
и
Цитата:
flag=(p_etalon[i]!=p_user[i]);
Соответственно, значением a_passwords[1] можно переписать значение p_user, заставив программу сравнивать пользовательский пароль сам с собой.
Проверим идею - вуа-ля, см. рисунок:

С клавиатуры вводятся (через Alt+Num Цифра) три байта. В моём случае - с кодами 20, 255, 18 (0x12FF14). Путём анализа скомпилированного кода можно узнать значение для конкретного случая.

Желтым выделена область, содержащая эталон пароля, красным - пользовательский, зелёным - ссылочные переменные. Возможно затереть только три байта первой ссылки (нулевой символ с клавиатуры ввести нельзя). Таким образом, просто узнав второй адрес, можно поместить его в кодах позади последовательности, буфер переполнится, значение затрётся, после ста проверок флаг всё равно будет нулевой.
Пример данных, затирающих ссылку.

Видно, что данные ссылок одинаковы. Именно это обстоятельство позволяет осуществить успешную атаку.
 
Ответить с цитированием