【发布时间】:2020-07-12 07:21:48
【问题描述】:
我试图阅读mmap 上的文档,但我仍然很难理解如何使用它。
我想从命令行获取一个参数,然后将它分配给一个可执行的内存区域。然后我希望能够从该代码执行。
这是我目前所拥有的:
int main(int argc, char const *argv[]) {
if (argc != 2) {
printf("Correct input was not provided\n");
exit(1);
}
char assembly_code[sizeof argv[1]];
const char *in_value = argv[1];
int x = sscanf(in_value, "%02hhx", assembly_code);
if (x != 1) {
printf("sscanf failed, exited\n");
exit(1);
}
void * map;
size_t ac_size = sizeof(assembly_code) / sizeof(assembly_code[0]);
map = mmap(NULL, ac_size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANONYMOUS, -1, 0);
if (map == MAP_FAILED) {
printf("Mapping failed\n");
exit(1);
}
((void (*)(void))map)();
return 0;
}
这是我得到的输出/错误:Mapping failed
我不知道我是否正确使用了mmap。如果我是,我不相信我执行正确。
例如,如果使用参数e8200000004889c64831c048ffc04889c74831d2b2040f054831c0b83c0000004831ff0f05e806000000584883c008c3ebf84869210a 运行此文件,它应该返回Hi! 然后终止。我真的不知道如何在地图之后获得此输出或如何“调用/执行”mmap。
【问题讨论】:
-
您尝试过什么?你的尝试有什么问题?你从系统调用中得到什么错误(如果有的话)?
-
另请注意,您的单个
sscanf调用将仅读取和解析argv[1]中字符串的前两位数字。顺便说一句,您应该始终检查它是否存在,方法是检查argc。您还应该比较x != 1以便能够处理字符串中的无效输入。 -
我看到了一些黑客行为......
-
@MichaelDorgan 不幸的是,这只是一个课堂作业。