HAKATEMIA
29x86-64 ABI ja kutsutavat

RIP-relative ja PIE

Keskitaso20MIN

RIP-relative ja PIE

Klassinen x86-koodi käytti absoluuttisia osoitteita: mov rsi, 0x402008 lataa kovakoodatun osoitteen rsi:in. Tämä toimi täsmälleen niin kauan kuin binääri ladattiin aina samaan virtuaalimuistipaikkaan.

x86-64 lisäsi RIP-suhteellisen osoituksen: efektiivinen osoite lasketaan käskyn osoitteen (RIP) ja kompaktin 32-bittisen siirtymän summana. Käsky koodataan sama riippumatta mihin se lopullisesti ladataan: siirtymä on offset, ei absoluuttinen osoite.

NASM-syntaksissa

NASM
1default abs                   ; oletus: [symboli] tarkoittaa absoluuttinen
2default rel                   ; vaihtoehto: [symboli] tarkoittaa RIP-suhteellinen
3
4section .data
5greeting: db "Moi!", 0
6
7section .text
8_start:
9    lea     rsi, [rel greeting]    ; eksplisiittisesti RIP-suhteellinen
10    lea     rsi, [greeting]        ; default abs vs rel vaikuttaa tähän

Useimmiten haluat: default rel heti tiedoston alkuun. Sen jälkeen kaikki [symboli]-viittaukset ovat automaattisesti RIP-suhteellisia, ja sinulla on yksi siirrettävä binääri.

PIE: Position-Independent Executable

PIE (Position-Independent Executable) on binääri jonka kerneli voi ladata mihin tahansa virtuaalimuistin osoitteeseen. Yhdistettynä ASLR:n (Address Space Layout Randomization) kanssa tämä on tietoturvaominaisuus: hyökkääjän on vaikeampi arvata gadget- tai funktio-osoitteita kun ne arpoutuvat jokaisessa käynnistyksessä.

PIE-binääri vaatii RIP-suhteelliset osoitukset koodissa. Jos NASM-lähteessä on absoluuttinen viittaus .data:han, linker generoi R_X86_64_64-uudelleensijoituksen (relocation) .text:in sisälle. PIE-binäärissä tämä on virhe: .text ei voi sisältää muunnettavia osoitteita ajonaikana.

Linker valittaa:

TEXT
1ld: relocation R_X86_64_64 against `.data' can not be used when making a PIE object;
2recompile with -fPIE

Korjaus: default rel lähteen alussa, tai vaihda jokainen [symboli] muotoon [rel symboli].

TERMINALASCIINEMA

Käytännön LEA-malli

LEA:lla lasket symbolin osoitteen RIP:n suhteen:

NASM
1default rel
2lea     rsi, [greeting]       ; rsi = "Moi!"-merkkijonon osoite
3mov     al,  [rsi]            ; lue ensimmäinen tavu

Tämä on koko x86-64-binäärin tärkein osoituspattern. Kaikki moderni assembly käyttää sitä: ei vain PIE-tilanteessa.

1 / 2
Hakatemia Pro

Hakkeroinnin oppiminen alkaa tästä

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