2013-01-03 16 views
5

私は奇妙なELFバイナリを持っています。私はこのバイナリを32ビットのLinuxで動かすことができます。奇妙なELFバイナリ

IDA逆アセンブラでこのバイナリを開くと、IDAに「無効なエントリポイント」と表示されます。 readelfがの

結果は以下の通りです:

[email protected]:/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 /マップ次のようにそれが原因でマッピング長の粒度の、おそらくです(二つのプロセスが作成されます...)

    [email protected]:/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] 
    
    [email protected]:/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] 
    
+0

(+1)興味深い質問です。しかし、実際のバイナリを調べることができれば、成功のチャンスはもっと高くなると思います。 – NPE

+0

'file SimpleVM'と' ldd SimpleVM'とは何を言いますか? –

+1

これはプロプライエタリなプログラムであれば、その著者が逆アセンブルをしないようにしたいと考えています。知られているように、カーネルはバイナリ形式(バイナリ/デバッガでは実行できないやや不正な実行可能ファイルを受け入れることを喜んで受け入れる)に対してある程度許容しています。この事実は、バイナリがリバースエンジニアリングされないようにするために利用されます。 –

答えて

3

です。マッピングの長さは、ページサイズの倍数になるように切り上げられます。私のシステムでは、ページサイズは4kであるので、マッピングは4kに切り上げられ、エントリポイントを取り囲んでいます。 1kのページサイズであっても、長さは0x1400に丸められ、エントリポイントを含めるのに十分です。ファイルが十分に長い場合、余分なバイトはおそらくページの初期化の代わりにファイルから来るでしょう。

+0

その結果、ページ違反*がすぐには発生しない可能性があります。しかし、エントリポイントは、そのシステム上で空のページがいっぱいになっても、それでいっぱいになりませんか?それが実質的に* nop *ならば、ページの最後まで実行されるまで実行されます。命令は本当に何かになる可能性があります... –

+0

@ChrisStratton私は、ファイルが拡張された長さのために十分に大きいと仮定しました。私はそれを答えに加えます。 –

+0

特に、誰かが卑劣で、特定のプログラムローダーの動作に頼っている場合、それは確かに妥当かもしれません。ELFヘッダーに基づいて、ファイルサイズが "何であるべきか"、それが何であるかを確認することは面白いでしょう。 –