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:

Podstawy języka asemblera

https://chacker.pl/

Chociaż na temat języka ASM napisano całe książki, możesz z łatwością opanować kilka podstaw, aby stać się bardziej skutecznym etycznym hakerem.

Maszyna kontra assembler  kontra C

Komputery rozumieją tylko język maszynowy, czyli wzór składający się z jedynek i zer. Z drugiej strony ludzie mają problemy z interpretacją dużych ciągów jedynek i zer, dlatego asembler został zaprojektowany, aby pomóc programistom posługującym się mnemonikami w zapamiętaniu serii liczb. Później zaprojektowano języki wyższego poziomu, takie jak C i inne, które jeszcze bardziej oddalają ludzi od jedynek i zer. Jeśli chcesz zostać dobrym etycznym hakerem, musisz oprzeć się trendom społecznym i wrócić do podstaw w zakresie assemblera.

Rejestry

https://chacker.pl/

Rejestry służą do tymczasowego przechowywania danych. Pomyśl o nich jak o szybkich fragmentach pamięci o długości od 8 do 64 bitów, które będą wykorzystywane wewnętrznie przez procesor. Rejestry można podzielić na cztery kategorie (rejestry 32-bitowe są poprzedzone literą E, a rejestry 64-bitowe są poprzedzone literą R, tak jak w EAX i RAX). Są one wymienione i opisane w Tabeli .

Procesory Intela

https://chacker.pl/

Istnieje kilka powszechnie używanych architektur komputerów. W tym rozdziale skupimy się na rodzinie procesorów lub architekturze Intel. Termin architektura odnosi się po prostu do sposobu, w jaki konkretny producent zaimplementował swój procesor. Architektury x86 (32-bitowe) i x86-64 (64-bitowe) są nadal najczęściej używane, a inne architektury, takie jak ARM, rozwijają się każdego roku. Każda architektura wykorzystuje unikalny zestaw instrukcji. Instrukcje z jednej architektury procesora nie są rozumiane przez inny procesor.

Składanie fragmentów pamięci w całość

https://chacker.pl/

Teraz, gdy znasz już podstawy, przyjrzymy się prostemu przykładowi ilustrującemu użycie pamięci w programie.

memory.c

Najpierw wylistujemy zawartość programu za pomocą cat:

Ten program niewiele robi. Po pierwsze, kilka fragmentów pamięci jest alokowanych w różnych sekcjach pamięci procesu. Kiedy wykonywana jest funkcja main (1), wywoływana jest funkcja funct1() z argumentem 1 (2) . Po wywołaniu funkcji funct1() argument jest przekazywany do zmiennej funkcji o nazwie c (3) . Następnie przydzielana jest pamięć na stercie dla 10-bajtowego ciągu zwanego str (4). Na koniec 5-bajtowy ciąg „abcde” jest kopiowany do nowej zmiennej o nazwie str (5) . Funkcja kończy się, a następnie program main() (6).