Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 5.00
farewell
1 / 1 / 0
Регистрация: 27.03.2010
Сообщений: 27
#1

Переполнение буфера: что тут происходит? - C++

21.05.2012, 20:25. Просмотров 2365. Ответов 6
Метки нет (Все метки)

Добрый вечер; у меня есть уязвимая программа, которая в буфер длиной 30 копирует строку, переданную как аргумент этой программе. Делал по этой статье. Задача - осуществить вызов командной строки. В общем, после переполнения стек выглядит вот так:
[AAA...AAA] - буфер
[AAAAAA] - EBP
[адрес функции system()] - адрес возврата
[адрес exit()]
[адрес cmd.exe] - аргумент для функции system()
Как я понимаю, после завершения копирования делается прыжок по адресу возврата, и у нас вызывается функция system(). Эта функция нуждается в аргументе, берёт его из вершины стека (у нас наверху стека - адрес cmd.exe) А что происходит дальше? Судя по происходящему, моя программа корректно завершается, то есть выполняется функция exit(). Вопрос: почему она выполняется? У нас же в стек записан не её код, а всего лишь её адрес, почему происходит прыжок по нему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2012, 20:25     Переполнение буфера: что тут происходит?
Посмотрите здесь:
Переполнение буфера . Что делать ? C++
C++ Возникло переполнение буфера, что привело к повреждению внутреннего состояния программы
C++ Подскажите пожалуйста что тут происходит
опишите подробно что тут происходит (int*) C++
C++ Builder На каком языке написана программа Надо перевести на С++ или объяснить что тут происходит по пунктам
C++ Переполнение буфера
Переполнение буфера C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1607 / 999 / 118
Регистрация: 27.09.2009
Сообщений: 1,926
Завершенные тесты: 1
22.05.2012, 19:59     Переполнение буфера: что тут происходит? #2
Цитата Сообщение от farewell Посмотреть сообщение
У нас же в стек записан не её код, а всего лишь её адрес, почему происходит прыжок по нему?
Потому что после того, как функция system завершает работу, она возвращает управление тому, кто её вызывал. То есть, по тому адресу, который был на стеке на момент вызова. А туда какой-то хакер заботливо подложил как раз адрес exit.
farewell
1 / 1 / 0
Регистрация: 27.03.2010
Сообщений: 27
23.05.2012, 06:21  [ТС]     Переполнение буфера: что тут происходит? #3
Цитата Сообщение от Nick Alte Посмотреть сообщение
Потому что после того, как функция system завершает работу, она возвращает управление тому, кто её вызывал. То есть, по тому адресу, который был на стеке на момент вызова. А туда какой-то хакер заботливо подложил как раз адрес exit.
А почему system берет аргумент не с вершины стека? Адрес cmd.exe, который является аргументом, находится после exit... Может быть, как только вызывается system, система сразу запоминает адрес, по которому нужно потом вернуться, и вышибает его из стека? таким образом, на вершине оказывается cmd.exe, которую system и хавает в качестве аргумента.
Nick Alte
Эксперт С++
1607 / 999 / 118
Регистрация: 27.09.2009
Сообщений: 1,926
Завершенные тесты: 1
23.05.2012, 18:12     Переполнение буфера: что тут происходит? #4
system не вызывается в обычном понимании этого слова. При нормальном вызове на стек помещается адрес, в который надо вернуть управление после отработки функции. Здесь же стеком манипулируют так, чтобы при отработке функции, работающей с буфером, адрес, из которого была вызвана эта функция, подменяется на адрес system. Таким образом, после того, как функция, напортачившая с буфером, завершит выполнение, управление передают не вызывающей процедуре, а system - так, как если бы вызов скомпрометированной функции произошёл из начала system. При этом для самой system стек выглядит так, как будто её вызвали из функции exit с аргументом cmd.exe, поскольку при вызове сначала кладут на стек аргументы, а потом туда попадает адрес возврата, который оказывается по более младшему адресу, чем аргументы (не забываем, в каком направлении растёт стек).
PlayaRC
5 / 5 / 0
Регистрация: 10.03.2012
Сообщений: 121
02.03.2014, 22:22     Переполнение буфера: что тут происходит? #5
Дело за малым. Осталось только найти адрес аргумента для system(); В нашем случае - это "cmd.exe". Для этого откроем нашу библиотеку в OllyDbg и поищем там.
Как это сделать? не могу понять

вручную что ли?
farewell
1 / 1 / 0
Регистрация: 27.03.2010
Сообщений: 27
03.03.2014, 00:50  [ТС]     Переполнение буфера: что тут происходит? #6
Цитата Сообщение от PlayaRC Посмотреть сообщение
Как это сделать? не могу понять
вручную что ли?
Я уже отчислился и в гробу видал программирование, но, как я помню, да, всё вручную.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2014, 01:58     Переполнение буфера: что тут происходит?
Еще ссылки по теме:
C++ Переполнение буфера
Переполнение буфера C++
C++ Переполнение буфера
C++ переполнение буфера
C++ Linux Переполнение буфера

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
PlayaRC
5 / 5 / 0
Регистрация: 10.03.2012
Сообщений: 121
03.03.2014, 01:58     Переполнение буфера: что тут происходит? #7
Я уже отчислился и в гробу видал программирование, но, как я помню, да, всё вручную.
да как так? там , наверное, несколько тысяч полей
Yandex
Объявления
03.03.2014, 01:58     Переполнение буфера: что тут происходит?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru