Lors de l'analyse de la charge utile linux/x64/shell/reverse_tcp de Metasploit, j'ai réalisé qu'il utilisait la valeur 0x1007 comme argument prot de l'appel système mmap(). La page de manuel mmap() indique que l'argument prot est soit PROT_NONE, soit le bit OU d'un ou de plusieurs des indicateurs suivants: PROT_EXEC, PROT_READ, PROT_WRITE PROT_NONE. Selon le fichier /usr/include/x86_64-linux-gnu/bits/mman.h, les indicateurs mentionnés ci-dessus ont les valeurs 0x4, 0x1, 0x2 et 0x0, respectivement. Comment cela peut-il correspondre à 0x1007?Comment l'argument prot de mmap() syscall peut-il être 0x1007?
La signature de l'appel système est la suivante:
void * mmap (void * addr, longueur size_t, int prot, int flags, int fd, off_t offset);
La partie du code dont je parlais est:
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
Les valeurs que vous mentionnez couvrent trois bits: le noyau ignore probablement les valeurs des autres bits. – gsg
Le bit n'a pas de signification pour MMAP mais si vous examinez le code 'cdq' définit _RDX_ à zéro. alors 'mov dh, 0x10' définit _DH_ à 0x10 ce qui rend _RDX_ = 0x1000 (4096) qui est utilisé comme paramètre de longueur lorsque _RDX_ est ensuite copié dans _RSI_. Le fait qu'il soit défini dans l'argument flag est sans conséquence. La valeur 7 (les 3 bits les plus bas) sont les bits connus du noyau, et le noyau ignore les bits dont il ne se soucie pas. Ce n'est pas comme ça que je l'aurais fait. –
Lorsque je compile et exécute ce code, il renvoie une adresse dans _RAX_ qui est ce que je m'attendais (ce commentaire est en réponse à une modification qui a été annulée) –