Tryby adresowania

https://chacker.pl/

W asemblerze można zastosować kilka metod, aby osiągnąć ten sam cel. W szczególności istnieje wiele sposobów wskazania efektywnego adresu, którym można manipulować w pamięci. Opcje te nazywane są trybami adresowania i są podsumowane w tabeli. Pamiętaj, że rejestry zaczynające się od „e” mają 32 bity (4 bajty), a te z literą „r” mają 64 bity (8 bajtów).

Wywołania systemowe: int, sysenter i syscall

https://chacker.pl/

Wywołania systemowe to mechanizm umożliwiający procesowi żądanie wykonania uprzywilejowanej operacji, gdy kontekst i wykonanie kodu zostaną przełączone z trybu użytkownika do trybu jądra. Starsza instrukcja x86 służąca do wywołania wywołania systemowego to int 0x80. Jest to uważane za przestarzałe, ale nadal jest obsługiwane w 32-bitowych systemach operacyjnych. Instrukcja sysenter jest jej następcą dla aplikacji 32-bitowych. W przypadku 64-bitowych systemów operacyjnych i aplikacji opartych na systemie Linux wymagana jest instrukcja syscall. Podczas pisania kodu powłoki i innych wyspecjalizowanych programów lub ładunków należy dobrze rozumieć różne metody wywoływania wywołań systemowych i ustawiania odpowiednich argumentów.

lea

https://chacker.pl/

Polecenie le ładuje efektywny adres źródła do miejsca docelowego. Można to często zaobserwować podczas przekazywania argumentu miejsca docelowego do funkcji kopiującej ciąg znaków, jak na przykład w poniższym przykładzie demontażu gdb w składni AT&T, w którym zapisujemy adres bufora docelowego na górę stosu jako argument funkcji gets:

call i ret

https://chacker.pl/

Instrukcja call przekierowuje wykonanie do innej funkcji. Adres pamięci wirtualnej po instrukcji wywołania jest najpierw odkładany na stos, pełniąc funkcję wskaźnika powrotu, a następnie następuje przekierowanie wykonania do wywoływanej funkcji. Polecenie ret jest używane na końcu procedury, aby powrócić do polecenia po wywołaniu.

 

xor

https://chacker.pl/

Polecenie xor wykonuje bitową logiczną fuankcję „wyłączną lub” (XOR), na przykład 11111111 XOR 11111111 = 00000000. Dlatego jedną z opcji jest użycie wartości XOR, wartości do wyzerowania lub wyczyszczenia rejestru lub lokalizacji pamięci. Innym powszechnie używanym operatorem bitowym jest AND. Moglibyśmy wykonać bitową operację AND, aby określić, czy konkretny bit w rejestrze lub lokalizacji pamięci jest ustawiony, czy nie, lub aby określić, czy wywołanie funkcji takiej jak malloc zwraca wskaźnik do fragmentu, a nie do wartości null. Można to osiągnąć za pomocą asemblera, takiego jak test eax, eax po wywołaniu malloc. Jeśli wywołanie malloc zwróci wartość null, wówczas operacja testowa ustawi „flagę zerową” w rejestrze FLAGS na 1. Ścieżka, po której następuje instrukcja skoku warunkowego, taka jak jnz, po tym teście, może być oparta na wyniku ORAZ operacja. Poniżej przedstawiono, jak będzie to wyglądało w złożeniu: