Ovatko ne ajureita vai windows servicejä? Esim. joku joka avaa etäyhteyden käyttäjän tietämättä koneeseen
Mitä nämä haittaohjelmat ovat?
3
1474
Vastaukset
- Anonyymi
Haittaohjelmat ovat ihan tavallista ohjelmakoodia.
- Anonyymi
Veikkaanpa, että suuri osa tänne kirjoittelevista ei ymmärrä, miten haittaohjelmat (siis toisen ohjelman omaan käyttöönsä "kaappaavat" ohjelmat) toimivat !
32- bittisen x86 -ympäristön osalta, valaistaanpa asiaa hiukan:
Valitettavasti on kirjoitettu ja edelleen kirjoitetaan paljon ohjelmakoodia C:llä ja/tai C :lla.
Nämä ohjelmointikielet todellisuudessa kuuluisivat tekniikan museoon, eivät käyttöön !
C:llä ja/tai C :lla koodatuista ohjelmista löytyy varsin yleisesti puskurin ylivuotohaavoittuvuuksia (koska kielen rakenne ei mitenkään tue haavoittuvuuksien ennalta estämistä).
int vulnerable_subroutine(char * Name) { // Varoitusesimerkki siitä, miten EI pidä koodata
char CopyOfName[200];
strcopy(CopyOfName, Name);
printf("Nimi on %s\n", CopyOfName);
return 0;
}
Ylläolevassa ohjelmakoodissa täysin vastuuttomasti kopioidaan parametrissa Name syötetty merkkijono muuttujan CopyOfName arvoksi, ja sitten kirjoitetaan konsoliin (tai sinne, minne stdout on uudelleenohjattu) em. nimi/merkkijono.
Max. 199 merkkiin saakka tämä toimii ilman mitään ongelmia.
Mutta kun annat parametrin Name arvoksi merkkijonon, jonka pituus ylittää 199 merkkiä, tapahtuu jotain mielenkiintoista:
Osa syötetystä merkkijonosta ylikirjoittaa pinomuistissa olevan funktion paluuosoitteen,
minkä jälkeen funktio "palaa" paikkaan, josta sitä ei koskaan kutsuttu !
32-bit sovelluksissa em. ylivuotohaavoittuvuus mahdollistaa sen, että hyökkääjä voi kontrolloida sitä, mihin funktio lopulta "palaa".
64-bit sovelluksissa tilanne olisi muuten aivan sama, mutta yhdellä varsin olennaisella erolla:
64-bit x86 CPU:t vaativat muistiosoitteiden olevan jotain sellaista, joita kutsutaan englanniksi termillä "canonical address".
Tuo termi tarkoittaa sitä, että 64-bit CPU voi muistiosoitteiden osalta ollakin esim. 40, 44, 48, 52 tai vaikkapa 56 -bittinen (riippuen prosessorin tarkasta tyypistä) !
Ja tuon lisäksi:
esim. 48 -bittinen muistiosoite (jossa bitit on numeroitu LSB = bit 0, ja MSB = bit 47),
tallennetaan 64 -bittiseen osoittimeen siten, että bitti 47 (siis osoitteen todellinen MSB) on kopioitava jokaiseen bittiin väliltä 48..63.
Eli jos bitti bit47 = 0, niin kaikkien bittien 48..63 on myös oltava 0,
ja vastaavasti:
jos bitti bit47 = 1, niin kaikkien bittien 48..63 on myös oltava 1.
em. säännön rikkominen aiheuttaa välittömästi poikkeuksen, jolloin suoritus siirtyy poikkeuskäsittelijään !
koska C -kieli käyttää merkkijonotyyppiä "null -terminated string", niin hyökkääjä ei voi sisällyttää binäärisiä nollia ( = chr(0) ) merkkijonoon, koska se terminoisi strcpy:n tekemän kopioinnin ensimmäiseen merkkiin, jonka tavu-arvo = 0!
Eli hyökkääjä ei (64-bit ohjelmassa) kykene syöttämään sellaista muistiosoitetta, jossa bit47 (48-bitin muistiosoitetta käyttävässä CPU:ssa) = 0 !
Entä tilanne, jossa bit47=1 ?
Sellaisen osoitteen voisi käytännössä syöttää, jos jokainen seuraava merkki olisi chr(255) eli binääriarvoltaan 0xFF !
MUTTA:
Ainakin Win64 -ympäristössä (Linuxista en tiedä, joku 64-bit linuxeja paremmin tunteva kertokoon) ylin bitti 63 = 0, kun kyse on ns. userland -koodista (eli normaali EXE tai DLL.
Ja tuo "canonical address" vaatimus tarkoittaa, että jos bitti 63=0, niin kaikki bitit bit47 .. bit62 ovat myös = 0 !
(em. pätee, kun CPU:n muistiosoitus on 48 -bittinen. Jos se olisi vaikkapa 52 -bittinen, niin periaate olisi aivan sama, mutta tällöin, jos bit 63 = 0, niin kaikki bitit bit51 .. bit62 pitäisi myös olla = 0 ).
Entä, jos ylin bitti 63 = 1 ?
No (edelleen 48-bit muistiosoitettu CPU) silloin kaikki bitit bit47 .. bit62 pitää myös olla = 1.
Teoriassa siis mahdollista, mutta käyttöjärjestelmä varaa sellaiset osoitteet, joissa bit63 = 1, niin systeemikoodiin (laiteajurit, windows kernel jne.)
Jos userland -koodista (jota EXE ja DLL -tiedostojen sisältämä koodi edustaa) yritetään palata
RET -käskyllä systeemikoodille varattuun muistialueeseen, niin eikös tuo johda myös poikkeukseen ? (Sovellusohjelma tai kirjasto yritti suorittaa laittoman toiminnon) ?
Tarkoittaako tämä siis sitä, että puskurin ylivuotohaavoittuvuuksia ei 64 -bit koodissa voi olla ?
Vai onko tähän joku ns. porsaanreikä olemassa, ja jos, niin mikä ?
- Anonyymi
Käytä pelkåästään fyysisiä osoitteita aina älä ikinä sivutettua muistia, suoria pointereita video muistiinkin DMA;n siirrät jos tarttee, ei mitään virtuaalimuisteja.
Sivutus pois käytöstä kokonaan.. ja I/O osoitteiden virtualisointi, sekin kokonaan pois päältä, pelkästään fyysisiä osoitteita kaikkki, ian kaikkisesti aaamen.
Ketjusta on poistettu 1 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
- 467635
- 334213
- 573715
- 503190
- 172876
Voi ei! Jari Sillanpää heitti keikan Helsingissä - Hämmästyttävä hetki lavalla...
Ex-tangokuningas on parhaillaan konserttikiertueella. Hän esiintyi Savoy teatterissa äitienpäivänä. Sillanpää jakoi kons652561- 542398
- 512388
- 402339
- 162286