【问题标题】:Segmentation fault when using memory with custom ELF file将内存与自定义 ELF 文件一起使用时出现分段错误
【发布时间】:2019-05-27 12:57:12
【问题描述】:

我正在尝试使用自定义 ELF 标头编写一个小型 ELF 程序,但每当我写入内存时都会出现分段错误。

为什么该代码会触发分段错误?

%分配 LOAD_ADDRESS 0x08048000 位 32 组织加载地址;加载地址 人类发展报告:; Elf32_Ehdr db 0x7F,“ELF”,1、1、1; e_ident 乘以 9 分贝 0 ;一些地方运行代码? dw 2 ; e_type dw 3 ;电子机器 dd 1 ; e_version dd _start ; e_entry dd phdr - $$ ; e_phoff dd shent - $$ ; e_shoff dd 0 ; e_flags dw ehdrsz ; e_ehsize dw phdrsz ; e_phentsize dw 1 ; e_phnum dw shentsize ; e_shentsize dw 3 ; e_shnum dw 2 ; e_shstrndx ehdrsz equ $ - ehdr 博士:; Elf32_Phdr dd 1 ; p_type dd 0 ; p_offset dd $$ ; p_vaddr dd $$ ; p_paddr dd文件z; p_filesz dd文件z; p_memsz dd 5 ; p_flags dd 0x1000 ; p_align phdrsz equ $ - phdr 沉:;部分表 ;数据 dd 0 ;未命名 dd 1 ;收益 dd 2|1 ;分配/写入 dd数据 dd 数据 - LOAD_ADDRESS dd数据sz dd 0 dd 0 dd 4 dd 0 shentsize equ $ - shent ;单个节条目的长度 ; bss dd 6 ;未命名 dd 8 ;诺比特 dd 2|1 ;分配/写入 dd bss dd bss - LOAD_ADDRESS dd bssz dd 0 dd 0 dd 4 dd 0 ; shstrtab dd 11 ;未命名 dd 3 ; STRTAB dd 0 dd shstrtab dd shstrtab - LOAD_ADDRESS dd shstrtabsz dd 0 dd 0 dd 1 dd 0 ; ELF结束 部分 .shstrtab shstrtab: 分贝“.data”,0 分贝“.bss”,0 分贝“.shstrtab”,0 shstrtabsz equ $ - shstrtab _开始: 移动 eax,0 mov [测试],eax ;分段故障 xor eax,eax 公司 整数 0x80 节 .data 数据: 测试: 分贝 1 datasz equ $ - 数据 .bss 节 bss: bsssz 等价 $ - bss 文件大小 $ - $$
nasm -f bin -o small_program small_program.asm

【问题讨论】:

    标签: linux assembly x86 nasm elf


    【解决方案1】:

    好的,发现程序缺少数据/bss 部分的带有 R/W 标志的第二个程序头,它描述了操作系统的第二个内存段,并带有适当的运行时执行标志。

    这是在phdrsz equ $ - phdr 行之后添加的内容:

    dd 1 ; p_type dd 数据 - LOAD_ADDRESS ; p_offset dd数据; p_vaddr dd数据; p_paddr dd数据sz; p_filesz dd 数据sz + bsssz ; p_memsz dd 6 ; p_flags (读/写) dd 0x1000 ; p_align

    注意:在理解这一点之前,我误解了这些部分的重要性,我认为通过描述这些部分我可以访问内存,但事实证明程序头是操作系统正在寻找的,整个部分代码可以删除,程序仍然可以工作。

    【讨论】:

    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 2017-10-22
    相关资源
    最近更新 更多