Linux syscall-ABI
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:
| Rooli | Rekisteri |
|---|---|
| Syscall-numero | RAX |
| 1. argumentti | RDI |
| 2. argumentti | RSI |
| 3. argumentti | RDX |
| 4. argumentti | R10 (HUOM: ei RCX!) |
| 5. argumentti | R8 |
| 6. argumentti | R9 |
| Paluuarvo | RAX (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
| Numero | Nimi | Argumentit |
|---|---|---|
| 0 | read | fd, buf, count |
| 1 | write | fd, buf, count |
| 2 | open | pathname, flags, mode |
| 3 | close | fd |
| 9 | mmap | addr, length, prot, flags, fd, offset |
| 10 | mprotect | addr, length, prot |
| 11 | munmap | addr, length |
| 12 | brk | addr |
| 60 | exit | status |
| 231 | exit_group | status |
Täysi lista: /usr/include/asm/unistd_64.h tai man syscalls.
Esimerkki: tulosta "Hei" stdouttiin
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 syscallYksinkertaisempaa ei voi olla. gcc ei tarvita; ld msg.o -o hei riittää.
Tiedoston lukeminen: open + read + write + close + exit
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 60Tämä on klassinen "no-libc"-ratkaisu. Käytössä esim. CTF-shellcodessa, jossa libc-osoitteet ovat tuntemattomia mutta kernel-syscall-numerot ovat samat aina.
Hakkeroinnin oppiminen alkaa tästä
Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.