HAKATEMIA
27x86-64 ABI ja kutsutavat

System V AMD64 -kutsutapa

Keskitaso25MIN

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
1RDI
2RSI
3RDX
4RCX
5R8
6R9

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ä, push ja pop ne prologissa/epilogissa.
TERMINALASCIINEMA

Käytännön esimerkki: kutsu open(path, flags, mode)

open on libc-funktio joka ottaa 3 argumenttia:

NASM
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.

1 / 2
Hakatemia Pro

Hakkeroinnin oppiminen alkaa tästä

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