2017-05-09 2 views
1

Metasploit의 linux/x64/shell/reverse_tcp 페이로드를 분석하면서 mmap() 시스템 콜의 prot 인수로 0x1007 값을 사용하고 있다는 것을 깨달았습니다.mmap() 시스템 콜의 prot 인수는 0x1007이 될 수 있습니까?

mmap() 매뉴얼 페이지는 prot 인수가 PROT_NONE이거나 PROT_EXEC, PROT_READ, PROT_WRITE PROT_NONE 플래그 중 하나 이상의 비트 OR이라고 말합니다. /usr/include/x86_64-linux-gnu/bits/mman.h 파일에 따르면 위에서 언급 한 플래그의 값은 각각 0x4, 0x1, 0x2 및 0x0입니다. 이것은 어떻게 0x1007까지 추가 할 수 있습니까?

시스템 콜 사인은 :

* mmap에 공극 (보이드 * 요지,이 size_t 길이의 INT PROT는 오프셋 off_t, INT의 FD를 플래그 INT);

내가 언급 된 코드의 일부는 다음과 같습니다

@MichaelPetch에서 언급 한 바와 같이
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

언급 한 값은 3 비트를 나타냅니다. 커널은 다른 비트의 값을 무시할뿐입니다. – gsg

+3

비트는 MMAP에서 의미가 없지만 'cdq' 코드를 검토하면 _RDX_를 0으로 설정합니다. 'mov dh, 0x10'은 _RHX_가 _RSI_에 복사 될 때 길이 매개 변수로 사용되는 _RDX_ = 0x1000 (4096)을 만드는 _DH_를 0x10으로 설정합니다. 플래그 인수에 설정되는 사실은 아무런 결과가 아닙니다. 값 7 (가장 낮은 3 비트를 on)은 커널이 알고있는 비트이며, 커널은 무시한 비트를 무시합니다. 내가 해낸 방법이 아닙니다. –

+0

이 코드를 컴파일하고 실행할 때 _RAX_에있는 주소가 반환됩니다 (이 주석은 되돌려 진 편집에 대한 응답으로) –

답변

2

는, 가장 중요한 바이트가의 mmap() 시스템 콜에 의해 무시됩니다. mov dh, 0x10 및 mov rsi, rdx 명령어를 사용하여 length 매개 변수에 값을 제공하는 역할을했습니다.

관련 문제