Wskaźnik instrukcji EIP - x86

0

Cześć,

Podczas nauki do kolokwium z Architektury Komputerów (PG ETI) natknąłem się na poniższe zadanie:

"Podać sekwencję rozkazów (zawierającą rozkaz RET), której wykonanie spowoduje załadowanie do wskaźnika instrukcji EIP liczby 456"

Pierwszą moją odpowiedzią było: "Jak liczbę do EIP?? Nie da się przez brak bezpośredniego dostępu do tego rejestru". Ale później pomyślałem nad "bezpośredniego".. Czyli jakoś pośrednio można? Czy polega to na tym, aby zapisać coś na stos (push ebp; mov ebp,esp), a potem na przykład wykonać skok (jmp) do ESP?

Czy w ogóle można wykonać skok do rejestru?

Pozdrawiam,
Patryk

4

@honda1591 nie możesz wykonać skoku do rejestru, ale oczywiście możesz skoczyć pod adres. Masz nawet podpowiedź żeby użyc ret. Tak się często exploituje programy -> porzez nadpisanie adresu powrotu z funkcji.
Pomysl co sie dzieje kiedy program dochodzi do słowa ret. Program myśli ze należy wrócić z aktualnie wykonywanej funkcji. A gdzie wraca? Pod adres który zapisał sobie na stosie wchodząc do tej funkcji. Więc ret powoduje pobranie ze stosu adresu powrotu a następnie skok pod ten adres. Jeśli więc zapiszesz sobie na stosie jakąś śmieszną wartość a potem zrobisz ret to pod ten adres skoczysz.

1

By stało się zadość (implementacja Shalom'a):

; kompilator NASM

[BITS 32]
	push	0x00000456
	ret

	; w rejestrze EIP znajdzie się wartość 456(heksadecymalnie)

	; lub
[BITS 32]
	push	456
	ret

	; w rejestrze EIP znajdzie się wartość456 (decymalnie)

1 użytkowników online, w tym zalogowanych: 0, gości: 1