gpt4 book ai didi

linux - 从头开始创建简单的微型 ELF

转载 作者:太空宇宙 更新时间:2023-11-04 10:41:08 58 4
gpt4 key购买 nike

我目前正在尝试根据他们的文档(第 8 页)[1] 使用 ELFIO 库创建简单的 ELF 可执行文件。这是 readelf 在其代码的略微修改版本上运行时的输出(不重要,只是不同的字符串和地址基数。对齐、标志等未受影响。)

ELF Header:
Magic: 7f 45 4c 46 01 01 01 03 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - GNU
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x400000
Start of program headers: 52 (bytes into file)
Start of section headers: 4168 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 2
Size of section headers: 40 (bytes)
Number of section headers: 4
Section header string table index: 1

Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .shstrtab STRTAB 00000000 00102e 000017 00 0 0 0
[ 2] .text PROGBITS 00400000 001000 00001d 00 AX 0 0 16
[ 3] .data PROGBITS 00400020 001020 00000e 00 WA 0 0 4
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x001000 0x00400000 0x00400000 0x0001d 0x0001d R E 0x1000
LOAD 0x001020 0x00400020 0x00400020 0x0000e 0x0000e RW 0x10

Section to Segment mapping:
Segment Sections...
00 .text
01 .data

这个可执行文件运行良好。我想将数据部分从文本部分移开一点,所以我选择了地址 0x400040。在这里你可以看到这就是我所做的一切。

ELF Header:
Magic: 7f 45 4c 46 01 01 01 03 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - GNU
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x400000
Start of program headers: 52 (bytes into file)
Start of section headers: 4168 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 2
Size of section headers: 40 (bytes)
Number of section headers: 4
Section header string table index: 1

Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .shstrtab STRTAB 00000000 00102e 000017 00 0 0 0
[ 2] .text PROGBITS 00400000 001000 00001d 00 AX 0 0 16
[ 3] .data PROGBITS 00400040 001020 00000e 00 WA 0 0 4
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x001000 0x00400000 0x00400000 0x0001d 0x0001d R E 0x1000
LOAD 0x001020 0x00400040 0x00400040 0x0000e 0x0000e RW 0x10

Section to Segment mapping:
Segment Sections...
00 .text
01 .data

但是,这个文件保持seg。一开始就出错。我真的不明白发生了什么。起初我虽然它与部分和段的对齐有关,但它们对我来说似乎没问题。我也怀疑过 ASLR(因为 Hello World 的地址是硬编码的,没有重定位)并试图在 /proc/sys/kernel/randomize_va_space 中将其关闭。我还检查了 linux 内核源代码,尤其是文件 fs/binfmt_elf.c,但要完全理解那里发生的事情,我需要更多时间。所以我想请求你的帮助。如果你知道地址 0x400040 有什么问题,为什么这个文件保持 seg。错误,或者您可以指出内核中的特定代码行,那么我将不胜感激。

编辑:我也试过 gdbbt 提供了 No stack。在入口点地址上设置读取观察点不会执行任何操作。

编辑 2:在处理文件后,我发现将第二段的文件偏移量从 0x1020 移动到 0x1040 会导致文件正常工作。所以现在我的问题是,文件偏移量和虚拟地址是否需要某种关系?

[1] http://elfio.sourceforge.net/elfio.pdf

最佳答案

So now my question is, does file offset and virtual address need to be in some relation?

是的:文件偏移量必须VirtAddrPhysAddr 模页面大小一致,因为文件是mmap直接(由内核加载程序)编辑。

如果您不维护该关系,内核将创建一个新进程,尝试将您的可执行文件映射到其中,发现您违反了基本约束,并将终止您的进程(使用 SIGKILL,我相信)。您的进程永远不会在用户空间中执行任何指令。

关于linux - 从头开始创建简单的微型 ELF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35136059/

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