将指针更改为指向堆栈地址而不是堆地址
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_ptr 和 ptr_to_buf_on_stack 指向堆栈分配的变量(buf_on_stack 在这个例子中)
现在,如果您想要调用者的地址,它在堆栈中的位置取决于体系结构。但是 gcc 提供了一些内置函数,允许您在使用 gcc 作为编译器时访问它。详情请看这里:https://gcc.gnu.org/onlinedocs/gcc/Return-Address.html
在 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_ptr 和 ptr_to_buf_on_stack 指向堆栈分配的变量(buf_on_stack 在这个例子中)
现在,如果您想要调用者的地址,它在堆栈中的位置取决于体系结构。但是 gcc 提供了一些内置函数,允许您在使用 gcc 作为编译器时访问它。详情请看这里:https://gcc.gnu.org/onlinedocs/gcc/Return-Address.html