2013-01-03 3 views
5

이상한 ELF 바이너리가 있습니다. 32 비트 리눅스에서이 바이너리를 실행할 수 있습니다.이상한 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 헤더에 기반하여 파일 크기가 "있어야"하는 것을 보는 것은 흥미로울 것입니다. –