将指针更改为指向堆栈地址而不是堆地址

Change pointer to point to stack address instead of heap address

c 程序中,我试图将指针地址(即堆地址)更改为堆栈地址,以便我可以从堆栈到达 return 地址。我可以通过输入传递所需的地址。

代码使用指针在使用 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

malloc()分配的内存通常分配在堆上。没有真正的方法可以使从 malloc() 获得的指针指向堆栈。不过,您可以添加足够大的偏移量以到达堆栈。

如果你只是想指向堆栈位置,你不需要为它分配内存。例如

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_ptrptr_to_buf_on_stack 指向堆栈分配的变量(buf_on_stack 在这个例子中)

现在,如果您想要调用者的地址,它在堆栈中的位置取决于体系结构。但是 gcc 提供了一些内置函数,允许您在使用 gcc 作为编译器时访问它。详情请看这里:https://gcc.gnu.org/onlinedocs/gcc/Return-Address.html