2015-12-23 2 views
2

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

Код использует указатель на распределение памяти в куче, используя malloc.

char* bufferPtr; 
bufferPtr= (char*)malloc(strlen(arg2)+4); 

В значениях БГД, связанных с выше коде 0x0804000a 0x0804b008

0xbfffcf80: 0x41414141 0x0804000a 0x0804b008 0x4ef9dd66 

То, что эти два адреса соответствуют, потому что мне нужно изменить этот указатель, чтобы указать на некоторый адрес (скажем 0xbfffcfd0) в стеке. Итак, какое из этих двух значений нужно коснуться.

Я перепробовал много возможностей, но тогда я получаю следующее сообщение об ошибке:

Program received signal SIGSEGV, Segmentation fault. 
__strcpy_sse2() at ../sysdeps/i386/i686/multiarch/strcpy-sse2.S:2211 
+0

Если вам нужна память в стеке, создайте локальную (стек) переменную. –

+0

У меня есть переменная стека, и у меня есть ее адрес, но если я заменил «0x0804b008» на «Новый адрес», тогда я получу ошибку. Я подозреваю, что «0x0804000a» может вызвать проблемы. Потому что '0x0804000a' соответствует' char * bufferPtr; 'и' 0x0804b008' - это фактический адрес в куче. Поэтому, если я меняю этот адрес, мне также нужно изменить '0x0804000a', но я не знаю, с какими значениями я должен его заменить – user5708039

+0

Что вы пробовали, когда получили ошибку сегментации? Еще немного кода будет полезно. См. [Как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask) и [как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/ помощь/mcve). –

ответ

2

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

int myfunction(void) 
{ 
    char buf_on_stack[32]; 
    char *ptr_to_buf_on_stack; 

    ptr_to_buf_on_stack = buf_on_stack; 
    myotherfunction(buf_on_stack); 
} 

char *global_ptr; 
void myotherfunction(char *buf_on_caller_stack) 
{ 
    global_ptr = buf_on_caller_stack; 
} 

будет иметь как global_ptr и ptr_to_buf_on_stack указывая на выделенной переменной стека (buf_on_stack в данном примере)

Теперь, если вы хотите, адрес вызывающего абонента, где что находится на стек зависит от архитектуры. Но gcc предоставляет некоторые встроенные функции, которые позволяют вам получить к нему доступ, если вы используете gcc в качестве компилятора. См. Здесь для деталей: https://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

0

памяти, выделенной с malloc() обычно выделяются в куче. На самом деле нет способа сделать указатель, который вы получаете от malloc(), указывать на стек. Вы могли бы добавить достаточно большое смещение, чтобы достичь стека.

+0

Проблема, с которой я сталкиваюсь, заключается в том, что память выделяется во время выполнения, я забыл упомянуть в коде, который я сейчас редактировал, еще 4 байта сохраняются дополнительно для выделения памяти, поэтому я не могу достичь stack even Если я передаю аргумент большой длины. – user5708039

+1

@ user5708039 Разве вам не повезло, что эту ошибку гораздо труднее использовать, чем вы думали? Я не думаю, что вы можете разбить стек этими ограничениями. Вы можете попытаться выяснить, остались ли какие-либо интересные значения в памяти после буфера и перезаписать их, но я не хочу помогать вам в использовании программы. – fuz

+0

Можете ли вы помочь мне понять, почему генерируются 2 указателя, в действительности я использовал malloc только один раз. – user5708039

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