Wpis z mikrobloga

#programownie #cpp
Mam pytanie. Chciałem sprawdzić, w którym miejscu stosu funkcja func() otrzyma swoją ramkę. Nie znam adresu pod, który funkcja func() zostanie wrzucona na stos, dlatego stworzyłem zmienną a = 0xabababab, wyświetliłem jej adres, i udałem się w tamto miejsce na stosie. Teraz zakładam, że gdzieś w pobliżu na stosie powinien znaleźć się pointer na funkcję func(). Dlatego wyprintowałem też adres funkcji func(), którego na stosie nigdzie nie widzę. Dalej też go nie ma, bo stos jest pusty. Tak wiem, że mogą tą funkcję znaleźć bez problemu w IDA, ale chcę to zrobić krok po kroku... Nie widzę też na stosie wartości zwróconej przez funkcję func(). Nie krzyczcie za głupie pytania, nie jestem programistą.
T.....n - #programownie #cpp
Mam pytanie. Chciałem sprawdzić, w którym miejscu stosu...

źródło: comment_1641288833GPkhChDk52v6DYYGDyN9JU.jpg

Pobierz
  • 22
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@TheMoonTheMoon: adres funkcji to miejsce w kodzie, które jest niemutowalne. w momencie gdy jesteś w ciele func(), to rejestr EBP powinien wskazywać na "adres ramki". ale w zalezności od tego gdzie uruchomisz tę funkcję(w jakim stanie będzie stos), to ten EBP będzie mieć różne wartości
  • Odpowiedz
@MamCieNaHita: Okej, ale skąd program wie, w które miejsce pamięci w sekcji .text ma skoczyć do funkcji? Bo zakładam, że kod funkcji znajduje się w .text. Musi przecież gdzieś na stosie leżeć pointer na tą funkcję.
  • Odpowiedz
@TheMoonTheMoon: Jeśli to jest ta sama translation unit to kompilator to wie i po prostu wkleja adres funkcji, jeśli inna translation unit to kod jest relocable i robi to linker przy linkowaniu
  • Odpowiedz
@TheMoonTheMoon:

Nie widzę też na stosie wartości zwróconej przez funkcję func().

Wygenerowany kod masz tutaj. Wartosc z funkcji wraca w rejestrze *AX.

Bo zakładam, że kod funkcji znajduje się w .text. Musi przecież gdzieś na stosie leżeć pointer
  • Odpowiedz
@Feargan: chciałbym wiedzieć, gdzie znajdę miejsce, które bezpośrednio będzie prowadzić do kodu funkcji, ale już rozumiem, że na stosie tego nie znajdę, tylko siedzi to w rejestrach
  • Odpowiedz
@TheMoonTheMoon: jest tam też sposób, który @Passer93 sugerował, czyli zawołać jakąś dummy funkcję, a potem ściągnąć ze stosu adres powrotny dla niej. No i pewnie względem tego trzeba będzie przeliczyć adres, żeby dostać się do pierwszej interesującej nas instrukcji. W sumie to nie będzie trywialne, zwłaszcza jeżeli niejawnie przed właściwym kodem część rejestrów będzie zabezpieczana na stosie pushami.
  • Odpowiedz