gpt4 book ai didi

c - 使用指针运算来更改另一个函数中变量的值。

转载 作者:太空宇宙 更新时间:2023-11-04 01:55:18 25 4
gpt4 key购买 nike

#include <stdio.h>

void interrupt();

int main() {
int n = 8;
char c = 'Z';
interrupt();
printf("%d%c\n", n, c);
}

void interrupt() {
printf("Run normally\n");
//ADD CODE...
}

就目前而言,无论 interrupt() 方法做什么,此函数都将输出“8Z”。我试图修改它,使其打印“3Y”而不更改原始主函数中的任何内容,并且仅使用 interrupt() 函数(不允许传递参数!)。我可以在 interrupt() 函数中使用变量,但我很困惑如何在不创建全局变量的情况下获取 'n' 和 'c' 的地址,这会破坏这个问题的目的。由于每次运行时堆栈的地址都会发生变化,因此似乎没有办法进行指针运算(这是我需要做的),因此我有点困惑和卡住了。

最佳答案

免责声明:不要尝试在生产代码中使用它

我把它当作一个谜题并着手解决它。你说你不能修改 main。我冒昧地稍微修改了 main —— 以打印 nc 的地址。

int main()
{
int n = 8;
char c = 'Z';

printf("%p %p\n", &n, &c);

interrupt();
printf("%d%c\n", n, c);
}

我还稍微修改了interrupt,也打印了一个地址的值。

void interrupt() {
int i = 10;
char* np = (char*)&i;
char* cp = (char*)&i;

printf("%p %p\n", np, cp);
printf("%p\n", &i);
}

当我运行程序时,我得到了以下输出:

0x22cb0c 0x22cb0b
0x22cabc 0x22cabc
0x22cabc
8Z

从输出中,我能够计算 main 中的 &ninterrupt 中的 &i 之间的偏移量,以及 main 中的 &cinterrupt 中的 &i 之间的偏移量。现在我可以操纵偏移量使 interrupt 中的 npcp 指向 nc main 中。

void interrupt() {
int i = 10;
char* np = (char*)&i;
char* cp = (char*)&i;

np += (0x22cb0c - 0x22cabc);
cp += (0x22cb0b - 0x22cabc);

*(int*)np = 3;
*cp = 'Y';

printf("%p %p\n", np, cp);
printf("%p\n", &i);
}

随着 interrupt 的改变,我得到以下输出:

0x22cb0c 0x22cb0b
0x22cb0c 0x22cb0b
0x22cabc
3Y

通过稍微更改 main 完成任务。如果根本不允许更改它,则必须使用不同的程序来计算偏移量。

关于c - 使用指针运算来更改另一个函数中变量的值。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35192231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com