Spørsmål:
Hvor stort er et kanarifuglord på Linux, vanligvis?
MR.X_XD
2017-01-23 05:38:42 UTC
view on stackexchange narkive permalink

Et kanarieord er en sekvens av biter plassert ved grensen mellom en buffer (for eksempel en stabel) og kontrolldata i et program, som en måte å oppdage og reagere på bufferoverløp.

Hvor mange biter er disse kanariene på Linux, vanligvis?

Pedantisk merknad: en "byte" er alltid nøyaktig en byte i størrelse.;-)
Det betyr at det er et triks spørsmål.
Hva er en "kanari" -byte?Dette er nå toppresultatet i Google, men det forklarer ikke noe!Noen passende koder vil sannsynligvis også hjelpe ...
[For alle som lurer på hva som er en _canary byte_] (https://en.wikipedia.org/wiki/Buffer_overflow_protection#Canaries), brukes de til å beskytte mot bufferoverløp.
Jeg er faktisk overrasket over at dette spørsmålet i sin nåværende form klarte å få 11 stemmer.Det er et enlinjespørsmål, selve spørsmålet inneholder feil terminologi (kanaribyte, mens det riktige begrepet er kanarisk ord), og spørsmålet består av ingenting annet enn fremmede detaljer (den eneste relevante detaljen er at den "har noe å gjøre med stackoverflow[s] ", som allikevel var informasjon som allerede finnes i kodene til spørsmålet).Siden det fikk så mye oppmerksomhet skjønt ... tid til noen redigeringer antar jeg.
@Ajedi32 når et spørsmål treffer HNQ, er alle spill av.Trafikken den får kommer ikke fra nettstedets faste, og deres kriterier for stemmene forårsaker det du ser her.
@Ajedi32 Normalt vil jeg avvise en redigering så stor som den ... men den fjerner lo og erstatter den med et minimum av forskning.Stemte på å godkjenne redigeringen.Spesielt siden det er i HNQ, er det bedre å vise uformelle besøkende den typen spørsmål som vi faktisk _ vil_ se.
@S.L.Barth Ja, jeg var ikke sikker på at det ville bli godkjent siden jeg endte med å måtte omskrive hele spørsmålet med mine egne ord.Jeg tror imidlertid at sluttresultatet er en klar forbedring, og den relevante delen av OPs opprinnelige spørsmål (som bare var en enkelt setning) er fortsatt der.
Tre svar:
5gon12eder
2017-01-23 06:22:00 UTC
view on stackexchange narkive permalink

La oss prøve det! Her er et veldig enkelt eksempelprogram.

  int test (int a) {return a;}  

Kompiler det med GCC og avskjær samlingen på monteringsfasen. ( -S -flagget vil gjøre dette.) Gi nytt navn til monteringsfilen (slik at den ikke blir overskrevet) og kompiler igjen, denne gangen legger du også til -fstack-protector-all og -mstack-protector-guard = global flagg. Det første flagget muliggjør stabile kanarifugler for alle funksjoner, det andre velger en global kanarifugl i stedet for en trådlokal. (Tråd-lokal standard er sannsynligvis mer nyttig i praksis, men samlingen for den globale versjonen er lettere å forstå.)

Når vi sammenligner de to genererte monteringsfilene, ser vi følgende tillegg (kommentarene er mine).

  movl% edi, -20 (% rbp); lagre funksjonsparameter på stabel (ikke relatert til kanari) movq __stack_chk_guard (% rip),% rax; last magisk verdi i RAX-register movq% rax, -8 (% rbp); lagre RAX-register på stabelen (plasser kanarifuglen) movl -20 (% rbp),% eax; last funksjonsparameter i EAX-register for retur (ikke relatert til kanari) movq -8 (% rbp),% rcx; last kanariværdi i RCX-register movq __stack_chk_guard (% rip),% rdx; laste magisk verdi i RDX register cmpq% rdx,% rcx; sammenligne kanariverdi med forventet verdi je .L3; hvis de er de samme, hopp til etiketten. L3 (fortsett) ring __stack_chk_fail; Ellers (stakk korrupsjon oppdaget), ring behandleren.L3: la  

Vi kan se at kanarifuglen håndteres i RAX-, RCX- og RDX-registerene som alle er 64 bit brede. (Deres 32-biters kolleger vil hete EAX, EBX og EDX. De 16 biters versjonene heter AX, BX og CX. De 8 bit-variantene AL, BL og CL.) En annen anelse er at operasjonene for å lagre, laste og sammenligne canary (MOVQ og CMPQ) har et Q-suffiks som identifiserer en 64-biters instruksjon. (32-biters instruksjoner har "L" -suffiks, 16 bit-instruksjoner a "W" og 8-biters versjoner a "B".

Derfor konkluderer vi at kanarifuglen er en 64-biters verdi, noe som gjør sans for en 64-biters arkitektur (x86_64 GNU / Linux i mitt tilfelle). Jeg forventer at de alltid vil bruke den opprinnelige ordstørrelsen, da det gir mest mening for meg. Du kan prøve det samme eksperimentet på maskinene dine og se hva du får.

Det er ikke (bare) suffikset `x` som gjør dem 64-bit brede.`eax` er 32-bit.Det er det faktum at den bruker `r` prefikset * og * suffikset` x`.
@Angew Egentlig er det ikke engang det (f.eks. 'Rdi' er 64-bit, 'movzx' kan laste en byte i en 64-bit reg, etc.).Det er `movq` :)
@MargaretBloom Visst, det å snakke om "x" -suffikset gjelder bare for registre som "x" -suffikset eksisterer for.
@Angew Du har rett, takk.(Og jeg har også ødelagt kommentarene som ble lagt til forsamlingen.) Jeg har korrigert svaret nå.
Fernando Sanchiz
2017-01-23 05:58:38 UTC
view on stackexchange narkive permalink

Som jeg kan lese på denne siden: Stack Smashing Protector

Stackkanarien er innfødt i ordstørrelse, og hvis den velges tilfeldig, må en angriper gjette riktig verdi blant 2 ^ 32 eller 2 ^ 64 kombinasjoner

async3
2017-01-23 22:17:51 UTC
view on stackexchange narkive permalink

Antall bits som brukes må være lik prosessoren i Word. Så hvis du har en 32-bits prosessor, er dens Word-størrelse 32, og derfor er kanariordet 32 ​​bits langt.

dette dekkes allerede av de andre svarene


Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 3.0-lisensen den distribueres under.
Loading...