System V AMD64 -kutsutapa
System V AMD64 -kutsutapa
Kutsutapa (calling convention) on ABI:n (Application Binary Interface) ydin: sopimus siitä, miten funktiot välittävät argumentit, palauttavat arvon, käyttävät pinoa, ja kuka säilyttää mitäkin rekisteriä yli kutsun.
Linuxissa, macOS:ssä, ja FreeBSD:ssä x86-64 käyttää System V AMD64 -kutsutapaa. (Windows käyttää eri "Microsoft x64" -konventiota. Älä sekoita.)
Argumenttien sijoittelu
Ensimmäiset kuusi kokonaisluku- tai osoitin-argumenttia menevät rekistereihin tässä järjestyksessä:
| # | Rekisteri |
|---|---|
| 1 | RDI |
| 2 | RSI |
| 3 | RDX |
| 4 | RCX |
| 5 | R8 |
| 6 | R9 |
Argumentit 7+ menevät pinoon. Liukuluku-argumentit menevät XMM0..XMM7:aan (omat numeroinnit).
Muistisääntö: pidä lista lähellä, kunnes muistat sen ulkoa.
Paluuarvo
RAX palauttaa pääpaluuarvon. Jos paluuarvo on iso (esim. 128-bittinen tai struct), RDX:RAX-pari kuljettaa sen: RDX ylin 64 bittiä, RAX alin.
Säilytysvastuu
Kutsutapa määrittelee ketkä säilyttävät rekisterin yli kutsun. Hakatemian taulukko:
| Säilyttäjä | Rekisterit |
|---|---|
| Kutsujan tallentama (caller-saved) | RAX, RCX, RDX, RSI, RDI, R8..R11 |
| Kutsutun tallentama (callee-saved) | RBX, RBP, R12..R15 |
- Kutsujan tallentama: kutsuva funktio EI saa olettaa että nämä säilyvät yli
call:n. Jos arvo on tärkeä, työnnä se pinoon ennen kutsua, palauta jälkeen. - Kutsutun tallentama: kutsuttu funktio LUPAA palauttaa nämä ennen
ret:iä. Jos käytät niitä,pushjapopne prologissa/epilogissa.
Käytännön esimerkki: kutsu open(path, flags, mode)
open on libc-funktio joka ottaa 3 argumenttia:
1extern open
2
3call_open:
4 lea rdi, [rel path] ; 1. arg: path
5 mov rsi, 0 ; 2. arg: flags (O_RDONLY)
6 xor rdx, rdx ; 3. arg: mode (0, koska ei luo uutta)
7 xor eax, eax ; vector-arg-määrä (variadic: 0)
8 call open
9 ; rax = fd (tai negatiivinen virhekoodi)Sama logiikka pätee jokaiseen libc-kutsuun: pakkaa argumentit ABI:n osoittamiin rekistereihin, kutsu, lue tulos RAX:sta.
Hakkeroinnin oppiminen alkaa tästä
Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.