Niedawno zacząłem używać GDB dla klasy i trochę się zmagałem. Mam an assignment gdzie mam zrobić Lab 1 ćwiczenie 2, który mnie potrzebuje, aby szukać dwóch luk w kodzie i wykonaj następujące czynności z nimi:uzyskać adres zwrotny GDB
Pierwszy musi nadpisać adres powrotu na stosie, a drugi musi zastąpić inną strukturę danych, której użyjesz do przejęcia kontroli nad przebiegiem programu.
Przepełniłem już strukturę danych, o czym myślę, że jest to EIP, które wskazuje na inne instrukcje, które zrobi.
Teraz, jak mogę dostać się do adresu zwrotnego (RET) ramy? Każda ramka, to nie ma znaczenia, po prostu chcę wiedzieć, jak mogę obliczyć bajty między RET i może ESP, więc mogę odjąć i uzyskać długość. Właśnie zacząłem od GDB, więc uspokój się na mnie.
Więc chcę nadpisać wskaźnik instrukcji (EIP)? To prowadzi mnie do innego pytania: nie rozumiem różnicy między EIP a RET. Czy EIP nie ma na celu wskazania, która instrukcja jest następna, a RET to zapisany adres, który program zapisał przed przejściem do funkcji? W jaki sposób RET i EIP odnoszą się do siebie nawzajem? – Joe
Tak, 'RET' jest przechowywanym' EIP'. Instrukcja 'call' zachowa adres następnej instrukcji na stosie. W funkcji epilogu instrukcja 'ret' będzie' pop' 'RET' ze stosu do rejestru' EIP'. Kiedy nadpisujesz "RET", jest to moment, w którym zyskasz kontrolę nad przebiegiem programu. Możesz przeczytać więcej o funkcji pro- i epilogu tutaj: https://en.wikipedia.org/wiki/Function_prologue – mofoe
@Joe, czy to była odpowiedź na twoje pytanie? – mofoe