Новости Crash Me #3

optio
, 16 October 2008

Очередной crashme открывает серию заданий в которых вам не придётся ничего запускать на реальной машине, вместо этого вам предлагается очень хорошо подумать и ответить на следующие вопросы:

  • что неправильно в данном коде?
  • Какое окружение необходимо для того, что бы использовать уязвимость?
  • Как именно вы сможете использовать уязвимость?
  • Как можно закрыть уязвимость?

Уязвимость может показатся вам несколько абстрактной, но тем не менее она есть. Вы станете немного лучше понимать язык C, когда найдёте её.

Итак, думаем:

char *start, *end, *ref;
/* Some code that process user input so that start and end
 * point to valid memory addresses and start + k < end.
 * Where k is some constant you can't control.
 * ref is made to point to some program-defined chunk,
 * but you can't control this one.
 */
int n = end - start;
if (memcmp(ref, start, n) != 0) {
    printf("Checksum mismatch. Access denied.\n");
    exit(EXIT_FAILURE);
}
printf("Checksum matches. Access granted.\n");

P.S. В комментариях, возможно, уже есть правильный ответ. Настоятельно рекомендую решить задачу прежде чем смотреть обсуждение.

P.S.S. Огромное спасибо Fernando J. Pereda’s blag