Co je počáteční hodnota `ESP`?

0

Otázka

V rámci Visual Studio masm:

    mov ecx,270
l1: pop eax
    loop l1
    push eax

Smyslem tohoto kodexu je, aby zjistil, jestli tam je a co je počáteční hodnota ESP. Snažím se pop ihned po spuštění programu, a experiment, který po kolika pop a push vytvoří nějaké čtení paměti související chyba. Výsledkem experimentu je nějak nestabilní, a to i s přesně stejné číslo ecx. Obecně platí, že větší než 512 bude vždy(v mé omezené časy experimentů) vytvořit chybu, méně než 128 je vždy "bezpečný", a hodnoty kolem 250 až 400 bude někdy způsobit chyby. Zdá se, že neexistuje žádná výchozí hodnota pro ESP. Pokud tam je, můj experiment by měl vytvořit nějaký stabilní výsledek.

OK jsem spustit 127 pro dalších 10 krát, a teď je začít k havárii. Snažím se experimentovat více čísel.

Řekněme, že pomocí Windows-x86, na průměrné okamžiku spuštění programu, jako je můj experiment programu. Jak Windows určit, jaký bude počáteční hodnota esp? Je to obtížné určit(protože jsem si dokázal představit, jednoduše řečeno poslední adresa zásobníku segement v esp)? Je tam běžná praxe, jak na to?

assembly masm stack-pointer windows
2021-11-23 19:25:23
1

Nejlepší odpověď

0

Počáteční hodnota je tam, kde OS dát na stack v procesu virtuální adresový prostor. V moderní operační systémy je náhodné.

Co je nad horní části zásobníku na _start je závislá na architektuře. V systému Windows, můžete získat skutečný návrat adresu, na něco, co ukončí aktuální vlákno. Na Linuxu, dostanete příkazové řádky a proměnné prostředí. V každém případě, objevovat věci ze zásobníku, které vás neměl tlačit nebude ABI kompatibilní a bude se dostanete do potíží. Jediná pravidla, která zůstávají v tomto bodě jsou bezpečnostní pravidla.

2021-11-23 21:14:17

Takže celkově, tam SKUTEČNĚ je někdo/něco, co má rozhodnout, a inicializovat ESP pro každý program, tak programátor nemůže upravit ESP v nebezpečným způsobem(jako poping na začátku programu). A podle mého experimentu, tato hodnota by měla být velmi blízko k dolní části zásobníku(méně než 512*4= 2KB). Co je obsaženo v zásobníku na začátku se může změnit v jinou dobu, když je program načten/souvisí, a to jsou některé informace, které OS potřeba. Programátor by měl zvážit počáteční hodnotu, že OS přidělena jako na začátku(spodní) zásobník. Můžeme uzavřít, jako je tento
Zackham

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................