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

Как обмануть компилятор и "перепрыгнуть через функцию"? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ vector<[class]> in class и перегрузка (ostream) http://www.cyberforum.ru/cpp-beginners/thread935871.html
Доброе всем время суток ) столкнулся с проблемой Есть у меня несколько классов и есть класс внутри которого созданы векторы хранящие элементы других 3-х классов Пытался перегрузить острим для вывода на консоль содержимого класса и вот попал в капкан ) возможно даже своей криворукости так как только изучаю STL вообщем так работает и выводит ostream& operator<<(ostream& os,const...
C++ Структура в классе Здраствуйте! Хотел спросить можно ли использовать структуру в классе и соответствует ли оно принципам ООП? #include <iostream> #include <cmath> using namespace std; class Quad { protected: struct coord http://www.cyberforum.ru/cpp-beginners/thread935858.html
ошибка в коде C++
#include <string.h> #include <iostream> #include <stdio.h> int main() { char m1="=id"; char m2; char m3;
C++ Как програмно узнать сколько элементов в перечислении?
Допустим, есть такое перечисление. enum Month{JANUARY=1, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER}; sizeof(Month) показывает размер одного элемента
C++ EOF что это http://www.cyberforum.ru/cpp-beginners/thread935822.html
В книге встречается записи типа ..если встретится указанный символ-ограничитель, по умолчанию это EOF... Что за EOF?
C++ Использование printf в функции Подскажите, пожалуйста: передаю в функцию два параметра для вывода void fun(string x, int y) { printf("%s%d",x,y); } надо, чтобы вывел подробнее

Показать сообщение отдельно
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.08.2013, 16:51     Как обмануть компилятор и "перепрыгнуть через функцию"?
Известно, что адрес возврата из функции сохраняется на стеке. (В данном эксперименте мы отключим все виды инлайна в оптимизациях).
Так вот, я решил воспользоваться этим свойством и написать программу, которая ломает вложенный вызов нескольких функций путём манипуляций со стеком.
Программа следующая:
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
//#include <iostream>
void* ret_address;
//void* old_stack;
int get6(){
    _asm{
        mov eax, ret_address; //надеемся, что при наступлении return
// программа прыгнет прямиком в main
        mov [ebp+4], eax;
        pop ebp;//убираем из стека то, что должна 
        pop ebp;//была убрать get5 при своём завершении
    }
//std::cout<<"return 6 triggered"<<std::endl;
    return 6;
}
int get5(){
    _asm{
        mov eax, [ebp+4];
        mov ret_address, eax;
 
    }
    get6();
//std::cout<<"return 5 triggered"<<std::endl;
    return 5;
}
 
int main(){
    return get5();
}
Вопрос: почему программа вылетает с ошибкой порчи стека и регистра esp? Что я неправильно сделал?

Не по теме:

MSVS2008

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 20:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru