Pytanie:
Lepsze wyjaśnienie różnych odmian połączeń x86 CALL
k0ng0
2013-05-03 20:50:35 UTC
view on stackexchange narkive permalink

Mam nadzieję na lepsze wyjaśnienie instrukcji call x86. Rozumiem wezwanie blisko i wzywam daleko. Ale nie rozumiem w pełni części segmentowej. Trochę wglądu w mój główny problem, patrzę na plik binarny w IDA, a jego kod startowy to:

  push 0xdeadbeefcall w pobliżu 0xdeadbeef  
To jest bardzo kod 1337, jeśli zawiera on martwą wołowinę;)
Dwa odpowiedzi:
Ange
2013-05-03 21:12:16 UTC
view on stackexchange narkive permalink

99% wywołań, które napotkasz we współczesnych plikach binarnych, jest blisko.

  • wywołań blisko (z opcode E8 ) jest połączeniem względnym w stosunku do bieżącego adresu i ma wpływ tylko na ? IP . W ten sposób doda operand (słowo lub słowo podwójne) do następnego wskaźnika instrukcji. to dodanie operandu do ?IP
  • wywołania daleko (z opcode 9A ) skoki do bezwzględnego segmentu i przesunięcia. tj. jest to jak ustawienie CS i ? IP jednocześnie.

Pamięć jest w rzeczywistości zorganizowana w segmenty. We współczesnych systemach operacyjnych zwykle nie mieszasz się z segmentami ( CS ma stałą wartość w trybie użytkownika i trybie jądra), więc nie zmieniasz ich z żadnego powodu.

Rzadkie przypadki rzeczywistych zmian w segmencie to anty-debugowania lub bałagan z trybami 32 / 64b

Czy to nie jest związane z funkcjami C [setjmp / lngjmp] (http://en.wikipedia.org/wiki/Setjmp.h) (zobacz ten [tutorial] (http://web.eecs.utk.edu/ ~ huangj / cs360 / 360 / notes / Setjmp / lecture.html))?
@perror: AFAIK nie bezpośrednio.
nie, „długi” w znaczeniu „longjmp” nie ma nic wspólnego ze skokiem w dal.
peter ferrie
2013-05-05 08:10:44 UTC
view on stackexchange narkive permalink

Segment to „okno” do sekcji pamięci. Możesz zamapować całą pamięć lub jej część na pojedynczy segment, a wiele segmentów może mieć nakładające się widoki tej samej pamięci. Dalekie wywołanie lub przeskok umożliwiają poruszanie się między tymi oknami lub w ich obrębie. Bliskie wywołanie lub skok umożliwia poruszanie się tylko w bieżącym oknie.

Jedyną różnicą między wywołaniem a skokiem jest to, że wywołanie zapisuje adres zwrotny na stosie. W przypadku wywołania dalekiego selektor powrotu jest również zapisywany na stosie.

Jednak w Twoim pytaniu brakuje wystarczających szczegółów, co dokładnie chcesz wiedzieć.

w jaki sposób segment pamięci połączeń określony w opkodzie, np. `E8 D2 12 00 00 call sub_402390` w jaki sposób 000012D2 ma się do 402390? Tam się zgubiłem.
12D2 jest dodawane do adresu pamięci natychmiast po zakończeniu instrukcji, więc instrukcja wywołania kończy się na 4010BE + 12D2 = 402390.


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...