Фундаментальные основы хакерства




Шаг второй. Знакомство с дизассемблером - часть 7


(*0x4010A0) (ebp-68, "myGOODpassword")

В том, что аргументов именно два, а не, скажем, четные или десять, нас убеждает команда "ADD ESP,8", расположенная вслед за CALL.

  0040104E: E8 4D 00 00 00     call        004010A0

  00401053: 83 C4 08           add         esp,8

Остается выяснить назначение функции 0x4010A0, хотя… если поднапрячь свою интуицию этого можно и не делать.!

И так ясно – это функция сравнивает пароль, иначе, зачем бы ей его передавали? Как она это делает – вопрос десятый, а вот что нас действительно интересует – возвращенное ею значение. Так, опускаемся на одну строчку ниже:

  0040104E: E8 4D 00 00 00     call        004010A0

  00401053: 83 C4 08           add         esp,8

  00401056: 85 C0              test        eax,eax

  00401058: 74 0F              je          00401069

Что мы видим? Команда TEST EAX,EAX проверяет возвращенное функцией значение на равенство нулю, и если оно действительно равно нулю следующая за ней команда JE совершает прыжок на 0x401096

строку.

В противном же случае (т.е. если EAX !=0)…

  0040105A: 68 50 60 40 00     push        406050h

Похоже еще на один указатель. Не правда ли? Проверим это предположение, заглянув в сегмент данных:

  00406050: 57 72 6F 6E 67 20 70 61 73 73 77 6F 72 64 0A 00  Wrong password..

Уже теплее! Указатель вывел нас на строку "Wrong password", очевидно выводимую следующей функцией на экран. Значит, ненулевое значение EAX свидетельствует о ложном пароле, а нуль – об истинном.

О'кей, тогда переходим к анализу валидной ветви программы…

  0040105F: E8 D0 01 00 00     call        00401234

  00401064: 83 C4 04           add         esp,4

  00401067: EB 02              jmp         0040106B

  00401069: EB 16              jmp         00401081

  00401081: 68 60 60 40 00     push        406060h

  00401086: E8 A9 01 00 00     call        00401234

Так еще, один указатель.Ну, а с функцией 0x401234 мы уже встречались выше – она (предположительно) служит для вывода строк на экран. Ну а сами строки можно отыскать в сегменте данных. На этот раз там притаилась "Password OK"

Оперативные соображения следующие: если заменить команду JE на JNE, то программа отвергнет истинный пароль, как неправильный, а любой неправильный пароль воспримет как истинный. А если заменить "TEST EAX,EAX" на "XOR EAX,EAX", то после исполнения этой команды регистр EAX будет всегда

равен нулю, какой бы пароль не вводился.

Дело за малым – найти эти самые байтики в исполняемом файле и малость поправить их.




Содержание  Назад  Вперед