2017-05-09 64 views
1

在分析Metasploit的linux/x64/shell/reverse_tcp负载时,我意识到它使用值0x1007作为mmap()系统调用的prot参数。mmap()系统调用的prot参数如何成为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?

的系统调用的签名是:

无效* MMAP(无效*地址,为size_t长度,INT PROT,整数标记,INT FD,off_t偏移);

我指的是代码的部分是:

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  
+1

您提到的值包含三个位:内核可能只是忽略了其他位的值。 – gsg

+3

该位对MMAP没有任何意义,但是如果您查看代码'cdq',则将_RDX_设置为零。那么'mov dh,0x10'将_DH_设置为0x10,这使得_RDX_ = 0x1000(4096),当_RDX_被复制到_RSI_时,它被用作长度参数。它在国旗参数中设定的事实是没有意义的。值7(最低3位)是内核知道的位,内核忽略它不关心的位。这不是我会这样做的方式。 –

+0

当我编译并运行此代码时,它返回_RAX_中的一个地址,这正是我所期望的(此评论是为了响应已恢复的编辑) –

回答

2

如前所述由@MichaelPetch,最显著字节由mmap()的系统调用忽略。它只能通过使用mov dh,0x10和mov rsi,rdx指令给长度参数赋值。