2016-10-21 16:24发布
void fun_a(void) { .... } int main() { int x = 5, y = 6; fun_a(); printf("%d, %d", x, y); return 0; }
请问 fun_a 函数内部如何实现能够改变程序输入不为5,6?[一道笔试题,考虑了很久,感觉可以通过指针hack外部变量,但是没有进一步思路]
这里要在func_a里面修改x/y,就需要得到它们的地址,可以使用以下方式来达到目的。
func_a
x/y
看上图,这是linux下的进程内存空间布局图,是32位的,64位也差不多,地址不一样而已。首先要明确一点,就是函数的调用是栈式的,而栈空间的地址是向下的,也就是后入栈的内存地址反而小。并且入栈的地址是对齐的。(这不是绝对的。不同的体系结构下可能是完全不同的)
在main函数里面先入栈了y,然后入栈了x,再入栈函数func_a
main
y
x
如果算偏移影响因素太多(机器字长、编译器优化),只是希望修改程序输出,那直接输出并退出就好了:
最多设置5个标签!
付费偷看金额在0.1-10元之间
这里要在
func_a
里面修改x/y
,就需要得到它们的地址,可以使用以下方式来达到目的。看上图,这是linux下的进程内存空间布局图,是32位的,64位也差不多,地址不一样而已。
首先要明确一点,就是函数的调用是栈式的,而栈空间的地址是向下的,也就是后入栈的内存地址反而小。并且入栈的地址是对齐的。(这不是绝对的。不同的体系结构下可能是完全不同的)
在
main
函数里面先入栈了y
,然后入栈了x
,再入栈函数func_a
如果算偏移影响因素太多(机器字长、编译器优化),只是希望修改程序输出,那直接输出并退出就好了:
一周热门 更多>