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