2015-03-24 3 views
-2

По readelf:Почему исполняемый файл .data?

---------------------------------------------------------------------- 
    [Nr] Name    Type    Address   Offset 
     Size    EntSize   Flags Link Info Align 
    [24] .data    PROGBITS   0000000000601040 00001040 
     0000000000000051 0000000000000000 WA  0  0  32 
---------------------------------------------------------------------- 
Section to Segment mapping: 
Segment Sections... 
00 
01 
02 
03  .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss 
---------------------------------------------------------------------- 
Program Headers: 
    Type   Offset    VirtAddr   PhysAddr 
       FileSiz   MemSiz    Flags Align 
    PHDR   
    INTERP  
    LOAD 
    LOAD   0x0000000000000e10 0x0000000000600e10 0x0000000000600e10 
       0x0000000000000281 0x0000000000000288 RW  200000 

Как вы можете видеть выше .data сегмент имеет W (Write) и A (Alloc) разрешения и .data загружается в LOAD секции с R (Read) W (Write).

Однако Шеллкод в разделе .data является исполняемым файлом, в соответствии с GDB:

0x601060 <bytecode>:  xor rax,rax 
=> 0x601063 <bytecode+3>: xor rdi,rdi 

И я не знаю, почему. Это верно? Что мне не хватает?

+0

Возможно, моя интерпретация результата readelf неверна? – JohnCage

+1

Возможно, пользователи 'readelf' обычно понимают этот вывод, но вам может быть полезно предоставить дополнительный контекст; что * конкретно * выделяется вам как-то странно, что бы вы ожидали увидеть вместо этого и т. д. Так как вы не говорите, что такое ваша интерпретация, кому-то трудно подтвердить это. – dimo414

+0

Фактически, как мы можем видеть выше: (1) сегмент .data имеет «W (Write) A (Alloc)» разрешения (2) .data загружается в раздел LOAD с помощью «R (Read) W (Write)» , НО: Я не знаю, почему, .data станет исполняемым! – JohnCage

ответ

2

Однако Шеллкод в секции .data является исполняемым файлом, в соответствии с GDB:

Выход GDB делает не вам сказать, что секция .data является исполняемым. GDB с радостью разобьет любую память, которую вы попросите разобрать.

Попробуйте это:

(gdb) set $p = (void (*)(void))&bytecode 
(gdb) call $p() 

Это должно привести к SIGSEGV на первой инструкции bytecode, потому что на самом деле это не исполняемым.