我知道,如果我在foo()
某个从bar()
函数某处调用的函数内,那么此返回地址将压入堆栈。
#include <stdio.h>
void foo()
{
unsigned int x;
printf("inside foo %x\n", &x);
}
int main()
{
foo();
printf("in main\n");
return 0;
}
在上面的代码中,当foo函数处于活动状态时,我将获取堆栈中第一个推送的局部变量的地址。我如何访问在此变量堆栈之前的某个地方返回的返回地址(主要称为foo)?该位置是否固定并且可以相对于第一个局部变量访问?我该如何修改?
编辑:我的环境是带有gcc编译器的x86处理器上的Ubuntu 9.04。
有一个内置的gcc: void * __builtin_return_address (unsigned int level)
参见http://gcc.gnu.org/onlinedocs/gcc/Return-
Address.html
在某些体系结构上,您可以在堆栈中相对于第一个参数找到它。例如,在ia32上,以相反的顺序推送参数,然后进行调用以推送返回地址。请记住,堆栈几乎总是(在ia32上)
向下 增长。尽管从技术上讲,您需要针对您的语言和硬件平台的 ABI 或 调用约定 (有时称为 链接约定
),但实际上,您通常可以猜测是否知道过程调用机器op的工作方式。
与本地地址和返回地址之间的关系相比,函数的第一个参数与返回地址在堆栈上的位置之间的关系更可能是可靠的固定值。但是,您当然可以打印出本地地址和第一个参数的地址,并且经常会在它们之间找到PC。
$ expand < ra.c
#include <stdio.h>
int main(int ac, char **av) {
printf("%p\n", __builtin_return_address(0));
return 0;
}
$ cc -Wall ra.c; ./a.out
0xb7e09775
$
问题内容: 如何确定Linux中程序的当前堆栈大小? 据说每个程序的堆栈大小在Linux中将是8 MB,但是当您使用cat / proc // mmap时,它将显示不同的大小。 另外,如何确定相关线程的堆栈大小?既然说线程有自己的私有堆栈? 问题答案: 如果仅需要当前的堆栈大小,则可以在main()的顶部声明一个变量,获取其地址,然后将其与在定义“当前”的位置声明的变量的地址进行比较。差异应为堆栈
我试图通过使用gdb-peda中创建的循环模式,在简单的缓冲区溢出期间检索Ret地址的偏移量。我期望返回到被调用方的帧上有一个sigsegv,但是我在注入缓冲区的printf期间得到了它。 我正在使用x86 kali linux。我可以算出我的重地址是264字节,我可以通过rop-ing来利用这个程序。我想在整个循环模式中评估RET地址,因此我在gdb-peda中使用了它 创建模式。最后,我将我的
我需要检查堆栈中是否有重复项(仅在基本方法pop、push、top、isempty中使用),如果堆栈没有重复项,则返回true;如果堆栈为空,则返回true;如果堆栈有重复项,则返回false 如果不使用另一个函数和最短路径,我如何做到这一点?解决方案需要使用基本方法,而不使用c的内置函数#
问题内容: 我目前正在使用Linux上的ARM汇编作为学习练习。我正在使用“裸”程序集,即没有libcrt或libgcc。任何人都可以向我指出有关在调用第一条指令之前在程序开始时堆栈指针和其他寄存器处于什么状态的信息吗?显然,pc / r15指向_start,其余似乎已初始化为0,只有两个例外:sp / r13指向我程序之外的地址,而r1指向稍高的地址。 因此,提出了一些可靠的问题: r1中的值是
问题内容: 似乎有人认为,在64位体系结构上不需要使用“拆分堆栈”运行时模型。我说的似乎是,因为我还没有看到任何人真的这么说,只在它周围跳舞: 由于每个线程不需要最坏情况的堆栈大小,因此典型的多线程程序的内存使用量可能会大大减少。在32位地址空间中运行数百万个线程(完整的NPTL线程或协程序)成为可能。- 伊恩·兰斯·泰勒(Ian Lance Taylor) …暗示一个64位地址空间已经可以处理它
我有一个堆栈的ArrayList,我在其中一个堆栈中添加了一个元素,并在列表中循环打印每个堆栈的索引 然后我从上一个堆栈中删除元素,将其添加到下一个堆栈中,打印每个堆栈的索引,并对ArrayList中的所有堆栈继续此操作 然而,当任何堆栈为空时,在获取ArrayList中每个堆栈的索引时会出现非常不寻常的行为。非空的堆栈将具有正确的索引值,而空的堆栈将具有错误的索引值 此外,如果包含元素的堆栈的索