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
您提到的值包含三个位:内核可能只是忽略了其他位的值。 – gsg
该位对MMAP没有任何意义,但是如果您查看代码'cdq',则将_RDX_设置为零。那么'mov dh,0x10'将_DH_设置为0x10,这使得_RDX_ = 0x1000(4096),当_RDX_被复制到_RSI_时,它被用作长度参数。它在国旗参数中设定的事实是没有意义的。值7(最低3位)是内核知道的位,内核忽略它不关心的位。这不是我会这样做的方式。 –
当我编译并运行此代码时,它返回_RAX_中的一个地址,这正是我所期望的(此评论是为了响应已恢复的编辑) –