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

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

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

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

26.06.2014, 03:56. Просмотров 502. Ответов 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++
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2014, 03:56     Избавиться от переполнения буфера (asm)
Посмотрите здесь:

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++
Здравствуйте, есть простая программа использующая уязвимость переполнения буфера, по сути должна просто закрываться при выполнении и не...

Заблокировано защитой от переполнения буфера Windows XP
Здарова народ, не знаю в какую тему это написать, поэт написал сюда При запуске Windows media Player, Exel или некоторых других прог...

Завершение программы из-за переполнения буфера WebBrowser C#
завершение программы из-за переполнения буфера WebBrowser на c# сам код довольно длинный, но смысл в том что активно в автоматическом...

C# Как вы защищаете свои приложения от переполнения буфера?
Как вы защищаете свои приложения от переполнения буфера? Нужно ли для этого усложнять код?

Инкрементация числа до переполнения на ASM в AVR Studio
1 задача. Ввести число. В цикле инкрементировать его до переполнения. Вывести в порт вывода полученное число итераций цикла. Если это...

C# Как избавиться от ошибки переполнения памяти?
Считываю данные short из файла 29 мб и затем вывожу их на график: private void file_read(string file_name) { try ...

C# Как избавиться от переполнения стека при глубокой рекурсии?
Добрый день, Я написала рекурсивную функцию которая считает сложение дробей при n = 1000 программа выдает ответ, а если n = 10000 то...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
5122 / 4442 / 1481
Регистрация: 14.04.2014
Сообщений: 17,639
26.06.2014, 08:06     Избавиться от переполнения буфера (asm) #2
Сначала ты объясни, для чего такое написал? Программа не сможет завершиться нормально в любом случае.
mat_for_c
132 / 127 / 28
Регистрация: 26.04.2013
Сообщений: 636
Завершенные тесты: 2
26.06.2014, 10:41     Избавиться от переполнения буфера (asm) #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
Гром
209 / 128 / 11
Регистрация: 20.03.2009
Сообщений: 1,101
Записей в блоге: 16
Завершенные тесты: 1
26.06.2014, 12:19     Избавиться от переполнения буфера (asm) #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) {} ). Хотя тоже не совсем ясно, какая от этого практическая польза.
Yandex
Объявления
26.06.2014, 12:19     Избавиться от переполнения буфера (asm)
Ответ Создать тему
Опции темы

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