Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Пиши безопасно

Крис Касперски ака мыщъх

Спецвыпуск: Хакер, номер #057, стр. 057-070-2


Давай посмотрим, как осуществляется шифровка текстовых строк на практике. Для начала возьмем простую программу, считывающую из командной строки пароль и выводящую в зависимости от ввода "password ok" или "wrong password". Один из вариантов ее реализации выглядит так:

Поверка пароля с незашифрованными текстовыми строками

#define _CRC_ 0x98 // контрольная сумма пароля nezumi

main(int c, char **v)

{

int a;

int CRC=0;

char *goods="password ok";

char *wrong="wrong password";

if (c>1)

{

for (a=0; a<strlen(v[1]); a++) CRC=(CRC+v[1][a]) & 0xFF;

// для отладки (чтобы подсмотреть правильный пароль)

// printf("%x\n",CRC);

// проверка CRC и вывод текстовых строк на экран

if (CRC-_CRC_) goods=wrong;printf("%s\n",goods);

return 0;

}

printf("USAGE:crypt.exe password\n");

}

Для усиления защиты сравнивается не сам пароль, а его контрольная сумма (CRC). Эталонный пароль нигде не хранится, и хакер при всем своем желании не может подсмотреть его. Оторвать мыщъх'у хвост, если это не так! Но как же мы узнаем CRC эталонного пароля? Да очень просто! Достаточно внедрить в отладочную версию программы строку printf("%x",CRC), распечатывающую контрольную сумму введенного пароля, и ввести эталонный пароль. Например, CRC слова "nezumi" равна 98h.

Откомпилировав полученную программу (естественно, предварительно убрав отладочную печать из финальной версии) и пропустив ее через дизассемблер, мы получим нечто вроде того, что на скриншоте.

Текстовые строки "password ok" и "wrong password" хранятся открытым текстом и легко обнаруживаются даже при беглом просмотре листинга (обычно для этого используются программы-фильтры, отсеивающие все читабельные текстовые последовательности). Что сделает хакер? Установив точку останова на начало "wrong password", он легко перехватит код, выводящий эту строку на экран, после чего ему останется найти тот условный переход, который его выводит. Весь взлом не займет и десяти минут!

Поэтому, как уже было сказано, текстовые строки необходимо хранить в зашифрованном виде, что можно сделать, например, так:

Проверка пароля с зашифрованными строками

#define _CRC_ 0x98 // контрольная сумма пароля nezumi

#define _KEY_ 0xFF // ключ шифрования

main(int c, char **v)

{

int a;

int CRC=0;

char buf[1024];

// зашифрованные текстовые строки

char *goods="\x8F\x9E\x8C\x8C\x88\x90\x8D\x9B\xDF\x90\x94"; //"password ok";

char *wrong="\x88\x8D\x90\x91\x98\xDF\x8F\x9E\x8C\x8C\x88\x90\x8D\x9B"; //wrong

if (c>1)

{

for (a=0; a<strlen(v[1]); a++) CRC=(CRC+v[1][a]) & 0xFF;

// проверка CRC и расшифровка текстовых строк

//-------------------------------------------

if (CRC-_CRC_) // пароль ок

for (a=0;a<strlen(wrong);a++) buf[a]=wrong[a]^_KEY_;

else // пароль не ок

for (a=0;a<strlen(goods);a++) buf[a]=~goods[a];

Назад на стр. 057-070-1  Содержание  Вперед на стр. 057-070-3