Přidávám do svého linuxového debuggeru funkci (používám Ptrace k manipulaci s vysledovaným procesem i libbfd / libopcodes), abych odvinul zásobník a určil, zda existují nesrovnalosti mezi přiděleným prostorem zásobníku pro každý CALL a staticky odvozeným místní proměnná velikost, tisk adresy a velikosti lokálního zásobníku každého rámce po cestě.
Moje obecná metodika je převzít adresu v základním ukazateli (EBP / RBP), přírůstek ukazatele by měl obsahovat ukazatel uloženého rámce, dereference této adresy, prozkoumejte ji pomocí PTRACE_PEEKDATA a opakujte, dokud neodradím adresu zabírající oblast mimo zásobník.
Vím, jak zkontrolovat registry segmentů kódu / dat, ale ideálně bych jako metoda ke kontrole, zda jsem stále uvnitř callstacku, i když byla segmentace změněna stránkami paměti W ^ X nebo jinak neproveditelným zásobníkem.
Stručně řečeno, jak mohu zkontrolovat (obecně případ), když jsem se přestěhoval mimo zásobník, aniž bych spustil poruchu obecné ochrany?
(Kromě toho si uvědomuji, že pracuji na předpokladu, že kontrola segmentu stránky adresy je zde ideální metodikou - možná existuje další jednodušší metoda k určení, zda je adresa v prostoru zásobníku aktuálního procesu)