[ollydbg] Miejsce z błędem w kodzie

0

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.

0

2x klik

0

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 :-).

0

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?

0
  1. Z jakies wersji Olly korzystasz? W 2.0 tak nie jest.... Gubią się tylko jak są w bibliotece czy zawsze?
  2. Nie wiem ;-P
0
cyriel napisał(a)
  1. Z jakies wersji Olly korzystasz? W 2.0 tak nie jest.... Gubią się tylko jak są w bibliotece czy zawsze?
  2. Nie wiem ;-P

Version produktu: 1.0.10.0
Heh faktycznie robie na zabytku :-D
Poszukam nowszej wersji.

0

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...?).

0

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).

0
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ć.

0
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

0
  1. 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ć :)
  2. Wrzuć tutaj ten program :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1