Murat ERDEM - Personal Research Blog




Assembly Programing - 0x07: Stack

August 27, 2020

Assembly ve tersine mühendislikte en çok karşımıza çıkan kavramlardan biri stack kavramıdır. Bu yazımızda stack konusunu ele alacağız.

Stack Nedir?

Stack veri depolamak için ayrılmış FILO (ilk giren son çıkar) mantığı ile çalışan bellek alanıdır. SS başlangıç noktasını gösterir, SP ise son verinin adresini. BP stackta o fonksiyonun verilerinin tutulmaya başlandığı taban adresi gösterir.

Yukarıdaki resimde görüldüğü gibi bir veri push edildiğinde stack içerisine koyulur ve sp son veriyi gösterir. pop edildiğinde ise son koyulan geri alınır.

Stack kullanırken 32 bitlik bir veri push yada pop edeceğimizde adreslerde 32 bitlik oynama olur, 16 bitlik veri push yada pop ediyorsak 16 bitlik bir oynama olur. Bir adreste 8 bitlik veri tutulduğunu unutmayalım.

Stack yapısında adresleme işlemlerinde stack segmentin başlangıç adresinden itibaren azalarak gider. Buna örnek olarak yukarıdaki resimde ss başlangıç değeri 710:0000 dur. daha sonra programın başlangıcı sırasında bazı değerler push edilmiş ve son durumda sp değeri hekzadecimal 20 değerini göstermiştir daha sonra 11h değerini stacka push edersek sp değeri hekzadecimal 2 azaltılacaktır ve 1E olacaktır. aynı şekilde pop edersek sp değeri 16 bitlik değer tutacak şekilde artar. şekilde 11h, 12h, 13h push edilip daha sonra bir adet pop işlemi uygulandığında ok ile işaret edilen nokta sp nin gösterdiği adrestir. Burada pop işleminden sonra stacteki değerin korunduğuna dikkat edelim.

PUSH

Operand olarak verilen değeri stacka atar ve sp değerini verilen kendine uygun olarak azaltır. Eğer operan 32 bitlik bir register ise esp-4 yapacaktır. eğer 16 bitlik register yada bir değerse sp-2 yapacaktır.

       
    
        push eax
        push ax
        push 11h
        push 1111h
    

POP

Hedef olarak belirtilen registere stackteki son değeri alıp sp değerini arttıracaktır. Eğer register 32 bitlik bir register ise ESP+4, değilse sp+2 olarak arttırma işlemi yapılır.

       
    
        pop eax
        pop ax
    

PUSHA

16 bitlik tüm registerleri stacka push eder sadece sp değerini push etmez bunun nedeni sp her register push edildiğinde değerinin değişmesidir. Bunun yerine push işlemi başlamamdan sp değerini kaydederek gerekli push işlemlerini yapar.

       
    
        pusha
    

POPA

sp haricindeki tüm register değerlerinin stactan alınmasını sağlar.

       
    
        popa
    

PUSHAD

popa komutu gibidir farkı ise 32 bitlik registerler için çalışmasıdır.

       
    
        pushad
    

POPAD

popa komutu gibi çalışmaktadır. farkı 32 bitlik registerleri için çalışır.

       
    
        popad
    

PUSHF

Bu komut flag registerinin ilk 16 bitlik kısmını stack içerisine atmayı sağlar.

       
    
        pushf
    

POPF

Bu komut flag registerinin lsb biti tarafındaki 16 bitlik kısmına stacktan değer çekmeyi sağlar.

       
    
        popf
    

PUSHFD

pushf ile aynı işlemi yapar farkı ise 32 bitlik flag registerinin tamamını yığına atmasıdır.

       
    
        pushfd
    

POPFD

popf ile aynı işlemi yapar farkı 32 bitlik flag registerinin tamamını stacktan çeker.

       
    
        popfd