ƒизассемблирование консольных программ, нахождение парол€


15.03.2010, 17:46



ќсновной задачей, котора€ приводит к дизассемблированию приложений €вл€етс€ необходимость изменить структуру и поведение готового выполн€емого файла. —амым €рким примером дизассемблировани€ €вл€етс€ взлом защиты программ, встроенной разработчиками. –ассмотрим решение данной задачи на практическом примере.

¬нимание! ƒанное руководство предназначено только дл€ закреплени€ знаний ассемблера люд€м, которые программируют электронику на данном €зыке. Ќи в коем случае не следует выполн€ть действи€,приведенные в данном руководстве на любых программах кроме той, что показана на примере.

ѕусть дана консольна€ программа, котора€ при запуске выполн€ет запрос на ввод парол€ из клавиатуры. ѕароль хранитс€ в программе в виде строковой переменной со значением ¬Ђpassword¬ї. ѕри правильном вводе на экран выводитс€ сообщение ¬ЂOK¬ї, а иначе вАУ ¬ЂPassword incorrect¬ї. —уществует несколько способов взлома такой защиты. ѕервый способ основан на необходимости только найти правильный пароль и получить положительную авторизацию введ€ найденный пароль. ¬торой способ вАУ необходимость сделать так, чтобы при вводе любого парол€ программа считала его правильным и выдавала положительную авторизацию.

ѕервый способ

»де€: Ќеобходимо путем пошаговой отладки исполн€емого файла найти место(адрес) в пам€ти, где находитс€ переменна€ с паролем, перейти по найденному адресу и вы€вить пароль. ƒл€ этого нужно сначала найти место в программе, где находитс€ ввод парол€ и место, где выводитс€ результат авторизации. ƒальше последовательной трассировкой вы€вить предполагаемые критические точки в программе между найденными участками, где происходит какое-либо сравнение с последующим условным переходом (зачастую je либо jne). ¬ разных программах сравнение может быть выполнено по-разному: это либо операци€ CMP, либо вызов процедуры сравнени€, либо выполнени€ других операций, которые способны выставл€ть флаги процессора. ѕосле этого происходит анализ найденных точек в зависимости от вида сравнени€ дл€ нахождени€ адреса переменной с паролем. ≈сли вы€влена операци€ CMP, то происходит сравнение значений парол€ (символов, если пароль задан в виде строки и чисел, если задан числовой пароль) с введенными значени€ми с клавиатуры. ¬ данном случае необходимо последовательно запоминать сравниваемые значени€ и в конце сравнени€ составить из них правильный пароль. ≈сли в критической точке вы€влен вызов процедуры сравнени€, то перед ее вызовом можно найти пересылку аргументов процедуры в стек (или, что очень редко, в регистры). јргументами процедуры сравнени€ очевидно и есть сравниваемые данные, но в отличие от операции CMP данные аргументы зачастую передаютс€ не в виде значений, а в виде адресов на сравниваемые переменные. ѕоэтому дл€ нахождени€ парол€ необходимо вы€вить, какие адреса передаютс€ в стек, и последовательно переход€ по каждому адресу найти в одном из них пароль. ≈сли в критической точке происход€т какие-либо другие действи€ с выставлением флагов, то в такой нестандартной ситуации необходимо вы€вл€ть пароль исход€ из смысла данных действий.

ѕоскольку сравнение с использованием процедур выполн€етс€ наиболее часто, то в данной лабораторной работе приведен пример программы, написанной на €зыке —++, котора€ сравнивает пароль с введенной строкой процедурой int strcmp(char *s,char *d), котора€ в качестве аргументов принимает адреса сравниваемых строк и возвращает значение 0 если строки равны, число меньше нул€, если строка s<d и число больше нул€, если строка s>d. ƒл€ вывода на консоль используетс€ функци€ << объекта класса ostream, представл€ющего стандартный поток вывода, а дл€ ввода вАУ функци€ >> объекта класса istream, представл€ющего стандартный поток ввода.

Ћистинг тестовой программы дл€ нахождени€ парол€ labDasm.cpp:

 

#include <iostream.h>

#include <string.h>

#include <conio.h>

void main()

{

char *a,*pass="password";

clrscr(); // ќчистка экрана

cout<<"Enter the password: "<<endl;

cin>>a;

if(!strcmp(a,pass))

cout<<"OK";

else

cout<<"Password incorrect";

cin.get();

cin.get(); // ќжидает нажати€ клавиши Enter

}

 

Ўаги алгоритма нахождени€ парол€:

1. ќткрыть в отладчике Turbo debugger (TD.exe) исполн€емый файл labDasm.exe;

2. ¬ыполнить последовательную трассировку программы (по запросу ввода парол€ ввести любую строку, например ¬Ђ12345¬ї) до нахождени€ точки вызова процедуры сравнени€ strcmp (рис. 1);

–ис. 1

3. ѕеред найденной точкой вызова находитс€ пересылка адресов сравниваемых строк в стек, а после вАУ операци€ условного перехода jne. ƒанные два адреса хран€тс€ в пам€ти, как видно из рис.1, по смещению bp-04 и bp-02 сегмента данных. Ќайти эти адреса перейд€ в пам€ти на ds:0xFFF2 и ds:0xFFF4 соответственно (рис.2);

–ис. 2

¬ данном случае:

—ћ≈ў1 = 00AAh

—ћ≈ў2 = 5845h

4. ѕерейти по каждому из найденных адресов (рис. 3):

–ис. 3

 ак видно из рис.3, по смещению 5845h находитс€ введенна€ из клавиатуры ранее строка ¬Ђ12345¬ї с кодом конца строки 0, а по смещению 00AAh находитьс€ пароль ¬Ђpassword¬ї.

¬торой способ

»де€: Ќеобходимо найти предполагаемые критические точки программы, как было показано в первом способе. »з найденных точек определить истинную критическую точку (в данном примере найдена только одна предполагаема€ критическа€ точка, она и есть истинной). ƒальше необходимо вы€вить последующую за найденной точкой операцию условного перехода, данный переход определ€ет, куда нужно перейти в зависимости от правильности ввода парол€. Ќапример, если пароль введен правильно, то выводитс€ сообщение об успешной авторизации, а иначе вАУ сообщение о неправильности ввода. ѕоэтому, чтобы при неправильно введенной строке с клавиатуры программа выдала сообщение о правильности ввода, необходимо заменить в исполн€емом файле условие перехода на противоположное (например jne на je, или jz на jnz и т.д.).

јлгоритм изменени€ исполн€емого файла дл€ его положительной реакции на неправильно введенный пароль:

1. ќткрыть в отладчике Turbo debugger (TD.exe) исполн€емый файл labDasm.exe;

2. ¬ыполнить последовательную трассировку программы до нахождени€ операции условного перехода после вызова процедуры сравнени€ strcmp (рис. 4). Ќайденна€ операци€ условного перехода jne имеет машинный код 7505h ;

3. ќткрыть в редакторе Hex View (hiew.exe) исполн€емый файл labDasm.exe;

4. ѕереключитс€ в режим просмотра кода (F4 дл€ переключени€ режима просмотра -> Decode);

5. Ќайти операцию с машинным кодом 7505h (F7 дл€ поиска -> Hex дл€ ввода шеснадцатеричных символов);

6. »зменить операцию из jne на je (F3 дл€ входа в режим редактировани€ затем F2 дл€ изменени€ текущей команды) (–ис. 5);

7. —охранить изменени€ (F9).

–ис. 4

–ис. 5

“еперь, когда исполн€емый файл изменен, при вводе неправильного парол€, программа будет воспринимать его как правильный (–ис. 6).

–ис. 6

 

Ќа выполнение требований данного руководства ушло 30 минут.

ѕолищук ќлег


 лючевые слова:
нахождение парол€
пароль
найти
процедуры
вы€вить
программы
нахождение парол€
робот
робототехника


¬ернутьс€ в рубрику:

—татьи посетителей


смотрите здесь http://tehsklad.com.ua/konsolnyie-podemniki/ ≈сли вы хотите видеть на нашем сайте больше статей то кликните ѕоделитьс€ в социальных сет€х! —пасибо!
—мотрите также:

ќбратите внимание полезна€ информаци€.