Użycie gdb do jednostopniowego kodu montażowego poza podanym plikiem wykonywalnym powoduje błąd " nie można znaleźć granic bieżącej funkcji"

Jestem poza programem wykonywalnym gdb i nie mam nawet stosu odpowiadającego temu celowi. I tak chcę zrobić jednoetapowy krok, żeby móc zweryfikować co się dzieje w moim kodzie assembly, ponieważ nie jestem ekspertem w x86 assembly. Niestety, gdb odmawia wykonania tego prostego debugowania na poziomie montażu. Pozwala mi to ustawić i zatrzymać odpowiedni punkt przerwania, ale jak tylko spróbuję przejść jeden krok dalej, gdb zgłasza błąd "nie można znaleźć granic bieżącej funkcji", a EIP nie zmiana.

Dodatkowe szczegóły:

Kod maszynowy został wygenerowany przez instrukcje gcc asm i skopiowałem go do pamięci jądra, gdzie jest wykonywany, z wyjścia objdump-d. nie miałbym nic przeciwko prostemu sposobowi użycia loadera 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 wyprodukowanie fałszywego modułu jądra lub Pliku informacji debugowania, aby dać gdb, aby go przekonać obszar ten znajduje się w kodzie programu. gdb działa dobrze na samym jądrze.

(dla tych, którzy naprawdę chcą wiedzieć, umieszczam kod w czasie wykonywania w przestrzeni danych jądra Linuksa wewnątrz maszyny wirtualnej VMware i debuguję go z gdb zdalne debugowanie jądra za pomocą wbudowanego Stuba gdb VMware Workstation. Zauważ, że nie piszę exploitów jądra; jestem studentem studiów nad bezpieczeństwem piszącym prototyp.)

(mogę ustawić punkt przerwania na każdej instrukcji wewnątrz mojego zestawu. To działa, ale po pewnym czasie stanie się dość pracochłonne, ponieważ rozmiar instrukcji montażu x86 jest różny, a lokalizacja zespołu zmieni się za każdym razem, gdy ponownie uruchomię komputer.)

Author: Paul, 2010-03-11

3 answers

Możesz użyć stepi LUB nexti (które można skrócić do si lub ni), aby przejść przez swój kod maszynowy.

 93
Author: R Samuel Klatchko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-10 22:04:09

Zamiast gdb Uruchom gdbtui. Lub uruchom {[1] } za pomocą przełącznika -tui. Lub naciśnij C-x C-a po wpisaniu gdb. Teraz jesteś w trybie GDB TUI.

Wprowadź layout asm, aby utworzyć zespół wyświetlania górnego okna - będzie to automatycznie zgodne ze wskaźnikiem instrukcji, chociaż możesz również zmieniać ramki lub przewijać wokół podczas debugowania. Naciśnij C-x s , aby przejść do trybu SingleKey, gdzie run continue up down finish itd. są skracane do jednego klawisza, co pozwala przejść przez program bardzo szybko.

   +---------------------------------------------------------------------------+
B+>|0x402670 <main>         push   %r15                                        |
   |0x402672 <main+2>       mov    %edi,%r15d                                  |
   |0x402675 <main+5>       push   %r14                                        |
   |0x402677 <main+7>       push   %r13                                        |
   |0x402679 <main+9>       mov    %rsi,%r13                                   |
   |0x40267c <main+12>      push   %r12                                        |
   |0x40267e <main+14>      push   %rbp                                        |
   |0x40267f <main+15>      push   %rbx                                        |
   |0x402680 <main+16>      sub    $0x438,%rsp                                 |
   |0x402687 <main+23>      mov    (%rsi),%rdi                                 |
   |0x40268a <main+26>      movq   $0x402a10,0x400(%rsp)                       |
   |0x402696 <main+38>      movq   $0x0,0x408(%rsp)                            |
   |0x4026a2 <main+50>      movq   $0x402510,0x410(%rsp)                       |
   +---------------------------------------------------------------------------+
child process 21518 In: main                            Line: ??   PC: 0x402670
(gdb) file /opt/j64-602/bin/jconsole
Reading symbols from /opt/j64-602/bin/jconsole...done.
(no debugging symbols found)...done.
(gdb) layout asm
(gdb) start
(gdb)
 134
Author: ephemient,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-11 02:12:58

Najbardziej przydatną rzeczą, jaką możesz tutaj zrobić, jest display/i $pc, przed użyciem stepi, jak sugerowano już w odpowiedzi R Samuela Klatchko. Powoduje to, że gdb musi demontować bieżącą instrukcję tuż przed każdym wydrukowaniem znaku zachęty; wtedy możesz po prostu wcisnąć Enter, aby powtórzyć polecenie stepi.

(Patrz moja odpowiedź na inne pytanie Po Więcej Szczegółów-kontekst tego pytania był inny, ale zasada jest taka sama.)

 22
Author: Matthew Slattery,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:30