2017-05-09 67 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指令給長度參數賦值。