gpt4 book ai didi

elf - 手动创建的 ELF 可执行文件因 SIGSEGV 而崩溃

转载 作者:行者123 更新时间:2023-12-04 20:58:10 26 4
gpt4 key购买 nike

我需要学习手动创建 ELF 可执行文件。到目前为止,我一直在使用在线指南,例如:

  • Manually Creating an ELF Executable
  • ELF reference

  • 几次失败后,我将我的程序简化为以下内容(它应该以返回代码 0 退出):
    0000000: 7f45 4c46 0101 0100 0000 0000 0000 0010  .ELF............
    0000010: 0200 0300 0100 0000 8080 0408 3400 0000 ............4...
    0000020: 0000 0000 0000 0000 3400 2000 0100 2800 ........4. ...(.
    0000030: 0000 0000 0100 0000 5400 0000 8080 0408 ........T.......
    0000040: 0000 0000 0c00 0000 0c00 0000 0500 0000 ................
    0000050: 0010 0000 b801 0000 00bb 0000 0000 cd80 ................

    当我尝试执行它时,它会因 SIGSEGV 崩溃。 GDB 打印:
    During startup program terminated with signal SIGSEGV, Segmentation fault.

    我做错了什么?

    最佳答案

    使用你的二进制文件,我从 GDB 得到不同的输出:

    (gdb) r
    Starting program: /tmp/sample.elf.bad
    During startup program terminated with signal SIGKILL, Killed.

    查看二进制文件:
    readelf -l sample.elf

    Elf file type is EXEC (Executable file)
    Entry point 0x8048080
    There are 1 program headers, starting at offset 52

    Program Headers:
    Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
    LOAD 0x000054 0x08048080 0x00000000 0x0000c 0x0000c R E 0x1000

    在这里,您要求内核 mmap具有文件偏移量 0x54 的段在虚拟地址 0x08048080 .

    由于这两个数字不等于彼此模页面大小,内核拒绝:
    strace ./sample.elf
    execve("./sample.elf", ["./sample.elf"], [/* 42 vars */] <unfinished ...>
    +++ killed by SIGKILL +++
    Killed

    以上 strace 表示内核试图创建进程,不喜欢它所看到的,并以偏见终止它。你的二进制文件没有一条指令被执行。

    修复 LOAD虚拟地址和入口点是 0x08048054产生所需的工作可执行文件:
    strace ./sample.elf
    execve("./sample.elf", ["./sample.elf"], [/* 42 vars */]) = 0
    [ Process PID=23172 runs in 32 bit mode. ]
    _exit(0) = ?
    +++ exited with 0 +++

    这是它的十六进制转储:
    hd ./sample.elf
    00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 10 |.ELF............|
    00000010 02 00 03 00 01 00 00 00 54 80 04 08 34 00 00 00 |........T...4...|
    00000020 00 00 00 00 00 00 00 00 34 00 20 00 01 00 28 00 |........4. ...(.|
    00000030 00 00 00 00 01 00 00 00 54 00 00 00 54 80 04 08 |........T...T...|
    00000040 00 00 00 00 0c 00 00 00 0c 00 00 00 05 00 00 00 |................|
    00000050 00 10 00 00 b8 01 00 00 00 bb 00 00 00 00 cd 80 |................|
    00000060

    关于elf - 手动创建的 ELF 可执行文件因 SIGSEGV 而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33222159/

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