在elf的任意位置开始分析是Entry Point?

逆向工程 小精灵 入口点
2021-06-25 01:23:43

入口点被认为是程序中的第一个点。所以如果我在程序中的任何位置开始分析它都可以认为是一个入口点是不是??

请帮我!谢谢大家。

3个回答

入口点不是开始分析的地址,而是进程开始执行的地址

让我们快速浏览一下 ELF32 Header:

#define EI_NIDENT 16

typedef struct {
        unsigned char   e_ident[EI_NIDENT];
        Elf32_Half      e_type;
        Elf32_Half      e_machine;
        Elf32_Word      e_version;
        Elf32_Addr      e_entry;
        Elf32_Off       e_phoff;
        Elf32_Off       e_shoff;
        Elf32_Word      e_flags;
        Elf32_Half      e_ehsize;
        Elf32_Half      e_phentsize;
        Elf32_Half      e_phnum;
        Elf32_Half      e_shentsize;
        Elf32_Half      e_shnum;
        Elf32_Half      e_shstrndx;
} Elf32_Ehdr;

e_entry成员实际上是指向入口点:

e_entry
该成员给出系统首先将控制转移到的虚拟地址,从而启动进程。如果文件没有关联的入口点,则该成员保持零。

来源:http : //www.sco.com/developers/gabi/latest/ch4.eheader.html

以及来自维基百科的更详细描述

在计算机编程中,入口点是控制权从操作系统转移到计算机程序的地方,在该位置处理器进入程序或代码片段并开始执行。在某些操作系统或编程语言中,初始入口不是程序的一部分,而是运行库的一部分,在这种情况下,运行库初始化程序,然后运行库进入程序。在其他情况下,程序可能会在第一次进入时在执行任何操作之前调用运行时库,并且在运行时库返回后,程序的实际代码开始执行。这标志着从加载时间(和动态链接时间,如果存在)到运行时间的过渡。

[强调我的]

不!

入口点是用于指向 OS 加载程序将启动程序的位置的“关键字”。对于给定的二进制文件 ( ELFBIN ),您可以运行以下命令来读取二进制文件的头信息 (-h):

       readelf -h ELFBIN

您将获得与此类似的输出:

 ELF Header:
 Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
 Class:                             ELF64
 Data:                              2's complement, little endian
 Version:                           1 (current)
 OS/ABI:                            UNIX - System V
 ABI Version:                       0
 Type:                              EXEC (Executable file)
 Machine:                           Advanced Micro Devices X86-64
 Version:                           0x1
 Entry point address:               0x400a80
 Start of program headers:          64 (bytes into file)
 Start of section headers:          46528 (bytes into file)
 Flags:                             0x0
 Size of this header:               64 (bytes)
 Size of program headers:           56 (bytes)
 Number of program headers:         9
 Size of section headers:           64 (bytes)
 Number of section headers:         31
 Section header string table index: 30

如果仔细观察,您会发现入口点地址: 0x400a80在二进制文件上运行 objdump 并查找给定地址后,您将获得以下信息:

0000000000400a80 <_start>:
 400a80:       31 ed                   xor    %ebp,%ebp
 400a82:       49 89 d1                mov    %rdx,%r9
 400a85:       5e                      pop    %rsi
 400a86:       48 89 e2                mov    %rsp,%rdx
 400a89:       48 83 e4 f0             and    $0xfffffffffffffff0,%rsp
 400a8d:       50                      push   %rax
 400a8e:       54                      push   %rsp
 400a8f:       49 c7 c0 c0 48 40 00    mov    $0x4048c0,%r8
 400a96:       48 c7 c1 50 48 40 00    mov    $0x404850,%rcx
 400a9d:       48 c7 c7 70 0b 40 00    mov    $0x400b70,%rdi
 400aa4:       ff 15 1e 85 20 00       callq  *0x20851e(%rip)        # 6  08fc8 <__libc_start_main@GLIBC_2.2.5>
 400aaa:       f4                      hlt    
 400aab:       0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)

这是_start函数,它在最终调用包含“您的”代码的main(参见示例中地址400aa4处右侧的标签)之前准备某些参数/寄存器_start二进制的所有其他部分都被加载到内存后功能通常被称为。在main完成后,执行hlt指令终止本例中的执行。

这就是所谓的入口点现在,关于分析,它必须在二进制文件中的某处开始,该某处使用地址(如入口点)表示。如果您想使用语言/行话,您可以说:分析入口点而不是二进制入口点。

总而言之,这只是技术关键词,必须正确定义。

希望这能回答你的问题:)

入口点是系统加载程序将开始执行您的可执行文件的地方。它是操作系统开始在您的程序中执行的入口点。

类比可以是 C/C++ 编译器的“main()”函数。