在c
程序中,我试图将指针地址即堆地址更改为堆栈地址,以便从堆栈中获取返回地址。我可以通过输入传递所需的地址。
代码使用指针在堆中使用malloc进行内存分配。
char* bufferPtr;
bufferPtr= (char*)malloc(strlen(arg2)+4);
在与上述代码相关的GDB值中,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 :(得分: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
答案 1 :(得分:0)
分配有malloc()
的内存通常在堆上分配。实际上没有办法让你从malloc()
指向堆栈的指针。您可以添加足够大的偏移量来到达堆栈。