【发布时间】:2021-03-12 12:27:29
【问题描述】:
出于好奇,我试图在不使用编译器的情况下在 Linux 上创建一个简单的 64 位 ELF 文件。为简单起见,我只需要 NOP (0x90)。
“readelf”可以读取我当前的文件,并且它的输出似乎还可以。然而,当我执行它时,我会遇到一个段错误。
有问题的文件(未格式化,以便更容易复制粘贴):
7F 45 4C 46 02 01 01 00 00 00 00 00 00 00 00 00 02 00 3E 00 01 00 00 00 78 00 40 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 38 00 01 00 00 00 00 00 00 00 01 00 00 00 05 00 00 00 78 00 00 00 00 00 00 00 78 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 90
GDB 在地址 0x400079 处说段错误,虽然入口点在 0x400078 并且文件大小对于 NOP 来说是 1 个字节,那么为什么要执行非保留内存呢?
奖励:为什么很多可执行文件从大虚拟地址开始其代码,而不是从 0x0?
【问题讨论】: