Pierwszy ruch jest kopiowany z przesunięcia odsunięcia względem rejestru segmentu [e] DS. Drugi mov zapisuje offset foo do lokalizacji danych względem rejestru DS. Jeśli CS i DS są przypadkowe, to można to zignorować. Zakładając, że CS i DS są przypadkowe, najprawdopodobniej natkniesz się na różne mechanizmy ochrony, które renderują sekcje kodu tylko do odczytu.
RE followups:
- Etykieta isnt jak odniesienie - dont dereference jako takie. Asembler zastępuje liczbę reprezentującą lokalizację w wynikowym kodzie. Możesz załadować adres lub adres podany w adresie. [I] wskazuje na dereferencje - w pierwszej odpowiedzi naprawiłem dezorientujący element, aby to uwzględnić. IOW robi [goo] ładuje rzeczy pod tym adresem.
- Zestaw instrukcji CISC podobnie jak x86 zawiera instrukcje o bardzo dużej długości - niektóre nawet nie są wielokrotnością długości słowa. RISC zazwyczaj starają się to zmienić, aby instrukcje dekodowania były prostsze.
- 3 - modyfikujesz tylko pierwsze 4 bajty z
mov eax, 2
(które, z powodu małego kodowania endian, zostają zastąpione 4, ale potem zostają nadpisane przez następną instrukcję, która w ogóle nie została zmodyfikowana - 5 nigdy nie jest w obrazek jako kandydat (myślałem, że myślisz, że kod zostanie uporządkowany w sposób, w jaki zadałeś to pytanie [1], chociaż wyraźnie wiesz o wiele więcej, jak powinienem odgadnąć z twojego przedstawiciela: P)]).
Należy pamiętać, że wszystko to zakłada, że CS = DS i DEP isnt intensywniejszej w.
Ponadto, jeśli uzywasz BX zamiast EBX, ten rodzaj rzeczy, które były oczekujących będzie wchodzić w grę (za pomocą xX zamiast ExX uzyskuje dostęp do niskich 2 bajtów rejestru [i xL uzyskuje dostęp do najniższego bajtu])
[1] Pamiętaj, że asembler jest czystym narzędziem do pisania opkodów - takich jak etykiety itp. Wszystko sprowadza się do liczby itp. z bardzo małą magią lub imponującymi przekształceniami kodu - nie ma tam zamknięć ani niczego głębszego z natury. (Jest to nieco upraszczając - kod może być przenoszone, a w wielu przypadkach fixups się zastosować do zwyczajów offsetu przez połączenie z łącznikiem i ładowarka)
Wygląda to tak się dzieje do pracy, ponieważ nie są one w pełnym 32-bitowych i ilości ostatni bajt będzie zawsze wynosił 0. Ten kod zakończy się niepowodzeniem, jeśli spróbujesz czegoś takiego jak mov, eax 0xC000000 – Michael
"przynieś cztery bajty" było tym, czego szukałem. dzięki! –