RIP-relative ja PIE
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
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änUseimmiten 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:
1ld: relocation R_X86_64_64 against `.data' can not be used when making a PIE object;
2recompile with -fPIEKorjaus: default rel lähteen alussa, tai vaihda jokainen [symboli] muotoon [rel symboli].
Käytännön LEA-malli
LEA:lla lasket symbolin osoitteen RIP:n suhteen:
1default rel
2lea rsi, [greeting] ; rsi = "Moi!"-merkkijonon osoite
3mov al, [rsi] ; lue ensimmäinen tavuTämä on koko x86-64-binäärin tärkein osoituspattern. Kaikki moderni assembly käyttää sitä: ei vain PIE-tilanteessa.
Hakkeroinnin oppiminen alkaa tästä
Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.