9. Writing ARM Shellcode
9. Writing ARM Shellcode
Avoid NULL bytes in Shellcode
1. Use Registers to Zero Values (Instead of mov reg, 0)
1
2
3
eor r0, r0, r0 // ARM (32-bit)
xor eax, eax // x86
sub r1, r1, r1 // ARM Thumb
2. Use PC-Relative Addressing (Avoid Hardcoded Addresses)
Problem: Direct memory references (ldr r0, =0x00010000) introduce nulls.
Solution: Use adr (ARM) or lea (x86) to calculate addresses dynamically.
3. Increment/Decrement to Avoid 0 in Immediates
Problem: mov r7, #11 (syscall) may encode as 0B 70 A0 E3 (safe), but mov r7, #255 could introduce nulls.
Solutions:
- Use shifts/adds:
1 2
mov r7, #10 add r7, #1 // r7 = 11 (no nulls)
- 8-bit rotations (ARM):
1
mov r7, #0x1F00 >> 8 // Encoded as non-null
4. String Termination Without Nulls
Problem: "/bin/sh\0" has an implicit null.
Solutions:
- Overwrite at runtime:
1 2
strb r2, [r0, #7] ; Replace 'X' with null (r2=0) .ascii "/bin/shX" ; Non-null placeholder
- Stack-based strings (push in reverse):
1 2 3 4 5 6 7
mov r0, #'h' push {r0} mov r0, #'/sh' push {r0} mov r0, #'/bin' push {r0} mov r0, sp // r0 points to "/bin/sh"
5. Avoid svc #0 (Syscall Triggers)
Problem: svc #0 encodes as 00 00 00 EF (ARM)
Use svc #1 (ARM):
1
svc #1 // Encodes as `01 00 00 EF` (null-free)
6. Thumb Mode (ARM) for Smaller, Null-Free Code
Problem: ARM mode instructions are 4 bytes (often nulls).
Solution: Switch to Thumb mode (2-byte instructions):
1
2
3
4
5
6
7
8
.section .text
.global _start
.ARM
_start:
add r3, pc, #1 // Set LSB=1 for Thumb
bx r3 // Switch to Thumb
.THUMB
// Null-free 16-bit code here
8. XOR Obfuscation (For Payloads)
Problem: Raw payloads (e.g., "/bin/sh") may contain nulls.
Solution: XOR-encode and decode at runtime.
9. Avoid str/ldr with 0 Offsets
Problem: str r0, [r1, #0] may encode as null.
Solution: Use register offsets:
1
2
add r2, r1, #0 // r2 = r1 + 0 (no nulls)
str r0, [r2] // Store without null offset
PIC (Position Independent Code)
“PIC is like writing a letter that works no matter which mailbox it’s dropped into.”
This post is licensed under CC BY 4.0 by the author.