Читаем Техника сетевых атак полностью

·.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

·.data:0040604F align 4

·.data:00406050 aGuest db 'guest',0; DATA XREF: auth+38o

·.data:00406056 align 4

·.data:00406058 aBufferOverflow db 'Buffer Overflows Demo',0Ah,0; DATA XREF: main+3o

·.data:0040606F align 4

·.data:00406070 aPasswordOk db 'Password ok',0Ah,0; DATA XREF: main+19o

·.data:0040607D align 4

·.data:00406080 aInvalidPasswor db 'Invalid password',0Ah,0; DATA XREF: main+28o

·

Анализ кода позволил установить, что искомая функция располагается по адресу, равному 0x401000, а шестнадцатый символ имени пользователя затирает завершающим строку нулем младший байт адреса возврата.

Для передачи управления на функцию root() необходимо подменить адрес возврата на ее адрес. Поскольку, адрес возврата, уже содержащийся в стеке, равен 0х401081, а адрес функции root() равен 0x401000, для достижения поставленной цели достаточно всего лишь обнулить младший байт. Если ввести строку длиной 16 символов (не важно каких), завершающий ее нуль придется как раз на младший байт сохраненного в стеке регистра EIP и инструкция retn передаст управление на функцию root().

· - 0x0С user[0] 01 X

· - 0x0B user[1] 02 X

· - 0x0A user[2] 03 X

· - 0x09 user[3] 04 X

· - 0x08 user[4] 05 X

· - 0x07 user[5] 06 X

· - 0x06 user[6] 07 X

· - 0x05 user[7] 08 X

· - 0x04 user[8] 09 X

· - 0x03 user[9] 10 X

· - 0x02 дырка 11 X

· - 0x01 дырка 12 X

· 0x00 ebp[0] 13 X

· + 0x01 ebp[1] 14 X

· + 0x02 ebp[2] 15 X

· + 0x03 ebp[3] 16 X

· + 0x04 eip[0] 81 17 0

· + 0x05 eip[1] 10 18

· + 0x06 eip[2] 40 19

· + 0x07 eip[3] 00 20

Если на запрос имени пользователя ввести, например, такую строку, то на экран выдастся приветствие “Hello, Root!”, подтверждающие факт передачи управления функции root(), что не было предусмотрено разработчиком.

Однако сразу же после завершения функции root(), программа грохается, и операционная система выдает сообщение об исключительной ситуации, предлагая завершить работу приложения (смотри рисунок 073). (Реакция операционной системы зависти от самой операционной системы, данный скриршет иллюстрирует поведение Windows 2000)

Рисунок 073 Реакция операционной системы на подмену адреса возврата адресом функции Root

Исключение происходит из-за нарушения балансировки стека, - ведь перед передачей управления функции Root, в стек не был занесен адрес возврата! Но команда retn, в строке 0x401011, “не зная” этого, снимает со стека первое попавшееся ей «под руку» двойное слово и передает на него управление.

Если нажать клавишу «отмена», операционная система запустит отладчик (конечно, при условии, что он установлен в системе). Стек, просмотренный с его помощью, должен выглядеть следующим образом (область стека, принадлежащая функции start() не показана, поскольку в данном случае не представляет никакого интереса):

· 0012FF74 7 8787878 ? буфер имени пользователя

· 0012FF78 78787878 ? было: регистр EBP, сохраненный функцией Auth; стало буфер имени пользователя

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных