Jestem poza docelowym plikiem wykonywalnym gdb i nie mam nawet stosu, który odpowiadałby temu celowi. I tak chcę zrobić jednoetapowo, aby móc zweryfikować, co się dzieje w moim kodzie asemblera, ponieważ nie jestem ekspertem w montażu x86. Niestety, gdb odmawia wykonania tego prostego debugowania na poziomie zestawu. Pozwala mi ustawić i zatrzymać się na odpowiednim punkcie przerwania, ale gdy tylko próbuję wykonać krok naprzód, gdb zgłasza błąd „Nie można znaleźć granic bieżącej funkcji”, a EIP się nie zmienia.
Dodatkowe Szczegóły:
Kod maszynowy został wygenerowany przez instrukcje gcc asm i skopiowałem go do lokalizacji pamięci jądra, w której jest wykonywany, z wyjścia objdump -d. Nie miałbym nic przeciwko prostemu sposobowi użycia programu ładującego do załadowania mojego kodu obiektowego na przeniesiony adres, ale pamiętaj, że ładowanie musi być wykonane w module jądra.
Przypuszczam, że inną alternatywą byłoby stworzenie fałszywego modułu jądra lub pliku informacji debugowania, który zostanie przekazany gdb, aby uwierzył, że ten obszar znajduje się w kodzie programu. gdb działa dobrze na samym pliku wykonywalnym jądra.
(Dla tych, którzy naprawdę chcą wiedzieć, wstawiam kod w czasie wykonywania do przestrzeni danych jądra systemu Linux wewnątrz maszyny wirtualnej VMware i debuguję go ze zdalnego debugowania jądra gdb za pośrednictwem wbudowanego kodu gdb wbudowanego w VMware Workstation. Uwaga: nie piszę jądra exploity; Jestem absolwentem bezpieczeństwa piszącym prototyp).
(Mogę ustawić punkt przerwania dla każdej instrukcji w moim zestawie. Działa, ale po pewnym czasie będzie to dość pracochłonne, ponieważ rozmiar instrukcji montażu x86 jest różny, a lokalizacja zestawu będzie się zmieniać za każdym razem, gdy uruchomię ponownie).
Odpowiedzi:
Możesz użyć
stepi
lubnexti
(co można skrócić dosi
lubni
), aby przejść przez kod maszynowy.źródło
start
jest równoważnetbreak main
następujący porun
(uwaga:tbreak
zamiastbreak
)Zamiast
gdb
uciekaćgdbtui
. Lub biegnijgdb
z-tui
przełącznikiem. Lub naciśnij C-x C-apo wprowadzeniugdb
. Teraz jesteś w trybie TUI GDB .Enter,
layout asm
aby utworzyć zestaw wyświetlania górnego okna - automatycznie podąży za wskaźnikiem instrukcji, chociaż możesz także zmieniać ramki lub przewijać podczas debugowania. Naciśnij, C-x saby przejść do trybu SingleKey, w którymrun continue up down finish
itp. Są skracane do pojedynczego klawisza, co pozwala na bardzo szybkie przejście przez program.źródło
Najbardziej użyteczną rzeczą, jaką możesz tutaj zrobić, jest to
display/i $pc
, że przed użyciem,stepi
jak już zasugerowano w odpowiedzi R. Samuela Klatchko. Mówi to gdb, aby za każdym razem zdemontował bieżącą instrukcję tuż przed wyświetleniem zachęty; następnie możesz po prostu wciskać Enter, aby powtórzyćstepi
polecenie.(Zobacz moją odpowiedź na inne pytanie po więcej szczegółów - kontekst tego pytania był inny, ale zasada jest taka sama).
źródło