2013-01-03 63 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 /進程/映射如下(則創建兩個進程...)

    [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

'文件SimpleVM'和'ldd SimpleVM'說什麼? –

+1

我懷疑,如果這是一個專有程序,那麼它的作者想要防止它被拆開。衆所周知,內核對二進制格式稍微寬容一些(它歡迎接受一些反彙編/調試器沒有的稍微不合格的可執行文件),並且爲了防止二進制被反向工程,這個事實被利用。 – 2013-01-03 18:47:04

回答

3

這是因爲映射長度的粒度的大概。映射的長度將被四捨五入爲頁面大小的倍數。在我的系統上,頁面大小爲4k,因此映射將四捨五入到4k幷包含入口點。即使頁面大小爲1k,長度也會達到0x1400,足以包含入口點。如果文件足夠長,那麼額外的字節可能來自文件而不是頁面初始化。

+0

好吧,它可能不會*錯誤*立即*作爲結果。但是入口點是不是填滿了那個系統上的空白頁面?如果這實際上是一個* nop *,它將執行這些操作,直到頁面結束爲止;但該指令可能真的是任何東西... –

+0

@ChrisStratton我認爲該文件足夠大,可用於擴展長度。我會將其添加到答案中。 –

+0

這可能確實是合理的,特別是如果有人試圖偷偷摸摸並依靠特定程序加載器的行爲。根據ELF頭文件,看看文件大小「應該是什麼」,而不是它是什麼。 –