x0

Hozzászólások

5 bejegyzés megtekintése - 1-5 / 5
  • Szerző
    Bejegyzés
  • Hozzászólás: Adatvégrehajtást megengedő Linux kell #2201687
    x0
    Felhasználó

      Hibás volt a gépi kód. „Inc i” helyett Inc [ESI] volt, és utána az i címe utasításként értelmezve. Meg az i-t 1 byte méretűnek vette de ez nem baj. Javítva simán lefut. Az én eredeti programom is meg az is amit vizsla kódja alapján csináltam. Egyébként az enyémben se volt rendszer-specifikus kód, csak tisztán a flat modellt teszteltem.Elnézést hogy feltartottalak titeket. Mivel az NX bittel is meg lehet akadályozni az adatvégrehajtást és az én CPU-m nem tudja az NX bitet, még annyit kérnék hogy akinek NX bitet tudó CPU-ja van nézze meg hogy be lehet-e állítani úgy hogy egy adott programnál ne akadályozza az adatvégrehajtást. Úgy is jó ha csak úgy lehet beállítani hogy egyiknél se akadályozza. Az NX a végrehajtástiltó bit. Ugyanis ha később esetleg lecserélem a gépet, mondjuk mert ez elromlik, akkor nem fogom tudni használni a programot ha még annál az 1 programnál se lehet kikapcsolni a gátlást. Nyilván root jelszó kell hozzá, valahol ilyen helyen lehet: rendszer, beállítások, adminisztráció, memóriakezelés.Az a %regiszter egyébként micsoda? Azt végképp nem értem hogy mov-nál a 0 a cél ami konstans, és a kódja is más mint amikor a 2 operandust felcserélve helyes sorrendben van.Azt majd megnézem hogy assembyl betétet tud-e valamelyik fordító, illetve többféle assembly nyelv van, majd megnézem hogy lehet Intel-stílusúra állítani (amit eddig is használtunk itt a fórumon).PC-n 64 bites üzemmódban egyszerűen nincsenek szegmensek. Csak "linear flat" modell van. A szegmensszelektorok vagyis a szegmenscímek csak a jogokat és a tulajdonságokat adják meg (mondjuk hogy hány bites üzemmód, illeszkedő-e a kód, ami a far call/jmp-nél a más jogosultságúra váltással kapcsolatos). Ez is a GDT/LDT-ben van tárolva. Tehát ezek csak jogokat és tulajdonságokat adnak meg. Egyáltalán nincs szegmensméret, és ES CS SS DS esetén a szegmenskezdet fixen 0. Ez gyakorlatilag azt jelenti hogy nincsenek szegmensek. A szegmensregiszterek és a GDT/LDT csak a jogok és a tulajdonságok beállítására szolgál. Van ugyan a GDT/LDT-ben szegmens kezdete és mérete mező, de azt 64 bites üzemmódban teljesen figyelmen kívűl hagyja a CPU. FS és GS esetén 1-1 MSR-ben kernel jogokkal (0. szint) megadható a szegmensek kezdete, de szegmensméret ott sincs. Még SWAPGS utasítás is van ami ezt cseréli. Tehát FS/GS esetén se a GDT/LDT-ből olvassa ki a szegmens kezdőcímét.Talán így érthetőbb: 32 biten van a 4 GB-os címterület. Ha a lapok 4 KB-osak, akkor ez a 4 GB 1048576 részre van osztva. Minden egyes laphoz van 4 byte a laptáblázatban, ami így tehát összesen 4 MB méretű, 1048576 darab byte-os laptáblázat-bejegyzésből áll. Minden egyes laptáblázat-bejegyzésben van egy végrehajtástiltó bit, az NX bit. Összesen tehát a 4 MB = 32 Mbit-es laptáblázatból 1 Mbit az NX bit. Ez pont arra van hogy még flat modellnél is meg lehessen akadályozni az adatvégrehajtást. Na ezért kell hogy az operációs rendszer beállítható legyen úgy hogy ne akadályozza meg. Nem tudom értelmesebben leírni. 1 bit bekapcsolása egy 4 KB-os területen akadályozza az adatvégrehajtást.

      Hozzászólás: Adatvégrehajtást megengedő Linux kell #2201682
      x0
      Felhasználó

        Szóval nem tudom hogy honnan veszed hogy a kódom alapvetően hibás. Próbáltad már 64 bites Linuxon úgy hogy előtte kikapcsolod az adatvégrehajtás megakadályozását? Ezt gondolom a grafikus felületen lehet megtenni, kell hozzá a root jelszó. Esetleg próbáltad már futtatni akár 32 akár 64 bites Windows-on? Ott is ki kell kapcsolni előtte az adatvégrehajtás megakadályozását a Vezérlőpultban, kategórianézetben talán az energiagazdálkodásnál van, azon belül talán a rendszernél.A 32/64 bites fordítók NEAR mutatókkal dolgoznak. Semmi jelét se látom hogy FAR mutatók használatára utasítottad volna. Anélkül legfeljebb a lapozásnál állítja a jogokat.PC-n 64 bites üzemmódban nincs szegmentálás, nem tudja a CPU.Az NX bit a végrehajtás-tiltó bit, amely a laptáblázat-bejegyzésekben van. Normál esetben 4 KB-os lapok vannak és 1 lapot 4 byte ír le, abban egy bit. Egyes 32 bites CPU-k is tudják. Na ennek használatát kell előbb kikapcsolni.Ha megfigyeled, a programom tisztán NEAR mutatókkal dolgozik. Tehát az egész folyamat során a CS változatlan. Tehát még ha Windows alatt futtatom is, akkor se "nem végrehajtható" szegmenst hajt végre, hanem ugyanazt a kódszegmenst hajtja végre mint a C-ben írt rutinoknál. Én is tudom hogy még a Windows se hajt végre nem végrehajtható adatszegmenst.Tehát én 32 bites üzemmódban akarok "linear flat" modellt használni, nem 64 bitesben.Természetesen az is megoldás ha kernelhívással létrehozatok egy szegmensszelektort és FAR hívással hívom meg assembly rutinból. Ekkor nem kell hogy a kód és a dinamikus memória 1 szegmensben legyen, ez nem "linear flat" modell. A kódodat azért nem értem mert ha azok a mutatók NEAR mutatók akkor legfeljebb a laptáblázat-bejegyzéseket módosítják azok a rutinok.A programom azt ellenőrzi hogy "linear flat" modell van-e. Lehet olyan kernelt csinálni ami ilyen programot nem hajlandó végrehajtani. Hogy egy programnak milyen memóriamodellje van az a linkeléstől is függ. Hogy nálam szegmenshiba van Linuxon, abból egyértelműen következik hogy külön szegmensben van a kód és az adat. Tehát az a bizonyos a.out mindig is ezt a hibaüzenetet fogja generálni, ugyanis túlcímzi a kódszegmenst, hiszen az a pár sor nyilván nincs 4 MB. Ahhoz hogy működjön másképp kell linkelni. Mivel tisztán near mutatók vannak, fordítani nem kell másképp csak linkelni. Azt pedig én se állítottam hogy attól hogy a szegmensek báziscímei azonosak az adat futtatható lesz. Ahhoz az is kell hogy a kódszegmens mérete ami a GDT/LDT-ben van tárolva olyan nagy legyen hogy abban az adatterület is benne legyen. Ekkor ami az adatterületen van az egyben a kódterületen is van, tehát a CPU úgy érzékeli hogy a kódszegmensben levőt hajtom végre. A DS-ben levő szelektor írható szegmenset jelent, és az nem lehet végrehajtható. Tehát azért lehet a programommal egyes rendszerek esetén adatot végrehajtani, mert a CPU nem tud róla hogy az adat.Amit írtál megoldást az megy 32 bitesen is? Na mingyár ki is próbálom. Ha igen, érdekelne hogy azok a mutatók near vagy far mutatók, és ha far, akkor mivel lehet a fordítót arra utasítani hogy a * far mutatót jelentsen. Ha near, akkor meg a kódszegmens méretét megnöveli a kernel hogy átfedjen az adattal. Meg lehet hogy a laptáblázatban is engedélyezi a végrehajtást (ha eddig nem volt engedélyezve).Bár jó nagy méretet foglaltam neki, mégis nálam csak addig megy hogy RET NEAR (0xC3). Ha már beleteszem hogy i++ akkor már megint szegmenshiba. Pedig mivel DS-t semmi se módosítja ezért az i-re való hivatkozás nem okozhat szegmenshibát. Ez az i++ egyébként 32 és 64 bitesen is működik. A tesztelőprogramom angol nyelvű változatából másoltam át az i++ gépi kódját azért van angolul.

        Code:
        #include #include #include #include // These types must be 1 and 4 byte size// If the size is wrong, you must be modify (act upon to the compiler)typedef unsigned char nat08;typedef unsigned int nat20;// Execute program in an address, the function don't have any parameter and don't have result type#define dataexec(p) ((*((void (*)()) (p)))())nat20 i;int main() { nat08 *p = mmap ( NULL, 8000000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0 ); p[0] = 0xFE; // INC p[1] = 0x04; // mod=0, 0, r/m=4: SIB byte to come (it disables RIP-relative addressing in 64 bit mode) p[2] = 0x26; // SS=0, INDEX=4 (=none), BASE=6: it's mean with mod=0: [constant] *((nat20 **) (p+3)) = &i; p[7] = 0xC3; // RET (NEAR) mprotect ( p, 8000000, PROT_EXEC | PROT_READ ); printf("It attempt execute dynamic memory.n"); for (; i < 8; ) { dataexec(p); // i++; printf("%u times executed the data what increase the counter.n", i); } return 0;}

        Hozzászólás: Melyik Linux való nekem? #2201639
        x0
        Felhasználó

          Válasz: CS szelektor alatt a CS-ben levő szelektort értem, és felhasználói program futása közbeni állapotról írtam. Fogalmam sincs mi van amikor a kernel megy.Nagynehezen sikerült internetet varázsolnom a Debianra, de adatvégrehajtás az nincs rajta, kipróbáltam.Én olyan programot fejlesztek amihez feltétlenül kell adatvégrehajtás.Az is lehet hogy a kernel tudja ugyan, de a linker úgy van beállítva hogy nem úgy linkeli.A cc --help és az ld --help nem segített. A weben fentvan a man ld(1), abban van ugyan execstack de az nem az, ugyanúgy szegmenshiba: cc -z execstack dataexec.cA seg szórészletre rákeresve említve sincs a man ld(1)-ben.Előszöris tehát az lenne a kérdésem, hogy átállítható-e valahogy a linker hogy a kód és a dinamikus memória 1 szegmensben legyen? Mivel egy szegmens nem lehet egyszerre végrehajtható és írható, nyilván a CS-ben és a DS-ben más lesz a szelektor, de a védett mód miatt ettől még a 2 szelektor mutathat ugyanarra a szegmensre (a GDT-ben vagy az LDT-ben a szegmens kezdőcíme ugyanaz).Természetesen ha a kernel nem hajlandó végrehajtani az ilyen binárisat akkor az az operációs rendszer nekem nem jó, ha hajlandó ugyan, de nincs rá olyan linker ami ilyen binárisat készít akkor szintén nem jó.Van olyan Linux ami hajlandó olyan binárisat végrehajtani amiben a kód és a dinamikus memória 1 szegmensben van? És ahhoz van olyan linker ami ilyen binárisat is tud csinálni?Nekem valami nyílt forráskódú ingyenes operációs rendszer kellene. Linux, OpenSolaris vagy valami hasonló.Amely támogatja az önmagát módosító kódot az valószínüleg az adatvégrehajtást is támogatja.Esetleg nyissak neki egy külön témát?Olyan programoknál kell adatvégrehajtás mint például a .NET: ez egy képzeletbeli gép gépi kódján van. Amikor meghívunk egy rutint, akkor a .NET lefordítja a rutint és úgy hajtja végre (legalábbis Windows-on). Linuxon is van már .NET és C# is. Emulátor helyett is lehet olyan hogy lefordítja (amivel nem IBM PC kompatíbilis gép programját lehet végrehajtani, illetve Windows-, Macintosh-emulátor.Ebben a kódban a TAB mérete 4 szóköz (erre nincs szükség a kipróbálásához). Fordítás:cc dataexec.cVégrehajtás:./a.outA warning-ok nem számítanak a fordításnál csak az error. Ha 64 bites fordítóprogramunk van állítsuk át 32 bitesre. Ha elindul és hiba van de nem szegmenshiba, akkor lehet hogy megy akkor ha az operációs rendszert úgy állítjuk be hogy ne akadályozza meg az adatvégrehajtást az NX bittel. Mivel 64 bitesen PC-n nincs lapozás, ott az lenne a feltétel hogy beállítható legyen úgy hogy ne akádályozza meg az NX bittel, de 32 bites CPU-m van, így 64 bites operációs rendszer nem jó.Megkérem a fórumozókat hogy próbálják ki és írják meg ide hogy ment-e nekik és hogy milyen Linuxon próbálták.

          Code:
          // Ez a program 32 és 64 bitesen is megy, de csak IBM PC kompatíbilis számítógépen// Egyes fordítóprogramoknál lehet hogy ki kell szedni valahány #include-ot, lehet hogy az összeset#include #include typedef unsigned int nat20;typedef unsigned long long int nat40;// A p címen levő adat végrehajtása, paramétere és kimenete nincs#define dataexec(p) ((*((void (*)()) (p)))())// 4 MB 4 byte-os elemméretű tömbben#define index4 (1<<20)// Az adatterületen levő kódnat20 tomb[2*index4+2];// Ciklusszámlálónat20 i = 0;int main() { if (sizeof(&i) != 4) { printf("Nem 32 bites üzemmódban vagyunk !n"); if (sizeof(&i) != 8) { printf("%u bites üzemmódban e program nem működik, csak 32 és 64 bitesben.n", sizeof(&i) << 3); return 0; } } tomb[index4] = 0x2604FE90; // NOP; INC [constant] (RIP-relatív címzés nélkül) tomb[index4+2] = 0; // Kezdőérték annak ellenőrzéséhez hogy a cím elfér-e 32 biten *((nat20 **) (tomb+index4+1)) = &i; // i címe az "INC i" utasításhoz // Elfért-e 32 biten a cím? if (tomb[index4+2]) { printf("4 GB-ot elérő cím miatt nem tudom kipróbálni az adatvégrehajtást.n" "Állítsuk át a fordítóprogramot 32 bitesre és úgy próbáljuk.n"); return 0; } tomb[index4+2] = 0xC3; // RET (NEAR) és utána 3 darab 0 ami a RET miatt nem hajtódik végre printf("Kísérlet globális változóban levő program végrehajtására.n"); for (; i < 10; ) { dataexec(tomb+index4); // i++; printf("%un", i); } char *p = ((char *) malloc((1<<23)+8)) + (1<22); p[0] = 0xFE; // INC p[1] = 0x04; // mod=0, 0, r/m=4: SIB byte következik (64 bites üzemmódban kikapcsolja a RIP-relatív címzést) p[2] = 0x26; // SS=0, INDEX=4 (vagyis nincs), BASE=6: mod=0-val együtt jelentése: [konstans] *((nat20 **) (p+3)) = &i; p[7] = 0xC3; // RET (NEAR) printf("Kísérlet dinamikus memóriában levő program végrehajtására.n"); for (; i < 20; ) { dataexec(p); // i++; printf("%un", i); } printf("Kész, sikerült !n"); return 0;}

          Hozzászólás: Melyik Linux való nekem? #2201637
          x0
          Felhasználó

            PPPoE protokollos internetem van (LAN alapú DIGI, nincs semmi ADSL meg egyéb, UTP kábel a lépcsőházban levő elosztódobizig, onnantól optikai).Ez valami olyat jelent hogy TCP/IP kapcsolat Etherneten keresztül.Vagyis Etherneten (UTP) kapcsolódok egy másik számítógéphez, és azon keresztül jön az internet.Azonosító és jelszó kell hozzá, de azt titkosítatlanul küldi.Az IP-cím dinamikus, gondolom DHCP.Ez a Windows-ban úgy van beállítva hogy még a DHCP szerver IP-címét is attól a számítógéptől kérdezi le amelyikkel UTP-n keresztül kapcsolatban áll. Ez a DIGI számítógépe vagy routere a fejállomáson. Még a Top Level DNS kiszolgáló címét is.Megpróbál csatlakozni, de utána kiírja hogy vagy azonosító kulcs vagy valami más kell neki. Az meg ugye nincs, csak azonosító meg jelszó.A súgóban rákerestem a PPPoE-re: említve sincs benne ez a kifejezés.Van még 2 NTFS partícióm, rajta adatok. De mindig azt írja ki hogy hibás paraméterek a csatolásnál. Jobb egérgomb se segít.Ha kell, készítenék képeket arról amit a képernyőn látok és elmenteném floppyra vagy pendrivera.A DIGI honlapján levő sajnos nem segített. Ubuntura van, ott úgy kell hogyRendszerBeállításokHálózati kapcsolatok: na az nincs.Átnéztem egy csomó mindent, de sehol sincs.Ahol ki tudom választani az ethernet kártyát, ott azt írja nincs jogosultságom beállítani. A grafikus felület root-ként nem enged be.Karakteresen meg szintén nincs jogosultságom, rootként pedig sudo ugyan van, de sudo pppoeconf már nincs.Ott is a Print Screen billentyűvel kell?Egyenlőre csak olyan képet tudok mutatni hogy XP-n hogy lehet csatlakozni.Ezt a hozzászólást is nyilván XP-n írtam.Azt egyébként nagyon jól tudom hogy az ES CS SS DS FS GS regiszter.Szegmensregiszter, ezek pedig még 64 bites módban is PC-n 16 bitesek.Ami benne van 16 bites szám, na az a szegmens szelektor.XP-n ES = SS = DS, az FS-ben a kivételkezeléshez vagy egy 4KB-os terület, az FS talán 0.És attól hogy más a szelektor, még ugyanaz a szegmens kezdőcíme (ezt a GDT-ből olvassa ki ami a memóriában van). Tehát ha assemblyben az SS: prefixszel beírok valamit, azt a CS: prefixszel is ki tudom olvasni.Van egy valami Student Tools CD a Visual Studio-hoz. Abban van egy olyan projecttípus hogy C/C++ Console Application. Azt szerintem még a parancssoros GNU is lefordítja, és a programjaimat abban írtam. Csak az assembly betéttel nem tudom mit kezdene a fordító (beírom a .cpp file-ban hogy "asm {" és utána assembly kódot írok a .cpp file-ba. }-tal zárom.

            Hozzászólás: Melyik Linux való nekem? #2201630
            x0
            Felhasználó

              A kérdésem az lenne, hogy a létezők közül melyik az én szempontomból a legjobb ?Másképp: ti melyiket ajánljátok nekem ?Egyébként egy DVD-írás mingyár kész (Debian).

            5 bejegyzés megtekintése - 1-5 / 5