Witam!
Jak w ollydbg ustawić pułapkę na miejsce gdzie normalnie program po uruchomieniu powoduje błąd(prawdopodobnie przepełnienie bufora ale w którym miejscu jest?)?
Brany jest tylko pod uwagę kod binarny.
2x klik
W opcjach masz reakcję na wyjątki /domyślnie powinno przerwać wykonywanie/, w momencie wystąpienia wyjątku program jest zatrzymywany a w debuggerze masz aktualny kontekst wątku rzucającego wyjątkiem.
Obadaj callstack żeby mniej\więcej się zorientować skąd przyszło wywołanie procki z wyjątkiem. Jeżeli overflow nie jest duży to łątwo namierzyć okolicę, gdzie się złe rzeczy dzieją i zapuścić śledzenie - trace into - aby automatem mieć log z przejścia przez kod do miejsca wystąpienia wyjątku. Zresztą, jak wiesz gdzie się coś dzieje to puszczasz trace i patrzysz w log, widzisz z jakiej procki i w jakich warunkach nastąpił powrót pod niewłaściwy adres. Jak overflow sie tyczy nadpisania zmiennych to sytuacja ma się podobnie w sumie...
@Coldpeer, 2x klik\F2 to tylko zastawienie breakpointa na danym adresie...
Może mały przykład na moim Windows Server 2003 + ImmunityDbg /pochodna Olka/:
PS C:\Documents and Settings\deus> gcc --version
gcc.exe (GCC) 4.2.3 (TDM-1 for MinGW)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
PS C:\Documents and Settings\deus> gc exp.c
#include <string.h>
int overflow (char* a) {
char buffer[8];
strcpy (buffer, a);
return 0;
}
int main (void) {
return overflow ("lipotes vexillifer");
}
PS C:\Documents and Settings\deus> gcc exp.c -o exp.exe -O2
Ładujemy w Olly\Imm program, odpalamy /F9/...
Address=66696C6C
Message=Access violation when executing [66696C6C]
Callstack jest pusty ze względu na rozjechanie się stosu... w oknie stosu zaś:
0022FF60 00007265 er..
0022FF64 0022FF80 €˙".
0022FF68 /0022FFB0 °˙".
0022FF6C |0040124B K@. RETURN to exp.0040124B from exp.00401300
Więc patrzymy co mamy przed 0040124B:
0040122F |. 8B00 MOV EAX, [EAX]
00401231 |. 894424 08 MOV [ESP+8], EAX ; env
00401235 |. A1 00404000 MOV EAX, [404000]
0040123A |. 894424 04 MOV [ESP+4], EAX ; argv
0040123E |. A1 04404000 MOV EAX, [404004]
00401243 |. 890424 MOV [ESP], EAX ; argc
00401246 |. E8 B5000000 CALL exp.00401300 ; main
OK, restart programu, breakpoint na 00401300, jak się złapie - trace into /Ctrl-F11/... mamy info o wyjątku, patrzymy w log /View->Run trace albo [...]/:
Back=4. Thread=Main Module=msvcrt Address=77BC6F76 Command=RETN
Back=3. Thread=Main Module=exp Address=004012F8 Command=XOR EAX, EAX Modified registers=EAX=00000000
Back=2. Thread=Main Module=exp Address=004012FA Command=LEAVE Modified registers=EBP=69786576
Back=1. Thread=Main Module=exp Address=004012FB Command=RETN
Back=0. Address=66696C6C Command=???
patrząc wedle ostatniego adresu w poprawnym kodzie mamy:
004012E0 /$ 55 PUSH EBP
004012E1 |. 89E5 MOV EBP, ESP
004012E3 |. 83EC 18 SUB ESP, 18
004012E6 |. 8B45 08 MOV EAX, [EBP+8] ; |
004012E9 |. 894424 04 MOV [ESP+4], EAX ; |
004012ED |. 8D45 F8 LEA EAX, [EBP-8] ; |
004012F0 |. 890424 MOV [ESP], EAX ; |
004012F3 |. E8 98020000 CALL <JMP.&msvcrt.strcpy> ; \strcpy
004012F8 |. 31C0 XOR EAX, EAX
004012FA |. C9 LEAVE
004012FB \. C3 RETN
Z czego jasno wynika, że overflow robi skopiowanie stringa otrzymanego jako argument...
Scenariuszy może być cała masa, przestawiłem najprostszy, mam nadzieję, że się przyda :-).
Super dzięki.
Mam pewien problem. Jak analizuje program i daje sobie breakpointy(F2), a następnie zrestartuje program(Ctrl+F2) to te breakpointy sie gubią(np. jak ustawiłem te punkty w jakiejś bibliotece ładowanej przez analizowany program).
I jeszcze jeden problem, w programie można sobie zakliknąć aby wypisał wszystkie breakpointy które zaznaczyłem, lecz gdy te breakpointy są zaznaczone w bibliotekach, a "jestem" w kodzie programu to te breakpointy mi sie nie wypisują. Muszę wejść do danej biblioteki(nie bardzo też wiem jak) i dopiero dać aby mi wypisał breakpointy. Da się jakoś zrobić aby Od razu wszystkie breakpointy wypisał w jednym oknie?
- Z jakies wersji Olly korzystasz? W 2.0 tak nie jest.... Gubią się tylko jak są w bibliotece czy zawsze?
- Nie wiem ;-P
cyriel napisał(a)
- Z jakies wersji Olly korzystasz? W 2.0 tak nie jest.... Gubią się tylko jak są w bibliotece czy zawsze?
- Nie wiem ;-P
Version produktu: 1.0.10.0
Heh faktycznie robie na zabytku :-D
Poszukam nowszej wersji.
2.0 to jeszcze nie jest oficjalna wersja. To tylko wersja testowa, chociaż u mnie spisuje się bardzo dobrze i ogólnie uważam ją za lepszą od tej której poprzednio używałem(tylko która to była...?).
Kurcze męcze się jeszcze z jednym problemem :-[
W olly da się ustawić pułapkę na miejsce w pamięci(np. gdy bedzie odczyt/zapis) no i fajnie, lecz adres sie zmienia, a na dodatek jest to stos. Dokładniej odczyt wygląda tak:
push SS:[EBP-10]
Analizuje ręcznie kod już kilka godzin w poszukiwaniu gdzie sie wpisują wartość do tego miejsca w pamięci i jeszcze wcześniej co się z tym tekstem działo....
Jak ustawić pułapkę na instrukcje która wskazuje na tekst "asdlkj123asd"? Jakbym znał adres to bym dał pułapkę na miejsce w pamięci(lecz adres sie zmienia).
push SS:[EBP-10]
To to raczej zapis jest....
Jak ustawić pułapkę na instrukcje która wskazuje na tekst "asdlkj123asd"?
Napisz dokładniej o co Ci chodzi(najlepiej jakiś przykład, bo nie rozumiem.... w ogóle to najlepiej będzie jak dokładniej opiszesz sytuację - może coś sie wymyśli, a teraz to nawet nie wiem jaki jest problem i co chcesz zrobić.
cyriel napisał(a)
push SS:[EBP-10]
To to raczej zapis jest....
Jak ustawić pułapkę na instrukcje która wskazuje na tekst "asdlkj123asd"?
Napisz dokładniej o co Ci chodzi(najlepiej jakiś przykład, bo nie rozumiem.... w ogóle to najlepiej będzie jak dokładniej opiszesz sytuację - może coś sie wymyśli, a teraz to nawet nie wiem jaki jest problem i co chcesz zrobić.
To jest odczyt, gdyż zostaje uruchomiona funkcja MessageBox(lub coś podobnego).
Sytuacja taka: jest to program sieciowy który odbiera komunikaty na pewnym porcie a następnie są wyświetlane. Interesuje mnie obróbka tekstu(jest on filtrowany itp).
Prawdopodobnie odbierany jest pakiet, sprawdzany typ pakietu, a następnie jest jakoś pobierany ten tekst(i to miejsce chcę znaleźć).
Może napisze przykładowy kod taki pi razy drzwi ;-)
;...Szukany kod
mov eax, ADRES
mov ptr byte SS:[eax], 0x41
;...znany kod
push 0
push SS:[EBP-10]
push 0
push 0
call MessageBoxA ; wyświetlany komunikat o treści "test12test"
Gdyby adres był stały, to w olly jest opcja aby dać pułapkę na miejsce w pamieci, jeśli program bedzie odczytywał lub coś wpisywał, to olly zatrzyma w wskaże miejsce w kodzie gdzie następuje operacja na łańcuchu w pamięci. Niestety adres sie zmienia, więc zostaje mi znaleźć takie miejsca w kodzie które wskazują na znany mni tekst.
mov eax, ADRES ; olly ma taki bajer ze przy takim kodzie pokazuje zawartosc adresu
;...
ADRES: "tekst",0
po prostu znaleźć instrukcje w programie które operują na danym łańcuchu.
Chyba wyraziłem się jasno :d
- Użyj IDY. Załaduj sobie program, zobacz z jakich funcji korzysta, znajdź tą która jest odpowiedzialna za odbieranie danych ustaw na nią breakpointa(w ollym) i dalej już wiesz co robić :)
- Wrzuć tutaj ten program :)