Pokaż wyniki 1 do 8 z 8

Temat: Stos i programowanie w C

  1. #1
    Zarejestrowany
    Dec 2008
    Postów
    48

    Domyślnie Stos i programowanie w C

    Witam wszystkich!
    Przerabiam sobie 2 raz wydanie Hacking Sztuka penetracji wyd. 2 i natknalem sie na cos glupiego.
    Mam problem z ta funkcja, poniewaz niezaleznie czy int auth_flag czy char password_buffer jest napisane jako piewrsze w kodzie C to i tak na stosie tablica char jest zawsze pierwsza. Nie wiem dlaczego tak sie dzieje, poniewaz w tym przypadku adres tablicy powinien miec wyzszy adres niz zmienna int.
    =================================
    int check_authentication(char *password) {
    char password_buffer[16];
    int auth_flag = 0;


    strcpy(password_buffer, password);

    if(strcmp(password_buffer, "brillig") == 0)
    auth_flag = 1;
    if(strcmp(password_buffer, "outgrabe") == 0)
    auth_flag = 1;
    return auth_flag;
    }
    =================================

    Ale jezeli dodam do tej funkcji:

    printf("%p\n", password_buffer);
    prinft("%p\n", &auth_flag);


    to adres int jest wczesniej niz adres buffora i dziala poprawnie.

    Tutaj umieszczam caly kod zrodlowy:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int check_authentication(char *password) {
    char password_buffer[16];
    int auth_flag = 0;

    strcpy(password_buffer, password);

    if(strcmp(password_buffer, "brillig") == 0)
    auth_flag = 1;
    if(strcmp(password_buffer, "outgrabe") == 0)
    auth_flag = 1;
    return auth_flag;
    }
    int main(int argc, char *argv[]) {
    if(argc < 2) {
    printf("Spos&#195;&#179;b u&#197;&#188;ycia: %s <has&#197;‚o>\n", argv[0]);
    exit(0);
    }
    if(check_authentication(argv[1])) {
    printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
    printf(" Uwierzytelniono.\n");
    printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
    } else {
    printf("\nDostęp zabroniony.\n");
    }
    }


    Jesli ktos potrafi rozwiac moje watpliwosci to piszcie!

  2. #2
    Avatar lukasz6547
    lukasz6547 jest offline Ciasno tu:D
    Zarejestrowany
    Apr 2008
    Postów
    348

    Domyślnie

    To nie jest tak. Ty nigdy nie mozesz byc pewny co i jak bedzie rozmieszczone w pamieci...Ale mozna rozgryzc (algorytm) zaleznie od tego jak deklarujesz dane w kodzie to w jaki sposób są układane dane na stosie mimo tej randomizacji i innych peirdół, bo to jest sciema z "całkowitą" losowoscia adresów / rozmieszczenia- kiwdys widzialem ciekawy artyykół o tym....Własnie dlatego poddawaj assemblacji kod bo tak na pale to nic nie wyjdzie...Trzeb isc na łatwizne bo nigdy nie bedzie sie wiedziec wszystkiego

  3. #3
    Zarejestrowany
    Dec 2008
    Postów
    48

    Domyślnie

    Wiem na jakiej zasadzie są rozmieszczane elementy na stosie. To co przedstawiłem powinno działać bez tych dodatkowych funkcji printf, no ale chodzi mi tylko z printf dobrze. Kolejność wrzucenia na stos powinna być taka:
    łańcuch z hasłem, EIP, EBP, buffor do którego wczytuje i na najniższym adresie ta zmienna int. Jest jednak odwrotnie bo zmienna int jest w wyższym adresie niż tablica znaków.
    A jak wpakuje tam te 2 wspomniane funkcje i kolejność jest ok.
    Więc trudno mi stwierdzić jak to ma działać.

  4. #4
    Zarejestrowany
    Jan 2009
    Postów
    216

    Domyślnie

    stary nie zaczynaj zabazy od c. assembler tylko i wylacznie. jak juz bedziesz wiedzial co i jak, bez problemu poradzisz sibue w c.
    tak to mozesz zgadywac, powodzenia.

  5. #5
    Zarejestrowany
    Dec 2008
    Postów
    48

    Domyślnie

    Ja tu nie zgaduje Wg. książki to powinno działać, a u mnie na Gentoo nie działa. Spróbuje jutro z innego linux'a to odpalić. A pojęcie o C i asemblerze jakieś mam bo inaczej bym się na to nie porywał. Jakby ktoś to mógł skompilować na innym kompie i wpisać w terminalu: ./program $(perl -e 'print "A" x 30;' ). Jak wyjdzie wam uwierzytelniono to coś jest nie tak

    ....

    Program dziala mi na Ubuntu z ta sama wersja GCC, ale starsza wersja jadra 2.6.20. Za Chiny cara nie wiem czego mi tak kompiluje.
    Ostatnio edytowane przez Paladyn : 01-05-2009 - 23:58

  6. #6
    Avatar lukasz6547
    lukasz6547 jest offline Ciasno tu:D
    Zarejestrowany
    Apr 2008
    Postów
    348

    Domyślnie

    Cytat Napisał Paladyn Zobacz post
    Wiem na jakiej zasadzie są rozmieszczane elementy na stosie. To co przedstawiłem powinno działać bez tych dodatkowych funkcji printf, no ale chodzi mi tylko z printf dobrze. Kolejność wrzucenia na stos powinna być taka:
    łańcuch z hasłem, EIP, EBP, buffor do którego wczytuje i na najniższym adresie ta zmienna int. Jest jednak odwrotnie bo zmienna int jest w wyższym adresie niż tablica znaków.
    A jak wpakuje tam te 2 wspomniane funkcje i kolejność jest ok.
    Więc trudno mi stwierdzić jak to ma działać.
    Więc nie mozna z gury wediziec tego pooniewaz w zaleznosci od tresci kodu jest rózneie tłómaczony na assmebler, a do tego prawdopodobnie sa zaimplementowane pewne charakterystyczne układy odniesienia(np. funkcje w zaleznosci od rodzaju dostepu do pliku- to wszystko wplywa na randomizace inne głupoty ...Co by to byłlo gdyby kazdy mógł sobie ot tak wiedziec co jak sie dzieje...katastrofa
    ps nie radze próbowAC skompromitowac kompilator tylko starac sie rozgryzc program , bo w innym prypadku zycia ci nie starczy na to bez kodu źródłowego(kompilatora) w wyzszym poziomie...
    Ostatnio edytowane przez lukasz6547 : 01-06-2009 - 13:49

  7. #7
    Zarejestrowany
    Dec 2008
    Postów
    48

    Domyślnie

    No właśnie w zależności od architektury i ustawień kompilatora program wynikowy ma inną strukturę.
    Co ciekawe użyłem opcji:

    gcc -g -O2 program.c

    i już mi nie wywala przepełnienia buforu. Za to podczas odwoływania się to zmiennej w programie gdb:

    x/x &auth_flag

    wyrzuca błąd, że ta zmienna nie jest l-wartością.
    ------------------------------------------------------------------------
    Jak dam samo gcc -g program.c to bufor można przepełnić, ale za to można się odwołać w gdb do adresu auth_flag.

    Opdaliłem ten program normalnie na Ubuntu i działa. Więc wniosek z tego, że musi być coś nie tak z kompilatorem na Gentoo. Zobaczę jakie CLFAGS są ustawione pod Ubuntuu i spróbuje je użyć do Gentoo.

  8. #8
    Avatar lukasz6547
    lukasz6547 jest offline Ciasno tu:D
    Zarejestrowany
    Apr 2008
    Postów
    348

    Domyślnie

    Cytat Napisał Paladyn Zobacz post
    No właśnie w zależności od architektury i ustawień kompilatora program wynikowy ma inną strukturę.
    Co ciekawe użyłem opcji:

    gcc -g -O2 program.c

    i już mi nie wywala przepełnienia buforu. Za to podczas odwoływania się to zmiennej w programie gdb:

    x/x &auth_flag

    wyrzuca błąd, że ta zmienna nie jest l-wartością.
    ------------------------------------------------------------------------
    Jak dam samo gcc -g program.c to bufor można przepełnić, ale za to można się odwołać w gdb do adresu auth_flag.

    Opdaliłem ten program normalnie na Ubuntu i działa. Więc wniosek z tego, że musi być coś nie tak z kompilatorem na Gentoo. Zobaczę jakie CLFAGS są ustawione pod Ubuntuu i spróbuje je użyć do Gentoo.
    Wiesz co, powiem ci szczerze, ze i tak nie wykonasz z powodzeniem bufferoverflow ani innych atakow na aplikacje chyba ze na systemie z 5 lat nieaktualizowanych poniewaz jest tyle znanych rodzajów zabezpieczeń i ukrytych ze ciezko jest zliczuc- szczególnie w *nixach, w nich musisz byc po prostu sprytny( jezeli atakujesz program albo system )...zajmij sie protokolami przesyłania danych jezeli chcesz cos "ciekawego" osiagnąć, a w nich jest bbardzo duzo dziur a internet daje corawz wiecxej mozliwosci wiec z powodu szybkiego brozwoju bedzie coraz wiecej bugów...Nawet w czyms takim jak IP jest dosc duzo błedów w architekturze wiec wiesz... Ale i tak najwiecej w tej chwili mozna osiągnąc na atakach na "web" poniewaz mozesz ingerowac w serwer, dane itd bez zbednych trudnosci...A aplikacje sobie odpusc
    Ostatnio edytowane przez lukasz6547 : 01-10-2009 - 09:21

Podobne wątki

  1. Programowanie w C++ - Hasło
    By MasterMazo in forum Inne metody
    Odpowiedzi: 8
    Autor: 10-16-2009, 15:01
  2. Programowanie sieciowe
    By Ormi in forum Linux
    Odpowiedzi: 2
    Autor: 08-31-2008, 12:27
  3. książki (programowanie)
    By maxhack in forum Off Topic
    Odpowiedzi: 5
    Autor: 11-26-2007, 20:11
  4. stdcall a stos =/
    By 31337 in forum Newbie - dla początkujących!
    Odpowiedzi: 0
    Autor: 11-24-2007, 12:43
  5. [c] programowanie pod linuxem
    By ona in forum C/C++
    Odpowiedzi: 1
    Autor: 01-05-2007, 20:39

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