Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
KOLLIAK
0 / 0 / 0
Регистрация: 26.06.2014
Сообщений: 3
#1

Избавиться от переполнения буфера (asm) - C++

26.06.2014, 03:56. Просмотров 568. Ответов 3
Метки нет (Все метки)

Всем привет, на вашем форуме первый раз)
Имея базовые знания по C++ и Assembler решил сварганить такую штуку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// test.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
 
void test();
void *p = *test;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    _asm
    {
        push p;
        ret;
    }
}
 
void test()
{
    cout << 1 <<" ";
    _asm
    {
        push p;
        ret;
    }
}
Как итог происходит переполнение буфера.
Объясните, почему оно происходит(натолкните на место, где можно прочитать), и, если возможно, как это исправить.

Так же было бы интересно узнать, возможен ли инклуд dll, используя лишь чистый ассемблерный winapi?
Заранее благодарен. Прошу сильно не пинать.

Добавлено через 32 минуты
VC++
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2014, 03:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Избавиться от переполнения буфера (asm) (C++):

Ошибка переполнения буфера - C++
При первом запуске програма работает, после второго появляеться ошибка переполнения буфера. В чем дело?#include &lt;iostream&gt; #include...

Отлов исключения переполнения буфера - C++
Вот код #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;conio.h&gt; #include &lt;locale.h&gt; #include &lt;exception&gt; using namespace std; ...

Динамическое обнаружение ошибки переполнения буфера - C++
Дипломное задание написать программу, которая на вход берет .exe и после обработки показывает возможно ли в данном .exe использование...

Простой эксплоит переполнения буфера не работает( - C++
Здравствуйте, есть простая программа использующая уязвимость переполнения буфера, по сути должна просто закрываться при выполнении и не...

Защита от переполнения - C++
Ребят помоги создать защиту от переполнения через функцию scanf_s и убрать нолики в конечном ответе, вот код: #include &lt;stdio.h&gt; ...

Флаг переполнения - C++
Доброго времени суток! Подскажите, как проверить какую-либо определенную переменную типа double на переполнение (значениe -1.#IND00,...

3
nmcf
5535 / 4845 / 1642
Регистрация: 14.04.2014
Сообщений: 19,657
26.06.2014, 08:06 #2
Сначала ты объясни, для чего такое написал? Программа не сможет завершиться нормально в любом случае.
0
mat_for_c
164 / 159 / 34
Регистрация: 26.04.2013
Сообщений: 724
Завершенные тесты: 3
26.06.2014, 10:41 #3
KOLLIAK, по крайней мере так работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
 
void test();
void *p = *test;
 
 
int main()
{
    _asm
    {
        push p;
        ret;
    }
}
 
void test()
{
    cout << 1 <<" ";
    _asm
    {
        push p;
        ret;
    }
}
с предкомпилированным заголовком "stdafx.h" в VS2010
0
Гром
210 / 129 / 11
Регистрация: 20.03.2009
Сообщений: 1,103
Записей в блоге: 16
Завершенные тесты: 1
26.06.2014, 12:19 #4
Если я все правильно понимаю, то этот код эквивалентен следующему:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
void test();
 
int main()
{
    test();
}
 
void test()
{
    cout << 1 <<" ";
    test();
}
То есть в мейне выполняем тест, внутри теста выполняем тест, внутри теста выполняем тест... В общем, у попа была собака... И так до бесконечности. Точнее, пока стек не закончится.

Сначала мы идем прямым ходом рекурсии, и каждый раз, вызывая внутри теста его же самого заново, мы сохраняем по крайней мере адрес возврата для вновь вызываемого теста, и пока что не собираемся занятую память освобождать. И вот мы берем и берем на стеке память под адресы возврата, вызывая тест снова и снова, пока стек не закончится. Затем наступает коллапс.

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

Вообще, непонятно, что конкретно вы хотели сделать. Если просто бесконечно выводить что-то на экран, то можно воспользоваться итерацией вместо рекурсии, то есть циклом (for( ; ; ) {} или while(true) {} ). Хотя тоже не совсем ясно, какая от этого практическая польза.
0
26.06.2014, 12:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2014, 12:19
Привет! Вот еще темы с ответами:

Переполнения безопастны? - C++
Насколько безопасна строчка: for(unsigned int b(UINT_MAX); ++b != UINT_MAX;) или такое нужно писать только так: unsigned int b(0);...

СИ++ и контроль переполнения - C++
Можно ли как-нибудь в VS включить контроль переполнения при математических вычислениях? Чтоб, например, возникало исключение. Или это можно...

Как отловить переполнения? - C++
Есть проект dll, в в нём экспортируемая функция, возвращающая BOOL, требуется при переполнении любой вещественной операции в теле этой...

Ошибка переполнения массива - C++
Здравствуйте. Задача легкая,нужно создать массив из 1000000 элементов,и найти 1000001,и вывести сообщение что не найден такой элемент. Но...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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