Как аргумент prot системного вызова mmap () может быть 0x1007?

При анализе полезной нагрузки linux / x64 / shell / reverse_tcp Metasploit я понял, что в качестве аргумента prot системного вызова mmap () используется значение 0x1007.

На странице руководства mmap () указано, что аргумент prot - это либо PROT_NONE, либо побитовое ИЛИ одного или нескольких из следующих флагов: PROT_EXEC, PROT_READ, PROT_WRITE PROT_NONE. Согласно файлу /usr/include/x86_64-linux-gnu/bits/mman.h, вышеупомянутые флаги имеют значения 0x4, 0x1, 0x2 и 0x0 соответственно. Как это может быть в сумме до 0x1007?

Подпись системного вызова:

void * mmap (void * addr, size_t length, int prot, int flags, int fd, off_t offset);

Я имел в виду следующую часть кода:

global _start
section .text
_start:

xor rdi,rdi                    
push byte +0x9                
pop rax                       
cdq                             
mov dh,0x10                    
mov rsi,rdx                     
xor r9,r9                       
push byte +0x22                
pop r10                        
mov dl,0x7                     
loadall286    

person adam    schedule 09.05.2017    source источник
comment
Указанные вами значения охватывают три бита: ядро, вероятно, просто игнорирует значения любых других битов.   -  person gsg    schedule 09.05.2017
comment
Этот бит не имеет значения для MMAP, но если вы посмотрите код cdq, значение RDX будет равно нулю. затем mov dh,0x10 устанавливает для DH значение 0x10, что делает RDX = 0x1000 (4096), который используется в качестве параметра длины, когда RDX затем копируется в RSI. Тот факт, что он установлен в аргументе flag, не имеет значения. Значение 7 (включенные младшие 3 бита) - это биты, о которых известно ядру, и ядро ​​просто игнорировало биты, которые ему не нужны. Я бы так не поступил.   -  person Michael Petch    schedule 09.05.2017
comment
Когда я компилирую и запускаю этот код, он возвращает адрес в RAX, чего я и ожидал (этот комментарий является ответом на изменение, которое было отменено)   -  person Michael Petch    schedule 09.05.2017
comment
@MichaelPetch да, я удалил правку после прочтения вашего комментария, который четко ответил на мой вопрос. Я думал, что правка несколько вводит в заблуждение. Еще раз, я не могу проголосовать за ваш комментарий, так как у меня недостаточно репутации. Если бы вы могли дать официальный ответ, я был бы рад проголосовать за него.   -  person adam    schedule 09.05.2017
comment
Вы можете сами ответить на свой вопрос - я не против.   -  person Michael Petch    schedule 09.05.2017


Ответы (1)


Как указано в @MichaelPetch, старший байт игнорируется системным вызовом mmap (). Он служил только для присвоения значения параметру длины с помощью инструкций mov dh, 0x10 и mov rsi, rdx.

person adam    schedule 09.05.2017