2011-03-09 2 views
0

Я пытаюсь переполнить буфер в C++, который является частной переменной. Где он живет в стеке? Это возможно?Где частные переменные живут в стеке в C++

Что-то вроде

class aClass{ 
private: 
    char buffer[SIZE]; 
public: 
} 
+7

Что такое «частная переменная»? Почему вы пытаетесь переполнить этот буфер? –

+4

Похоже, вы путаете C с C++ – SpliFF

+1

«Я пытаюсь переполнить буфер». У вас проблемы с написанием вредоносного ПО? Если вы хотите, чтобы мы могли писать ваши вредоносные программы, возможно, вы могли бы принять ответы на предыдущие вопросы. Наконец, почему вы удалили текст из предыдущего [вопроса] (http://stackoverflow.com/questions/5236124/)? Я восстановил его, кстати. Вы делаете это, что усложняет нам понимание контекста этого. –

ответ

2

Er ... Ваш вопрос звучит так: «Какой цветное голубое небо?». И ответ, по-видимому, «синий».

Когда переменная выделяется «в стеке», она живет в стеке.Больше нет подробного объяснения. «В стеке» есть ответ на «где?». вопрос. Память стека является однородной. Нет более подробного «где», чем простого и простого «в стеке».

Тот факт, что ваш массив является частным членом класса, не имеет никакого значения. Весь массив является неотъемлемой частью объекта. Если вы определяете объект своего типа как локальный объект («в стеке»), тогда весь массив будет находиться в стеке, независимо от того, является ли он приватным или нет.

Если это не ответит на ваш вопрос, десять вы должны переформулировать его более значимым образом.

0

Попробуйте следующее:

#include <string.h> 

void foo (char *bar) 
{ 
    char c[12]; 

    strcpy(c, bar); // no bounds checking... 
} 

int main (int argc, char **argv) 
{ 
    foo(argv[1]); 
} 
0

Запись мимо массив можно рассматривать как пример переполнения буфера. Вы можете сделать это как всегда, но я не знаю, чего вы пытаетесь достичь, сделав это.

void aClass:: bufferOverflow() // Assuming this a member of aClass 
{ 
     for(int i=0; i<(SIZE+2), ++i) 
      buffer[i] = 'a'; // Writing past the 2 locations. 
} 

Где он живет на стек?

Стек его сам является местом хранения. Что вы подразумеваете под тем, где он живет в стеке.

4

Публичные и частные переменные не обрабатываются по-разному с точки зрения макета. Класс, выделенный в стеке, имеет внутренние члены данных, выделенные в стеке, независимо от того, являются ли они частными или общедоступными.

class MyClass { 
public: 
    int PublicInt; 
private: 
    int PrivateInt; 
}; 

int main() { 
    MyClass instance; 
} 

эквивалентно, с точки зрения памяти

int main() { 
    int a, b; 
}; 
2

Да, его можно, переменная выложена на стеке в прилежащей порядке, как и остальные члены этого объекта; более того, в C++ сами данные всегда будут доступны механизмами нижнего уровня. Частная/общественная парадигма - это просто защита, предназначенная для предотвращения случайного доступа во время компиляции, но это никоим образом не означает, что невозможно получить доступ к этим данным.

Проблема заключается в том, что «Порядок распределения нестатических элементов, разделенных спецификатором доступа, не указан». в соответствии с разделом 9.2 раздела 12 стандарта. См. Сообщение this для получения дополнительной информации.

Если вы написали код, о котором говорите (и, следовательно, у вас есть возможность его модифицировать), я настоятельно рекомендую изменить дизайн, чтобы вам не пришлось это делать. В C++ есть ключевое слово, называемое «friend» или «класс друга», вы можете посмотреть.

Или ... вы можете обмануть, так как this предлагает плакат.

1

Вот простая программа, которая может повредить стек; он фактически производит неопределенное поведение или поведение, которое зависит платформа:

void function_destroyer(int a, double b, char c) 
{ 
    unsigned char array[1]; 
    for (int i = 0; i < 32; ++i) 
    { 
    array[1 - i] = 0x24; // A value chosen at random 
    } 
    return; 
} 

int main(void) 
{ 
    function_destroyer(1, 1.5. 'f'); 
    return EXIT_FAILURE; 
} 

Стек может быть поврежден путем доступа к элементам перед первым элементом в массиве. Это зависит от компилятора, создающего стек и проходящего переменные в стеке.

Смежные вопросы