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 は以下のとおりです(2つのプロセスが作成されます...)

    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 に答える