При анализе полезной нагрузки 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
cdq
, значение RDX будет равно нулю. затемmov dh,0x10
устанавливает для DH значение 0x10, что делает RDX = 0x1000 (4096), который используется в качестве параметра длины, когда RDX затем копируется в RSI. Тот факт, что он установлен в аргументе flag, не имеет значения. Значение 7 (включенные младшие 3 бита) - это биты, о которых известно ядру, и ядро просто игнорировало биты, которые ему не нужны. Я бы так не поступил. - person Michael Petch   schedule 09.05.2017