HAKATEMIA
30x86-64 ABI ja kutsutavat

Linux syscall-ABI

Keskitaso25MIN

Linux syscall-ABI

Joka kerta kun ohjelma tulostaa, lukee tiedoston, varaa muistia, avaa socketin: se kutsuu kernelin järjestelmäkutsua (syscall). printf, fopen, malloc: kaikki ovat libc:n wrappereita, jotka lopulta ajavat syscall-käskyn.

Voit ohittaa libc:n kokonaan ja kutsua syscalleja suoraan. Tämä on hyödyllistä:

  • Shellcode-tyyppinen koodi joka ei voi olettaa libc:n olemassaoloa
  • Erikoiskerneli-koodi
  • Suorituskykykriittiset tilanteet joissa libc:n ohitus on tärkeä
  • Oppimisen vuoksi: ymmärtää mitä libc oikeastaan tekee

Linuxin syscall-konventio

Linux x86-64 -syscall-ABI:

RooliRekisteri
Syscall-numeroRAX
1. argumenttiRDI
2. argumenttiRSI
3. argumenttiRDX
4. argumenttiR10 (HUOM: ei RCX!)
5. argumenttiR8
6. argumenttiR9
PaluuarvoRAX (negatiivinen = -errno)

Käsky on syscall. RCX:n sijaan on R10, koska syscall-käsky itse käyttää RCX:tä paluuosoitteen säilyttämiseen.

Yleisimmät syscall-numerot

NumeroNimiArgumentit
0readfd, buf, count
1writefd, buf, count
2openpathname, flags, mode
3closefd
9mmapaddr, length, prot, flags, fd, offset
10mprotectaddr, length, prot
11munmapaddr, length
12brkaddr
60exitstatus
231exit_groupstatus

Täysi lista: /usr/include/asm/unistd_64.h tai man syscalls.

Esimerkki: tulosta "Hei" stdouttiin

NASM
1section .data
2msg: db "Hei", 10
3msglen equ $ - msg
4
5section .text
6global _start
7_start:
8    mov     rax, 1          ; sys_write
9    mov     rdi, 1          ; fd = stdout
10    lea     rsi, [rel msg]
11    mov     rdx, msglen
12    syscall
13
14    mov     rax, 60         ; sys_exit
15    xor     rdi, rdi
16    syscall

Yksinkertaisempaa ei voi olla. gcc ei tarvita; ld msg.o -o hei riittää.

TERMINALASCIINEMA

Tiedoston lukeminen: open + read + write + close + exit

TEXT
1fd = open("/flag", O_RDONLY)      ; syscall 2, rax = fd
2n  = read(fd, buf, 256)            ; syscall 0, rax = bytes read
3write(1, buf, n)                   ; syscall 1
4close(fd)                          ; syscall 3
5exit(0)                            ; syscall 60

Tämä on klassinen "no-libc"-ratkaisu. Käytössä esim. CTF-shellcodessa, jossa libc-osoitteet ovat tuntemattomia mutta kernel-syscall-numerot ovat samat aina.

1 / 2
Hakatemia Pro

Hakkeroinnin oppiminen alkaa tästä

Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.