首页 > 解决方案 > 从标准输入传递函数名并在 C 中执行

问题描述

作为我正在处理的家庭作业的额外功劳,我们必须尝试win()通过向以下代码的可执行文件提供输入来调用(我们无法更改代码)。我们必须为 提供一个数字n和一个值target,然后执行。我知道它的价值n是什么。我对 C 语言不是很精通,但我在这里查看了许多其他关于使用函数指针的问题,我认为传入&win会起作用,但这只会打印Third challenge过多的时间,然后出现段错误。有人可以指出我正确的方向或更多资源,以便我可以更好地了解函数指针在这个程序中是如何工作的吗?

typedef void (*funcptr_t)();


int win()
{
    printf("Great Job\n");
    exit(0);
}

int main()
{
    int n = 0;
    unsigned long long target;

    printf("Third challenge\n");
    scanf("%d", &n);
    scanf("%llu", &target);
    if (n == 0xc0decafe) {
        funcptr_t funcptr = (funcptr_t)target;
        funcptr();
    }
}

标签: cfunction-pointersstdin

解决方案


如果您事先能够以某种方式计算出win函数在运行时将具有的地址,那么您可以提供该地址作为target输入值。然后代码将能够从该值中生成一个函数指针,该指针将对应于实际win函数,然后调用该函数。

帮助您获取与给定函数关联的地址的工具通常是链接器,或某种对象/可执行转储实用程序。

请参阅链接器如何找到主要功能?有关工具的概述。


推荐阅读