2013-01-03 9 views
5

Ho uno strano binario ELF. Posso eseguire questo binario in Linux a 32 bit.Strano binario ELF

Ma se apro questo file binario con il disassemblatore IDA, IDA dice "punto di ingresso non valido".

Risultato di readelf è il seguente:

[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 

Non v'è alcuna sezione. Pensavo che questo binario fosse pieno. Ma l'ultimo indirizzo virtuale del primo segmento LOAD è 0xc023c7. E l'indirizzo virtuale del punto di ingresso è 0xc023dc che non rientra nell'intervallo ...

Qualcuno può dirmi cosa sta succedendo?

Grazie in anticipo.

  • /proc/PID/mappe è la seguente (si creano due processi ...)

    [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) Interessante domanda. Tuttavia, penso che avremmo maggiori probabilità di successo se potessimo esaminare l'attuale binario. – NPE

+0

Cosa dicono 'file SimpleVM' e' ldd SimpleVM'? –

+1

Sospetto, se questo è un programma proprietario, quindi il suo autore vuole impedirgli di smontare. Come è noto, il kernel è un po 'più permissivo riguardo al formato binario (accetta felicemente alcuni eseguibili leggermente malformati che i disassemblatori/i debugger non fanno), e questo fatto è sfruttato per impedire che un binario venga decodificato. –

risposta

3

E 'probabilmente a causa della granularità della lunghezza di mappatura. La lunghezza della mappatura verrà arrotondata per essere un multiplo della dimensione della pagina. Sul mio sistema la dimensione della pagina è 4k, quindi la mappatura sarà arrotondata a 4k e comprenderà il punto di ingresso. Anche con una dimensione della pagina di 1k, la lunghezza si arrotondava a 0x1400, abbastanza da includere il punto di ingresso. Se il file è abbastanza lungo, i byte aggiuntivi verrebbero probabilmente dal file anziché dall'inizializzazione della pagina.

+0

Ok, potrebbe non essere un errore di pagina * immediatamente * come conseguenza di ciò. Ma il punto di ingresso non dovrebbe essere riempito con qualunque pagina vuota venga riempita con quel sistema? Se questo è effettivamente un * nop *, verrebbe eseguito finché non scapperà alla fine della pagina; ma l'istruzione potrebbe davvero essere qualsiasi cosa ... –

+0

@ChrisStratton Ho pensato che il file sia abbastanza grande per la lunghezza estesa. Lo aggiungerò alla risposta. –

+0

Questo potrebbe essere davvero plausibile, in particolare se qualcuno stava cercando di essere subdolo e fare affidamento sul comportamento di un particolare programma di caricamento.Sarebbe interessante vedere quale sia la dimensione del file "dovrebbe essere" basata sull'intestazione ELF, contro quale sia. –

Problemi correlati