Brugernavn:




Kodeord: Husk
Forside Forum Artikler Downloads Søg
 

Hacking og sikkerhed


I denne artikel skal vi lære hvordan man kan hacke et program skrevet i C, dog vil der også kommer et eller to programmer i C++. Denne artikel er ikke lavet for at du nu skal gå ud og hacke til højre og venstre, men for at lære om sikkerhed. Programmerne jeg har brugt er programmet Dev-C++ til al C og C++ kode, og OllyDbg til debugging og disassembling.

Dev-C++: http://www.bloodshed.net/devcpp.html
OllyDbg: http://www.ollydbg.de/

Begge programmer kan bruges og hentes kvit og frit. Sammen med Dev-C++ følger der foruden IDE"et også kompileren, GCC og debuggeren, GDB, med. Der er også brugt programmet Notesblok, der er fast inventar på Windows-platformen. Artiklen vil indeholde en masse C-eksempler, alle skrevet af mig, så intet i artiklen er ulovligt. Alle programmerne har en indbygget passwordchecker, med password – og vores mission er derfor at finde passwordsne. For at du får det maksimale ud af artiklen anbefales det at du har kendskab til disse tre sprog, Assembly, C og C++. Kravet om at kunne Assembly, er dog ikke så stort, så du behøves ikke. Men hvis du alligevel lige vil vide lidt, så er den eneste kommando vi får brug for, CMP. Al kode er som sagt skrevet i C/C++, så hvis du vil forstå det fuldt ud skal du kende sprogene. Hvis du ingen af sprogene kan, så frygt ej. Du vil ikke kun lære at kode, men også at man ikke altid skal hoppe over hvor gærdet er lavest. Artiklen handler ikke kun om kode og sikkerhed, men også hvordan man bruger de to omtalte programmer. Derfor vil der komme lidt forklaringer både hvordan man gør sig klar – og bruger programmerne. Installation af programmerne kommer jeg ikke ind på, da det kan variere imellem hvordan hver enkelte installerer, samt version af programmerne. Personligt gør jeg brug af Dev-C++ 4.9.9.2 og OllyDbg 1.10. Artiklen er forbeholdt Windows-brugerer, og 32-bit maskiner. Alle andre vil dog stadig have en chance, ligesom med programmeringen, da det ikke kun er lutter kode det hele, men også en del teori. Hele artiklen er skrevet så du nemt kan følge med, og samtidig prøve det hele af der hjemme på din egen computer. Jeg har så godt jeg kunne prøvet at lave billeder til artiklen, hvor jeg fandt det relevant at sætte nogle ind.


1.0. Gør dig klar!
- 1.1. Dev-C++
- 1.2. OllyDbg

2.0. Hvordan virker det?
- 2.1. Dev-C++
- 2.2. OllyDbg
- 2.3. Jeg vil vide mere...

3.0. Vores første hack
- 3.1. Programmet
- 3.2. Research
- 3.3. Hacket

4.0. Lad os prøve med C++
- 4.1. Programmet
- 4.2. Hacket

5.0. Lidt mere avanceret
- 5.1. Ingen strcmp?
- 5.2. CMP
- 5.3. Programmet
- 5.4. Research
- 5.5. Hacket
- 5.6. LIFO og Bytes?

6.0. Til slut...
- 6.1. Hvad har jeg lært?
- 6.2. Note


1.0. Gør dig klar!

1.1. Dev-C++
Vi skal ikke i gang med større projekter – eller programmer, så vi kan nøjes med én enkelt sourcefil. Vi skal heller ikke linke til nogen biblioteker. Til hvert eksempel, kan du starte ud med at trykke på CTRL+N, der så kommer op med et nyt faneblad. Hvad du gemmer filerne som, igennem hele artiklen, er ligegyldigt. Men ha" lige i baghovedet, at hvis jeg gemmer med et navn – og du et andet, skal du ikke blive forvirret over at jeg bruger et andet navn end dig. Du kompilerer ved at trykke på CTRL+F9, eller du kan også vælge at kompilere og lade programmet starte lige efter. Dette er min foretrukne måde, og det gøres ved at trykke på F9. Debugging med Dev-C++ kommer vi ikke ind på, så det vil ikke blive forklaret. Der er ikke rigtigt mere at sige om Dev-C++ lige nu. Alt sourcekode kan hentes til sidst i artiklen, hvis du er for doven til selv at kompilere.
Billede: http://www.v0id.dk/rowl_article__hacking/dev-cpp_01.gif

1.2. OllyDbg
Når man åbner OllyDbg, kan det hele godt virke lidt forvirrende, hvis man ikke har prøvet sådan noget før. Det eneste vindue du skal have oppe er vinduet CPU, som formodenligt allerede er oppe fra start. Hvis ikke det er tilfældet, skal du trykke på ALT+C, eller trykke på knappen, C, øverst oppe, imellem H, og /. I OllyDbg skal du ikke åbne noget yderligere, så vi skal heller ikke oprette noget. Vi kommer tilbage til OllyDbg, når vi går i gang med det første hack, i 3.3.
Billede: http://www.v0id.dk/rowl_article__hacking/ollydbg_01.gif


2.0. Hvordan virker det?

2.1. Dev-C++
Dev-C++ er i sig selv, kun alt det visuelle. Selve kompileren og debuggeren hører i princippet ikke til Dev-C++, men er bare tredjepartsprogrammer. Det Dev-C++ bidrager med er selve vinduerne, syntaxhighlighting, projektmanager, lidt intellisense, mm. Dev-C++ holder derudover styr på forskellige ting. Den tilføjer f.eks. en ekstra linje i hver fil – da det står i standarden, og andre ting. Den hjælper også med at gøre din kode mere struktureret, bl.a. ved at automatisk lave et tab efter en start-tuborgklamme ({) og hoppe et tab tilbage ved slut-tuborgklamme (}). Dev-C++ fungerer sådan at du skriver kode hvorefter du får Dev-C++ til at gemme dokumentet. Ved at kompilere får du Dev-C++ til at give GCC forskellige parametre, så det kompilerer. Du trykker på en knap i Dev-C++, men hvis du selv skulle kompilere f.eks. igennem kommandoprompten, skal der en masse parametre til. To typiske eksempler på hvordan man kompilere henholdsvis et C-program og et C++-program, kunne se således ud:
  • C:>gcc test.c -o test
og i C++...
  • C:>g++ test.cpp -o test
Udover den eneste kommando i mit eksempel her, -o [output], findes der mange, mange flere. Alt efter hvordan det skal kompileres – og antal af filer, biblioteker, osv. Hvis der f.eks. er mange sourcefiler skal kan man vælge at lave en såkaldt, MAKEFILE, der indeholder en masse kommandoer – lidt ligesom en BATCH-fil. Dev-C++"s debugger, GDB, vil jeg ikke yderligere snakke om, men hvis du vil vide mere om den kan du prøve igennem kommandoprompten. Skriv GDB, hvorefter et program starter – og du kan skrive ”help”.

2.2. OllyDbg
OllyDbg er en 32-bit debugger for Windows, så hvis der sidder nogen derude, uden Windows eller med 64-bit (eller enda 16-bit?) så kan denne artikel ikke helt bruges. Kan dog sige at de fleste systemer er bygget på 32-bit. OllyDbg er for at debugge ikke kun EXE-filer, men også DLL-filer. Det kan bruges både til at rette allerede kompileret kode – med den indbyggede HEX-editor, analyse, lables, se funktioner, sætte kommentarer, og meget mere. OllyDbg fungerer på den måde at den følger et program igennem hukommelsen, fra start til slut. Den registrerer derfor alt hvad der kommer ind, og ud. Det er derfor vi kan bruge den til vores formål. Jeg vil ikke fortælle så meget mere om hukommelsen, adresser, osv. da det ville blive en ekstrem lang artikel. Jeg vil derimod henvise dig til projektet, Wikipedia, der har alt hvad der er og bør være at vide. Du kan finde Wikipedia, her: http://wikipedia.org/.

2.3. Jeg vil vide mere...
Hvis du vil vide mere må du enten besøge Dev-C++"s eller OllyDbg"s side, hvor du kan finde mere teknisk information, mm. Derudover vil jeg som jeg gjorde i 2.2, henvise dig til projektet, Wikipedia. Hvis det ikke er noget af dette du er interesseret i, men Assembly, C eller C++, kan du jo tage forbi Google, der kan blive fundet her: http://www.google.com/.


3.0. Vores første hack

3.1. Programmet
Så skal vi til at igang!
Vi starter her i, 3.1, med et program – som de fleste vil lave det, men det er desværre også mest usikkert. Efter dette program, vil vi langsomt skrive bedre og bedre kode, imens jeg fortæller lidt om hvordan det fungerer og hvad der kan gøres bedre. Alt kode er skrevet på engelsk, både ASCII-strengene og alle variabler. Der vil ikke være kommentarer i koden, både fordi at koden er så åbenlys – og fordi jeg forklarer koden bagefter. I får nu det første kode, som I kan kompilere – eller bare kigge på. Forklaring følger efter...
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char password[] = "xhjX89asd";
  5.     char guess[100];
  6.     
  7.     printf("Enter password:
  8. ");
  9.     scanf("%s", guess);
  10.     
  11.     if(strcmp(password, guess) == 0)
  12.     {
  13.         printf("
  14. ");
  15.         printf("You entered the right password");
  16.         printf("
  17. ");
  18.     }
  19.     else
  20.     {
  21.         printf("
  22. ");
  23.         printf("You entered an invalid password");
  24.         printf("
  25. ");
  26.     }
  27.     
  28.     system("PAUSE");
  29.     return 0;
  30. }
De fleste vil nok hurtigt kunne se at dette er et C-program og at den eneste større handling bliver udført af funktionen, strcmp(). De fleste vil også kunne se at vores kodeord er ”xhjX89asd”. Passwordet er hverken krypteret eller andet, bare et par hurtige, tilfældige tryk på tastaturet. system()-funktionen nederst, der kører kommandoen PAUSE, er sat for at vi kan følge med – hvis programmet ikke bliver kørt igennem kommandoprompten.

3.2. Research
Før vi starter skal vi have lavet lidt research. Hvis du skal have hacket et program nytter det ikke noget – hvis vi ikke har noget at gå efter. Vi skal forestille os, at vi ikke kender vores program. Vi kender hverken hvilken tekst der bliver udskrevet, hvilke funktioner der bliver brugt – eller hvad passwordet er. Dette ville være det mest naturlige, da du formodenligt ikke kender det program du vil hacke"s sourcekode. Det første vi gør, er logisk nok at åbne programmet. Når vi har åbnet programmet for vi beskeden, ”Enter password:”, da vi sådan set er ligeglade med at gætte passwordet pt. Skriver vi bare ”abc”. Efter det får vi beskeden, ”You entered an invalid password”. Det er den sidste besked her vi skal huske. Imellem vores input og programmets output, bliver der jo tjekket for om vores input er korrekt. Det vil sige at passwordet bliver loadet i hukommelsen – og det er det vi skal bruge OllyDbg til. Her kan du se hvordan vores program ser ud på min maskine
Billede: http://www.v0id.dk/rowl_article__hacking/cmdprompt_01.gif
Når vi trykker på en vilkårlig tast vil programmet lukke ned, og der er ikke mere at undersøge. Vi har nu en besked, ”You entered an invalid password”, som vi ved kommer lige efter tjekket af passwordet.

3.3. Hacket
Nu er det så at vi skal åbne OllyDbg. Du skulle gerne have dit CPU-vindue oppe, hvis det er, så tryk F3. Nu skulle der komme et vindue op, hvor du kan vælge dit program. Find dit program og tryk på ”åbn”. Der skulle derefter komme en masse i vores CPU-vindue, og en kommandoprompt vil poppe op. Kommandoprompten skal vi lade være i første omgang. Adresserne (som er tallene ude i de venstre sider) kan varierer fra computer til computer, fra program til program. Så det kan være svært at sammenligne en gang imellem. I det øverste venstre vindue, skal du trykke højreklik, ligemeget hvor. I højreklikmenuen vælger du ”Search for”, og derefter ”All referenced text strings”. Nu skulle der gerne komme et nyt vindue op, ”Text string referenced in dit_program:.text”. Nu skal du huske fra vores research, at vi skulle finde ”You entered an invalid password!”. Der ser således ud på min maskine
Billede: http://www.v0id.dk/rowl_article__hacking/ollydbg_02.gif
Tryk derefter dobbeltklik på teksten (eller hvor du vil – bare på linjen). Du bliver nu ført tilbage til CPU-vinduet, hvor du er ved teksten. Scroll nu lidt op, da vi ved at den tjekker lidt længere oppe. Ganske rigtigt, vi finder en funktion, strcmp.
Billede: http://www.v0id.dk/rowl_article__hacking/ollydbg_03.gif
Tryk én gang på linjen, så den bliver fremhævet. Tryk nu på F2, for at sætte et breakpoint. Vi skal sætte et breakpoint, for at tjekke om det var det rigtige sted. Nu skulle adressen gerne få en rød baggrund. Nu skal vi bare starte programmet, det gør du ved at trykke på F9. Gå nu til kommandoprompten skriv igen, ”abc”, og programmet vil stoppe, og sende dig til OllyDbg igen. Det var altså det rigtige sted, som vi havde forudset, da vi jo lavede research. Og nu har vi faktisk klaret det! Nede i højre vindue, kan du nu se et sted hvor der står
Billede: http://www.v0id.dk/rowl_article__hacking/ollydbg_04.gif
Den første linje er simpelhen passwordet, og næste linje vores input. Det er pga. at systemet skal loade værdierne for at kunne sammenligne, og det er dette OllyDbg holder øje med. For at tjekke om det er rigtigt, trykker vi CTRL+F2 (der vil muligvis poppe en besked op, hvor du bare skal trykke ”Ja”). Vi har nu ”spolet” programmet tilbage, og det eneste vi skal gøre nu er at slette breakpointet igen og starte programmet. Find adressen igen og tryk F2, for at slette breakpointet. Tryk nu F9, for at starte programmet igen.
Du får igen den samme besked, ”Enter password:”, og vi kan nu skrive det rigtige password, ” xhjX89asd”. På min maskine ser det således ud:
Billede: http://www.v0id.dk/rowl_article__hacking/cmdprompt_02.gif
Vi har nu hacket vores fil, nemt, ikk"?


4.0. Lad os prøve med C++

4.1. Programmet
Denne del, 4.0, er faktisk bare lavet for at demonstrere at det ikke er helt ens med C og C++. Jeg har skrevet den samme version fra før, om til C++, så funktionaliteten er den samme. I får programmet med det samme, og så kan vi snakke om det bagefter.
  1. #include <iostream>
  2. #include <string>

  3. int main()
  4. {
  5.     std::string password = "sdhsjkf";
  6.     std::string guess;
  7.     
  8.     std::cout << "Enter password:" << std::endl;
  9.     std::getline(std::cin, guess);
  10.     
  11.     if(password == guess)
  12.     {
  13.         std::cout << std::endl << std::endl << std::endl;
  14.         std::cout << "You entered the right password" << std::endl;
  15.         std::cout << std::endl << std::endl << std::endl;
  16.     }
  17.     else
  18.     {
  19.         std::cout << std::endl << std::endl << std::endl;
  20.         std::cout << "You entered an invalid password" << std::endl;
  21.         std::cout << std::endl << std::endl << std::endl;
  22.     }
  23.     
  24.     system("PAUSE");
  25.     return 0;
  26. }
Det ser anerledes ud en før, men forskellen er ikke så stor igen. Jeg har inkluderet en ekstra header-fil, string, så vi kan bruge strings, der nemlig først kom til i C++. string-klassen har overloadet operatoren, ==, så vi behøver ingen funktion for at tjekke de to værdier. Det er et nyt password, men det er igen et der bare hurtigt er tastet ind. Jeg vil ikke fortælle mere om programmet her, da der ikke rigtigt er noget at forklare. Hvis du er mere interesseret i C++ eller ikke forstår programmet helt, kan du kigge på nettet efter tutorials, guides, referencer, etc.

4.2. Hacket
Som du nok har lagt mærke til er der ingen research-afdeling, denne gang. Det er simpelthen fordi at du burde have fået indtrykket af det før. Jeg vil heller ikke fortælle helt så meget om OllyDbg denne gang, da der ikke er helt så stor forskel på programmet nu og det før. Vi åbner OllyDbg igen, hvis det ikke allerede er åbent. Find nu alle strengene igen. Vi kan nu se i vinduet at der er en del flere ASCII-strenge end sidst, og det er pga. at C++ er et større programmeringssprog, og har en masse som standard. Nu bliver den vågne læser nok overrasket! På første linje står passwordet nemlig. Det er fordi at C++ har erklæret den som ASCII-streng lige fra starten, ved brug af std::string. Jeg vil ikke rigtigt fortælle mere om C++ i denne her artikel. Jeg lavede bare deette her, for at vise at det nyeste ikke altid er det sikreste, og at du skal tænke dig ekstra godt om, hvis du vil lave et program der helst skal være sikret.


5.0. Lidt mere avanceret

5.1. Ingen strcmp?
Ja, hvad nu hvis der ingen ”strcmp” var at finde i OllyDbg? Vi har indtil videre gået ud fra at den var der – men det er også kun fordi at vi bruger den. Der er forskellige andre muligheder for at finde ud af hvor der bliver tjekket for værdierne. En kommando, du ofte vil komme ud for, er CMP. Kommandoen i sig selv siger lidt sig selv, compare. Den bliver brugt til at sammenligne to værdier. CMP er kun én af de mange hunrede Assembly-kommandoer der findes. For at forstå hvad der foregår i OllyDbg skal du helst kende lidt til Assembly, men ikke nødvendigvis meget. Nogle få af de mest brugte kommandoer, vil kunne hjælpe dig meget. Hvis du vil læse mere om den forskellige kommandoer, skal du prøve at tage et kig på; PUSH, CALL, MOV, CMP, JE, JMP, bare for at kende det grundlæggende.

5.2. CMP
For at se hvordan CMP fungerer kan i her se en ”prototype” af kommandoen
  • CMP <variabel>, <værdi>
Der er intet svært i dette, den bliver fodret med to værdier, og den tjekker om de er ens. De fleste forstår dog bedre hvis det bliver vist således
  • <variabel> == <værdi>
Men de fleste kan hurtigt se, at hvor vil man hen med det? Der er intet IF, eller andet der fører en videre, men det er der faktisk – bare ikke i samme kommando, så vi må have en ny – som jeg ikke vil snakke så meget om, JE
  • JE <sted>
Den bliver fodret med et parameter, og det vil kun gå i opfyldelse, hvis kommandoen CMP lykkedes. Forestil dig at du har en stak. Hver gang når du bruger CMP, smider den et svar tilbage, sandt/falsk. Hver gang når JE bliver kaldt, tager den en værdi op af bunkerne – og hvis den er sand, kører den til det valgte sted – og ellers fortsætter den bare. Det er selvfølgelig ikke sådan at det præcis foregår, men det er så at i kan få et indblik i det.
  1. CMP <variabel>, <værdi>
  2. JE    <sted> ; Lykkedes CMP? Hvis ja, lad os gå...
Og for at vi har alt på det rene skriver de det samme eksempel i C
  1. int i = (<variabel> == <værdi>);
  2. if(i) // Lykkedes i? Hvis ja, lad os gå...
  3.     // ...
Nogle vil nok blive lidt forvirrede her, da det er kodet på en anden måde end man normalt ville gøre (kommer an på eksempel), men i skal faktisk bare bytte i"et i if"en ud med det der står efter i =, og så har i det samme. Nu burde i forstå funktionen CMP.

5.3. Programmet
Dette program vil blive kode anerledes end de andre, mest for at vise at alle programmer er så lige til. Som de andre gange vil jeg først vise jer koden, og derefter snakke om den.
  1. #include <stdio.h>
  2. #include <conio.h>

  3. int main()
  4. {
  5.     int i = 0, count;
  6.     char password[] = "4f4Df787Esdgshd";
  7.     char c;
  8.     
  9.     printf("Enter password (. for stop):
  10. ");
  11.     while(c != ".")
  12.     {
  13.         c = _getch();
  14.         putchar(c);
  15.         if(c == password[i])
  16.             count++;
  17.         i++;
  18.     }
  19.     
  20.     if(count == strlen(password))
  21.     {
  22.         printf("
  23. ");
  24.         printf("You entered the right password");
  25.         printf("
  26. ");
  27.     }
  28.     else
  29.     {
  30.         printf("
  31. ");
  32.         printf("You entered an invalid password");
  33.         printf("
  34. ");
  35.     }
  36.     
  37.     system("PAUSE");
  38.     return 0;
  39. }
Vi har denne gang inkluderet conio, der ligger inde med funktionen _getch() vi skal bruge. Der er en vigtig ting her at vi skal huske. conio er ikke standard C, og det er derfor til tider en dårlig idé at bruge det. Jeg medtog denne funktion, samt headerfile, dels fordi at GCC understøtter den, samt fordi at man ikke kan regne med at programmer er kodet efter standarderne. Mange programmer vil ofte gøre brug af egne biblioteker, DLL-filer, osv. og det er derfor at jeg medtog en funktion ”udefra”. _getch() i sig selv, tager ikke imod parametre, men returnerer en int-type, og da char og int"s er beslægtede (ASCII), kan vores char-type godt tage imod en int-type. Int-værdien der bliver returneret vil dog blive konverteret til ASCII, pga. vores char-type. _getch() fungerer sådan at den tager imod et tastetryk, der returnerer int til funktionen, og det bliver tjekket og gjort ved hvorefter værdien (stadig i int) bliver spyttet tilbage. Vores char-type, modtager så int-typen og konverterer den til, som jeg sagde før, en char-type. Passwordet er, igen, bare et der hurtigt er tastet ind, denne gang lidt længere, men samme princip.

5.4. Research
Da det jo er et helt andet type program skal vi have lavet lidt research, som vi selvfølgelig enten skal huske eller notere. Jeg anbefaler at man skriver det ned, evt. i Notesblok, alt efter hvor stort hacket er. I disse små eksempler er det ikke nødvendigt, da vi kun skal huske en eller to ting. Det første vi skal lægge mærke til efter vi har åbnet programmet er, ”Enter password (. for stop):”. I skal huske at vi lader som om vi ikke kender programmet, så vi skal være så ”dumme” som vi kan. Med denne information ved vi altså at man ikke skal trykke enter for at verificere indholdet, men et punktum. Dette fortæller os at programmet enten læser programmet bogstav for bogstav, eller også er enter bare ”byttet” ud med et punktum. Nå men vi fortsætter, og trykker, kan du gætte det, ”abc”. Vi får nu en meddelse, ”You entered an invalid password”, som vi skal bide mærke i, da vi nu ved at eller andet andet for nyligt er blevet tjekket. På min maskine ser det sådan her ud
Billede: http://www.v0id.dk/rowl_article__hacking/cmdprompt_03.gif
Mere er der ikke i det her, nu skal vi bare igang. Så du hopper videre til 5.5, hacket!

5.5. Hacket
Jeg vil ikke længere gå i detaljer med OllyDbg mere, da I har fået den viden i har brug for. Skulle der dog komme noget nyt, skal jeg selvfølgelig nok gå langsomt til værks, og det kan jeg sige jer at der gør. åbn programmet, og åbn derefter programmet. Vi finder igen alle ASCII-strengene i vores program, og vi ved jo hvilken streng vi skal lede efter, så det er ligetil. Efter du har trykket dobbeltklik, og er kommet tilbage til CPU vinduet, vil du nu opdage at der er noget der er helt anerledes, hvis du har prøvet at scrolle lidt op og ned. Der er ingen strcmp! Men så er det jo godt vi gennemgik det kort forinden, så vi er klar og parate. Hvis du bare havde læst 5.2 og 5.1 nogenlunde, vil du også kunne huske at vi skulle lede efter kommandoen, CMP. Og det gør vi så. I mit tilfælde findes den på adressen, 00401313, og det ser således ud
Billede: http://www.v0id.dk/rowl_article__hacking/ollydbg_05.gif
Vi sætter nu et breakpoint, og starter programmet. Vi starter med at skrive et bogstav, "a", men til vores overraskelse fryser programmet, og vi bliver smidt tilbage til OllyDbg. Vi ved derfor nu at vi har med et loop at gøre, og at bogstaverne bliver læst en for en. Der vi i princippet har sat breakpointet i vores program er her
  • if(c == password[i])
Og det bliver jo tjekket i et loop, så logisk nok, stopper programmet hver gang det kommer til det samme sted. Vi kigger ned i det højre vindue, som vi de foregående gange har gjort, men nej, intet password. Oh ve, oh ve. Så skal der nye midler til. Vi starter programmet igen, for at tjekke at det virkeligt er et loop. Du skal ikke ”spole” tilbage først, bare start programmet. Vi skriver nu et "b", og jo, vi bliver smidt tilbage, dvs. det er et loop. Den opmærksomme læser vil have opdaget, at vi faktisk hele tiden for noget foræret, nemlig et char af gangen. Hver gang vi starter programmet, skriver et bogstav og bogstaverne bliver loadet, skal de jo også tjekket. Det kan vi faktisk se i det lille vindue, lige under hvor alt Assemblykoden er.
Billede: http://www.v0id.dk/rowl_article__hacking/ollydbg_06.gif
Men det er lidt langsomligt, specielt hvis det er en lang, lang kode. Vi bliver derfor nød til at finde en anden vej. Vi går op i det øverste venstre vindue igen, og trykker højreklik på vores linje med CMP-kommandoen. Gå derpå ned til ”Follow in dump”, og vælg, i dens undermenu, ”Memory address”. Vi vil altså følge denne adresse, så vi kan se hvor, hvornår og hvilke værdier der bliver loadet og tjekket. Der sker noget nede i det venstre hjørne, og er det ikke vores password, der på første linje? Jo, det er det. Vi kopierer linjen ved først at markere teksten, samt noget af det omkringliggende, og derefter trykke CTRL+C. åbn Noteblok og tryk CTRL+V i et tomt dokument. I mit tilfælde ser teksten inde i programmet således ud
Billede: http://www.v0id.dk/rowl_article__hacking/ollydbg_07.gif
Tilbage til Notesblok, vi sletter alt det vi ved – og tror vi ikke skal have tilbage, så det ser således ud:
  • b4f4Df787Esdgshd
Men vi ved jo ikke hvad det rigtige password er, så vi går udfra at det er dette. Men uden du behøves at prøve, kan vi jo sige at det er forkert
  1. Nuværende: b4f4Df787Esdgshd
  2. Rigtige:         4f4Df787Esdgshd
Men man kan på den måde prøve sig frem, og vores password fungerer selvfølgelig når man prøver det i programmet.
Billede: http://www.v0id.dk/rowl_article__hacking/cmdprompt_04.gif
I nogle tilfælde – faktisk mange, vil du kommer ud for at teksten står på en bestemt måde, og da der skal en del tekst til, har jeg valgt at lave en lille ekstra kategori, ”LIFO og Bytes?”.

5.6. LIFO og Bytes?
LIFO [Last In – First Out] fungerer på den måde, ligesom det betyder, at det man putter sidst ind kommer også først ud. Det er simpelthen en stak, der tager imod værdier. Du ligger værdier ind, og når det tags ud, komm de nærmest ”baglæns”, ud.
  1. | |
  2. | |
  3. |_|
Her er vores stak, lad os prøve at fylde noget på den, 1, 2 og til sidst, 3.
  1. |3|
  2. |2|
  3. |1|
Når du ligger et i, ”falder” den selvfølgelig til bunden, og de næste ligger sig ovenpå. Når vi nu skal tage en værdi, tager vi den øverste, da der jo ikke er hul i bunden
  1.   --> 3
  2. | |
  3. |2|
  4. |1|
Hvorefter vi til sidst har 3, 2, 1. Vi lagde 1, 2, 3 ind, men tog 3, 2, 1 ud. Det er på denne måde at ”dumps” kommer ud. Det er små tekststykker der bliver taget 4 ud af gangen, 4 bytes. Du skal nu forestille dig vores stak, med plads til ekstra værdier. Vi vil prøve at arbejde med teksten:
  • Hej med dig, hvad hedder du?
Alle ”andre” tegn, bliver byttet ud med punktummer, altså mellemrum, linebreak, osv.
Vores tekst vil derefter se ud som dette
  • Hej.med.dig,.hvad.hedder.du?
Lad os nu sætter dem i en stak, hvor vi jo ved at de skal ind, fire bytes af gangen, altså fire bogstaver af gangen.
  1. |?...|
  2. |r.du|
  3. |edde|
  4. |ad.h|
  5. |,.hv|
  6. |dig.|
  7. |med.|
  8. |Hej.|
Og når man trækker dem ud, via LIFO-princippet, kommer det ud
  • ?...r.dueddead.h,.hvdig.med.Hej.
Hvis du ligger inde med sådan en tekst, gør du det bare baglæns, og det hele bliver vist rigtigt igen.
  1. |Hej.|
  2. |med.|
  3. |dig.|
  4. |,.hv|
  5. |ad.h|
  6. |edde|
  7. |r.du|
  8. |?...|
Og du har nu, igen, den rigtige tekst. Dette var bare vist, så du ved at du kan få et output som dette, og ikke bare et normalt. Det er ikke kun her LIFO bliver brugt, men i mange forskellige programmeringssprog. Her kan I se et eksempel i C++ vector"er.
  1. #include <vector>

  2. ...

  3. std::vector<int> myVec;

  4. myVec.push_back(1);
  5. myVec.push_back(2);
  6. myVec.push_back(3);

  7. std::cout << myVec.back() << std::endl; // Printer: 3
Mange sprog er sågar bygget på LIFO-teorien, dog mest esoteriske sprog som Brainfuck, Befunge, etc.


6.0. Til slut...

6.1. Hvad har jeg lært?
Du vil efter denne artikel, hvis du har læst det hele, være i stand til mange ting. Du vil være i stand til at lavee sikre programmer, bruge en debugger, kende til Assembly, C, C++ og meget mere. Du vil kunne hacke enkle programmer (.EXE), men dog kun til en vis grad. Dette er kun lige ”toppen af isbjerget”. Du vil formodenligt ikke kunne gå ud og hacke alle programmer, da de fleste er langt sikrere en mine eksempler her. At jeg ikke har lært jeg ”hyperhacking”, eller hvad man nu kalder det (;-)) er både fordi at det er langt sværere, men også fordi at formålet i artiklen ikke var at i skulle kunne gå ud og hacke – og andre ulovlige ting, men for at i kan lære om sikkerhed. For at forsvare sig mod hackere, bliver man nødt til at tænke som en. Og det er dét jeg har prøvet at få frem i artiklen. Som sagt kan det være du har lært noget nyt med programmering, eller nye artikler. Hvad ved jeg.

6.2. Note
Det her var så min anden artikel her på Rowl, dog i et helt andet emne – og alligevel ikke. Jeg håber I har nydt artiklen og fået noget ud af det. Det kan godt være der har været meget tekst, men det er for at I skal forstå det fuldt ud. Jeg siger tak for denne gang, det har været sjovt at skrive denne artikel.


Download af alle programmer, billeder, sourcekode, links, osv.:
http://www.v0id.dk/rowl_article__hacking.rar
Oprettet af:

C/C++

Point modtaget: 0

Rate:
17:31 04/12/2006

Kommentarer

Giv din mening tilkende om denne artikel, eller læs andres.
Har du spørgsmål eller brug for hjælp til denne artikel henvises du til forummet.
Rigtig god artikel, syntes det er godt nok du laver links til billederne istedet for bare at sætte dem ind.

Nogle gange syntes jeg opstillingen er lidt forvirrende :P
Oprettet af:
  Mail
13:09 09/12/2006
#Kevin
Ja...
Men lærerig :)
Oprettet af:
  Mail
17:37 10/12/2006
Du kan også lukke pcer ned der køre på samme netværk:

1. Start
2. Kør
3. Indtast: i/shoutdown

:) husk de skal lige være online før du kan
Oprettet af:
  Mail
13:24 13/12/2006
Jeg kan ikke helt se hvor du vil hen med den kommantar?
For det første har den ingen relevans for min artikel, og for det andet, hvis det havde relevans, kunne man ikke bruge dit eksempel.

Næste gang, tjek hvilken artikel du er ved at skrive en kommentar til, og tjek at dine kommentarer er rigtige.

  • Start > "Kør..." > "shutdown /i"
Oprettet af:
  Mail
17:01 15/12/2006
Er det ikke "shutdown -i"?

Edit:
Glemte helt at kommentere din artikel. Jeg synes, det er utroligt fedt, du gider lægge så meget arbejde i det. Dog synes jeg, kommentarer som "Det var godt nok en lang artikel" er lidt åndssvage og grænser til det umodne, for det er ikke bemærkelsesværdigt at en artikel er lang, kun at den er kort.

Jeg læste den ikke 100%, hvilket jeg snart vil gøre (når jeg engang kommer hjem med tømmermænd :D), men jeg synes ikke at kunne se en forklaring til "strcmp" eller hvad funktionen nu hedder, hvilket jeg synes er en mangel, for den er altså virkelig ikke åbenlys, men kan jo være jeg bare lige har misset forklaringen. I så fald trækker jeg mine ord tilbage ;)

God artikel & Godt nytår (gælder også jer andre)
Sidst redigeret 17:32 - 31/12/2006
Oprettet af:
  Mail
17:27 31/12/2006
Hej deXo-fan,
tusind tak for kommentaren!
Først vil jeg undskylde at jeg svarer så sent, da jeg simpelthen ikke har set din kommentar før.

Må indrømme at jeg lige var lidt hurtig med min kommentar ang. shutdown, da jeg ikke vidste at
  • shutdown -i
også virker. Ved brug af en skråstreg virker det også - og jeg valgte at skrive denne løsning, da det er "slashes" der bliver brugt af stortset alle WinSys" programmer. De fleste opensourceprogrammer gør brug af "-", som efter min mening er pænest, men da det var Windows, valgte jeg som sagt en skråstreg.

Ang. strcmp;
Jeg har ikke skrevet om strcmp, nej. Formålet med denne artikel var ikke C, eller C++, men derimod selve OllyDbg-programmet, og hvordan det bruges til at hacke. Der er selvfølgelig også en del C, samt C++ i artiklen, men det er udelukkende for at vise hvordan programmer kan se ud - og hvad det egentligt er vi prøver at hacke. Hvis du ønsker at vide mere om strcmp, eller hvis der er andre, så er der en udemærket reference på strcmp-funktionen, kortfattet, men god. Den kan findes her;
http://cppreference.com/stdstring/strcmp.html
Hvis du/I endnu ikke har forstået brugen af strcmp, er i meget velkomne til at kontakte mig, enten via. e-mail eller pm! :-)

---

Generelt til artiklen vil jeg indrømme at ikke alt fakta samt information er 100% korrekt. Efter at jeg har skrevet artiklen her, har jeg lært en del nyt - og jeg kan derfor se i min artikel at ikke alt er korrekt. Det er generelt om det jeg har sagt om Assembly. Det er dog ikke meget forkert, men heller ikke helt rigtigt. Siger det bare så I ikke senere kommer og hænger mig op for det. ;-)
Vælger ikke at rette i artiklen, så den kan stå i original "stand".
Derudover har der også sneget sig to blinde passagerer ind (smileys), og til dem der ikke kan se hvad der skulle stå istedet for dem, kan det ses her (i rigtig rækkefølge);
  • std::string
  • (ASCII)

---

Jeg er stadig åben for feedback, så skriv endelig!
Oprettet af:
  Mail
17:55 10/01/2007
Ej jeg syntes det hele ser godt ud. Bare lidt forvirrende det med billederne.

Fik ikke læst det hele, det var jo en årdenlig mundful
Oprettet af:
  Mail
17:34 29/01/2007
Flot! :)
Oprettet af:
  Mail
16:44 04/03/2007
Jeg synes jeg har læst et eller andet om at en hacker ikke foretager sig noget ulovligt, så er det en craker? :)

Anyways.. Fed artikel. Jeg synes den er lidt lang hvis man er nybegynder (som mig). Ellers helt fin makker, 4/5 ;)
Oprettet af:
  Mail
15:41 15/04/2007
Hej steffen,
det du siger er fuldstændigt korrekt.
Størstedelen af verden kender ikke forskel, men alle kender til ordet "hacker", så jeg valgte at bruge "hacker"-termet i stedet for "cracker".

Godt du kunne lide min artikel. :-)
Artiklen er måske lidt lang, men så får vi på én gang alt basis-viden indenfor det med. Og det skader vel ikke?
Oprettet af:
  Mail
09:33 21/04/2007
Du skal være oprettet og logget ind for at kommentere en artikel
Copyright © Rowl.dk v/ Michael Raagaard | 2005-12 | Alle rettigheder forbeholdes