5

我有一个奇怪的 ELF 二进制文件。我可以在 32 位 linux 中运行这个二进制文件。

但是如果我用 IDA 反汇编程序打开这个二进制文件,IDA 会说“入口点无效”。

readelf的结果如下:

root@meltdown-VirtualBox:/home/meltdown# readelf -S -l SimpleVM 

There are no sections in this file.

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

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x000000 0x00c01000 0x00c01000 0x013c7 0x013c7 RWE 0x1000
  LOAD           0x00019c 0x0804b19c 0x0804b19c 0x00000 0x00000 RW  0x1000

没有部分。我认为这个二进制文件是打包好的。但是,第一个 LOAD 段的最后一个虚拟地址是 0xc023c7。入口点的虚拟地址是 0xc023dc 超出范围...

有人可以告诉我发生了什么事吗?

先感谢您。

  • /proc/PID/maps 如下(创建了两个进程...)

    root@meltdown-VirtualBox:/proc/3510# cat maps
    00110000-00111000 rwxp 00000000 00:00 0 
    006c0000-006c1000 r-xp 00000000 00:00 0          [vdso]
    007d2000-007d4000 rwxp 00000000 00:00 0 
    00c01000-00c02000 rwxp 00000000 08:01 3801242    /home/meltdown/SimpleVM
    00ca4000-00e43000 r-xp 00000000 08:01 17171359   /lib/i386-linux-gnu/libc-2.15.so
    00e43000-00e45000 r-xp 0019f000 08:01 17171359   /lib/i386-linux-gnu/libc-2.15.so
    00e45000-00e46000 rwxp 001a1000 08:01 17171359   /lib/i386-linux-gnu/libc-2.15.so
    00e46000-00e49000 rwxp 00000000 00:00 0 
    08048000-0804b000 r-xp 00000000 00:00 0 
    0804b000-0804c000 rwxp 00000000 00:00 0 
    b77a7000-b77c7000 r-xp 00000000 08:01 17171339   /lib/i386-linux-gnu/ld-2.15.so
    b77c7000-b77c8000 r-xp 0001f000 08:01 17171339   /lib/i386-linux-gnu/ld-2.15.so
    b77c8000-b77c9000 rwxp 00020000 08:01 17171339   /lib/i386-linux-gnu/ld-2.15.so
    bfa90000-bfab1000 rwxp 00000000 00:00 0          [stack]
    
    root@meltdown-VirtualBox:/proc/3511# cat maps
    00110000-00111000 rwxp 00000000 00:00 0 
    006c0000-006c1000 r-xp 00000000 00:00 0          [vdso]
    007d2000-007d4000 rwxp 00000000 00:00 0 
    00c01000-00c02000 rwxp 00000000 08:01 3801242    /home/meltdown/SimpleVM
    00ca4000-00e43000 r-xp 00000000 08:01 17171359   /lib/i386-linux-gnu/libc-2.15.so
    00e43000-00e45000 r-xp 0019f000 08:01 17171359   /lib/i386-linux-gnu/libc-2.15.so
    00e45000-00e46000 rwxp 001a1000 08:01 17171359   /lib/i386-linux-gnu/libc-2.15.so
    00e46000-00e49000 rwxp 00000000 00:00 0 
    08048000-0804b000 r-xp 00000000 00:00 0 
    0804b000-0804c000 rwxp 00000000 00:00 0 
    b77a7000-b77c7000 r-xp 00000000 08:01 17171339   /lib/i386-linux-gnu/ld-2.15.so
    b77c7000-b77c8000 r-xp 0001f000 08:01 17171339   /lib/i386-linux-gnu/ld-2.15.so
    b77c8000-b77c9000 rwxp 00020000 08:01 17171339   /lib/i386-linux-gnu/ld-2.15.so
    bfa90000-bfab1000 rwxp 00000000 00:00 0          [stack]
    
4

1 回答 1

3

这可能是因为映射长度的粒度。映射的长度将向上舍入为页面大小的倍数。在我的系统上,页面大小为 4k,因此映射将四舍五入为 4k 并包含入口点。即使页面大小为 1k,长度也会四舍五入到 0x1400,足以包含入口点。如果文件足够长,那么额外的字节可能来自文件而不是页面初始化。

于 2013-01-03T18:38:30.233 回答