c - 从标准输入传递函数名并在 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();
}
}
解决方案
如果您事先能够以某种方式计算出win
函数在运行时将具有的地址,那么您可以提供该地址作为target
输入值。然后代码将能够从该值中生成一个函数指针,该指针将对应于实际win
函数,然后调用该函数。
帮助您获取与给定函数关联的地址的工具通常是链接器,或某种对象/可执行转储实用程序。
请参阅链接器如何找到主要功能?有关工具的概述。
推荐阅读
- sql-server - 用以前的记录值更新最新记录
- javascript - Switch 语句返回不正确的值
- go - 如何确认来自 Go 客户端的 gRPC 流量是 TLS 加密的
- python - 从谷歌驱动器获取 CSV,然后加载到熊猫
- excel - 如何阻止数据透视表过滤破坏我的 14 天滚动平均度量?
- javascript - 上传到 AWS S3 得到 403 Forbidden - 通过删除参数中的“ACL”解决
- go - Golang int to uint8 converison,未检测到溢出
- apache-camel - Qpid 客户端 Apache Artemis 2.14.0 高可用性不起作用
- java - 在 Spring Boot 中使用 Gradle 从环境变量设置 spring.profiles.active
- reactjs - React App 无法在 Microsoft Edge 浏览器上运行,但在 Chrome 和 Firefox 上运行良好