Особой сложности не имеет. Есть два способа обхода.
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). Путём анализа скомпилированного кода можно узнать значение для конкретного случая.

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

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