Otázka:
Zobrazení rámečku zásobníku funkcí IDA Pro
PSS
2013-06-19 07:00:31 UTC
view on stackexchange narkive permalink

IDA Pro zobrazuje určité vyrovnávací paměti nebo výplně nad (na nižších adresách) lokální proměnné v zobrazení rámce zásobníku. Například:

Příklad 1.
Následující snímek obrazovky zobrazení rámce zásobníku zobrazuje 12 bajtů (obsažených v červeném poli) vyrovnávací paměti:

enter image description here

Příklad 2.
Následující snímek obrazovky s jiným zobrazením rámce zásobníku opět ukazuje vyrovnávací paměť 12 bajtů:

enter image description here

Chápu, že jej IDA označil jako db?; undefined protože nemohl přijít na to, jak byl použit. Také si uvědomuji, že IDA automaticky vypočítává velikost rámce zásobníku sledováním ESP. Předpokládal bych, že by to mohlo mít něco společného s nevolnou oblastí uložení registru. V Příkladu 1 však jasně ukazuje Uložené regs: 0 a v Příkladu 2 ukazuje Saved regs: 4 . Jsem zmatený a tady jsou moje otázky:

Proč IDA Pro zobrazuje určité vyrovnávací paměti nebo výplně nad (na nižších adresách) lokální proměnné v zobrazení rámce zásobníku? Je náhoda, že oba pohledy zobrazují přesně 12 bajtů vyrovnávací paměti? Je to něco konkrétního pro určitou konvenci volání nebo pro dodržování předpisů?

Kompilátor možná přidává výplň zásobníku kvůli výkonu (zarovnání paměti) nebo kvůli prevenci přetečení, ale ty se nezobrazují tak pěkně. Můžete ukázat demontovaný kód funkce?
Přidejte pokyny prolog funkce.
Tři odpovědi:
Jason Geffner
2013-06-19 07:58:24 UTC
view on stackexchange narkive permalink

IDA sleduje hodnotu ukazatele zásobníku (ESP) během statické analýzy celé funkce. Největší záporná hodnota ESP (vzhledem k začátku funkce) se používá k určení velikosti rámce zásobníku.

Pokud jde o to, proč odeslané rámce zásobníku mají v horní části „nedefinované“ bajty, je to proto, že IDA nemohla automaticky určit, zda a jak byly tyto kompenzace zásobníku použity.

Mockrát vám děkuji za odpověď. Uvědomuji si všechno, co jste zmínil. Neřeší však mé otázky. Upřesnil jsem své otázky. Doufejme, že je to trochu jasnější a mohli byste mi s tím pomoci.
PSS
2013-06-19 19:27:56 UTC
view on stackexchange narkive permalink

Všem moc děkuji za odpovědi a komentáře. Při čtení vašich komentářů a přípravě na aktualizaci mé otázky jsem našel odpověď.

Musím uznat Igor Skochinsky, který mě požádal o poskytnutí pokynů prologu funkcí. Obě funkce používají konvenci volání cdecl. Konvence volání však s touto vyrovnávací pamětí nemá nic společného. Takto vypadá prolog:

  push ebpmov ebp, espsub esp, <size místních vars>push ebxpush esipush edi  

Tato vyrovnávací paměť odráží tři push pokyny pro registry EBX, ESI, EDI. Tyto registry jsou kategorizovány jako Callee Saved Registers a tento „buffer“ se nazývá Non-Volatile Register Save Area .

V souladu s konvencí x86 (platí také pro x64) se registry dělí na registry uložené volajícím a registry uložené na Callee .

Registry volajícího jsou také známé jako těkavé registry. Jedná se o základní registry CPU, jako jsou EAX, EDX a ECX. Volací funkce (Caller) je zodpovědná za uložení těkavých registrů do obvykle běhového zásobníku před uskutečněním hovoru.

Registry uložené v databázi Callee jsou známé jako energeticky nezávislé registry. Jedná se o základní registry CPU, jako jsou EBX, ESI, EDI, ESP a EBP. Podle konvence se předpokládá, že hodnoty v těchto registrech budou zachovány volanou funkcí. V případě, že některý z energeticky nezávislých registrů bude použit v rámci volaného, ​​je volaný odpovědný za uložení registrů do běhového zásobníku. Kromě toho je volaný odpovědný za obnovení těchto registrů před návratem k funkci volajícího.

Způsob, jakým se používají volatilní a energeticky nezávislé registry, je spíše kompilátorem. Následující příspěvek Průvodce sestavením x86 popisuje pravidla volajícího a volaného podrobněji.

nomilk
2013-06-19 15:26:44 UTC
view on stackexchange narkive permalink

Screenshoty ukazují, že u zkoumáte podrobné zobrazení zásobníku IDA.

IDA pojmenuje každý bajt, ke kterému se přistupuje přímo ve funkci, všechny ostatní bajty zůstávají nedefinované.

Konference o volání? Dejte nám prolog a epilog tohoto podprogramu, abychom viděli, jak je zásobník přidělen a vyčištěn.

Takže pokud se jedná o rámec zásobníku normální aplikace napsaný v jazyce vysoké úrovně (ne malware ani napsaný) v sestavě ručně) a nevolání konkrétní konvence, pak si myslím, že můžeme souhlasit s tím, že kompilátor z nějakého důvodu přidělil více prostoru zásobníku, než tato funkce potřebuje.

Nemyslím si, že je „nutné“ vědět proč překladač to udělal, ale je to vaše volba.

Děkujeme za váš příspěvek. Vím, o jakou konvenci volání jde. Na to se neptám. Chtěl bych vědět, jestli tento konkrétní buffer souvisí s určitou konvenci volání? Aktualizuji svoji otázku, abych to objasnil.
@PSS Nevidím svou odpověď vysvětlující, co je konvence volání, ale pokud jste natolik laskaví, že nám poskytnete prolog a epilog tohoto podprogramu, abychom zjistili, zda jde o konvenci volání, nebo ne, můžeme vám pomoci vy.
Odpověď jsem již poskytl. Děkujeme za váš příspěvek.


Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...