Техника сетевых атак
Шрифт:
·.text:0040104F; В регистр edx заносится смещение буфера, содержащего введенный пароль
·.text:00401052 push edx
·.text:00401052; Сейчас в верхушке стека содержатся два значения
·.text:00401052; смещение эталонного пароля и смещения буфера, содержащего введенный пароль
·.text:00401053 call _strcmp
·.text:00401053; Вызов функции strcmp( amp;pass[0],”Guest”)
·.text:00401058 add esp, 8
·.text:00401058; Балансировка стека
·.text:0040105B test eax, eax
·.text:0040105B; Значение, возвращаемое функцией помещается в регистр eax
·.text:0040105B; если он равен нулю, то строки идентичны и наоборот
·.text:0040105B; если eax равен нулю, команда test выставляет флаг нуля
·.text:0040105D jnz short loc_0_401066
·.text:0040105D; Если флаг не установлен (пароль не равен “Guest”), переход по адресу 401066
·.text:0040105F mov eax, 1
·.text:0040105F; В регистр eax заносится значение 1, которое будет возвращено при выходе из нее
·.text:00401064 jmp short loc_0_401068
·.text:00401064; Переход по адресу 401068 (к выходу из функции)
·.text:00401066; ---------------------------------------------------------------------------
·.text:00401066
·.text:00401066 loc_0_401066:; CODE XREF: auth+4Bj
·.text:00401066 xor eax, eax
·.text:00401068; Обнулить значение регистра eax
·.text:00401068 loc_0_401068:; CODE XREF: auth+52j
·.text:00401068 mov esp, ebp
·.text:00401068; Восстановить значение регистра esp, который должен указывать на сохраненный в стеке регистр ebp
·.text:0040106A pop ebp
·.text:0040106A; Восстановить ebp
·.text:0040106B retn
·.text:0040106B; Выйти из функции. Команда retn снимает из стека двойное слово, которое при
·.text:0040106B; нормальном развитии событий должно быть равно адресу возврата (в данном примере 00401081
·.text:0040106B; (смотри функцию main)
·.text:0040106B auth endp
·.text:0040106B
·.text:0040106C
·.text:0040106C; --------------- S U B R O U T I N E ---------------------------------------
·.text:0040106C
·.text:0040106C; Attributes: bp-based frame
·.text:0040106C
·.text:0040106C main proc near; CODE XREF: start+AFp
·.text:0040106C push ebp
·.text:0040106C; Занесение в стек значение регистра ebp
·.text:0040106D mov ebp, esp
·.text:0040106D; Открытие кадра стека
·.text:0040106F push offset aBufferOverflow; "Buffer Overflows Demo\n"
·.text:0040106F; Занесение в стек смещения строки “ Buffer Overflows Demo” для вывода ее на экран
·.text:00401074 call _printf
·.text:00401074; Вызов функции printf(“Buffer Overflows Demo\n")
·.text:00401079 add esp, 4
·.text:00401079; Балансировка стека
·.text:0040107C call Auth
·.text:0040107C; Вызов функции Auth. В стек заносится адрес следующей за call команды, т.е. 00401081
·.text:00401081 test eax, eax
·.text:00401081; Функция Auth возвратила нулевое значение?
·.text:00401083 jz short loc_0_401094
·.text:00401083; Если функция возвратила нулевое значение перейти по адресу 401094
·.text:00401085 push offset aPasswordOk; "Password ok\n"
·.text:00401085; Занесение в стек смещения строки «Password Ok”
·.text:0040108A call _printf
·.text:0040108A; Вызов функции printf(“Password OK\n”);
·.text:0040108F add esp, 4
·.text:0040108F; Балансировка стека
·.text:00401092 jmp short loc_0_4010A1
·.text:00401092; Переход по адресу 4010A1
·.text:00401094; ---------------------------------------------------------------------------
·.text:00401094
·.text:00401094 loc_0_401094:; CODE XREF: main+17j
·.text:00401094 push offset aInvalidPasswor; "Invalid password\n"
·.text:00401094; Занесение в стек строки “ Invalid password”
·.text:00401099 call _printf
·.text:00401099; Вызов функции printf("Invalid password\n")
·.text:0040109E add esp, 4
·.text:0040109E; Балансировка стека
·.text:004010A1
·.text:004010A1 loc_0_4010A1:; CODE XREF: main+26j
·.text:004010A1 pop ebp
·.text:004010A1; Восстановление ebp
·.text:004010A2 retn
·.text:004010A2; Завершение программы
·…
·.text:004010A2 main endp
·.data:00406030 aHelloRoot db 'Hello, Root!',0Ah,0; DATA XREF:.text:00401003o
·.data:0040603E align 4
·.data:00406040 aLogin db 'Login:',0; DATA XREF: auth+6o
·.data:00406047 align 4
·.data:00406048 aPassw db 'Passw:',0; DATA XREF: auth+1Fo