2015-09-02 16 views
5

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.

Odpowiedz

8

Teraz, jak mogę dostać się do adresu zwrotnego (RET) ramy?

Aby uzyskać lokalizację zapisanego adresu zwrotnego określonej funkcji, można umieścić punkt przerwania w tej funkcji i użyć polecenia info frame.

Oto przykład:

gdb /path/to/binary 
(gdb) br main 
(gdb) run 
Starting program: /path/to/binary 

Breakpoint 1, 0x08048480 in main() 
(gdb) info frame 
Stack level 0, frame at 0xffffd700: 
eip = 0x8048480 in main; saved eip = 0xf7e3ca63 
Arglist at 0xffffd6f8, args: 
Locals at 0xffffd6f8, Previous frame's sp is 0xffffd700 
Saved registers: 
ebp at 0xffffd6f8, eip at 0xffffd6fc 

Zanotuj saved eip = 0xf7e3ca63 i eip at 0xffffd6fc. W tym przypadku będziesz chciał nadpisać wartość na 0xffffd6fc, aby po powrocie funkcji wykonanie było kontynuowane z wartością tam zapisaną.

+0

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

+1

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

+0

@Joe, czy to była odpowiedź na twoje pytanie? – mofoe