棧基礎知識

1.C語言變量的分布 :

C 語言有全局變量(Global)冀墨、本地變量(Local)闸衫,靜態(tài)變量(Static)、寄存器變量(Regeister)诽嘉。每種變量都有不同的分配方式蔚出。先來看下面這段代碼:

#include <stdio.h> 
int g1=0, g2=0, g3=0; 
int main() 
{ 
static int s1=0, s2=0, s3=0; 
int v1=0, v2=0, v3=0; 

//打印出各個變量的內(nèi)存地址 

printf("0x%08x\n",&v1); //打印各本地變量的內(nèi)存地址 
printf("0x%08x\n",&v2); 
printf("0x%08x\n\n",&v3); 
printf("0x%08x\n",&g1); //打印各全局變量的內(nèi)存地址 
printf("0x%08x\n",&g2); 
printf("0x%08x\n\n",&g3); 
printf("0x%08x\n",&s1); //打印各靜態(tài)變量的內(nèi)存地址 
printf("0x%08x\n",&s2); 
printf("0x%08x\n\n",&s3); 
system("pause");
return 0; 
} 

可以看出本地變量和全局/靜態(tài)變量的分布完全不同弟翘,相差甚遠,這是因為他們分布在不同類型的區(qū)域骄酗。
進程的內(nèi)存空間分為:代碼區(qū)稀余,靜態(tài)數(shù)據(jù)區(qū)和動態(tài)數(shù)據(jù)區(qū)。全局和靜態(tài)變量分配在靜態(tài)數(shù)據(jù)區(qū)趋翻,本地變量分配在動態(tài)數(shù)據(jù)區(qū)睛琳,即”堆棧“踏烙,


image

2. 棧的存儲

    #include <stdio.h> 
    void __stdcall func(int param1,int param2,int param3) 
    { 
    int var1=param1; 
    int var2=param2; 
    int var3=param3; 
    printf("0x%08x\n",&parameter1); //打印出各個變量的內(nèi)存地址 
    printf("0x%08x\n",&parameter2); 
    printf("0x%08x\n\n",&parameter3); 
    printf("0x%08x\n",&var1); 
    printf("0x%08x\n",&var2); 
    printf("0x%08x\n\n",&var3); 
    return; 
    } 
    int main() 
    { 
    func(1,2,3); 
    return 0; 
    } 
image

函數(shù)的參數(shù)是從右向左傳遞师骗,即先壓棧parameter 3,然后parameter 2讨惩,最后才是parameter 1辟癌,然后是函數(shù)的返回地址,然后就是本地變量var1步脓,var2,var3

3.程序進入main()函數(shù) 愿待,棧幀的保存和關閉

例如:

int main()
{
return0;
}
匯編代碼為:
push ebp;   保存進入main()函數(shù)時其他初始化函數(shù)的棧底
move ebp,esp; 把當前esp的值作為棧底
sub esp ,40h 開辟椦セ迹空間仍侥,作為局部變量的存儲空間
push ebx
push  esi
push  edi  保存寄存器的值
LEA edi ,[ebp-40h]  取出此函數(shù)可用棧空間首地址  
mov ecx,10h            設置ecx寄存器的值
mov eax ,occcccccch  把局部變量初始化為0xcccccccch
rep stos  dword ptr [edi]   根據(jù)ecx的值鸳君,把eax的內(nèi)容农渊,以四字節(jié)為單位寫到edi指向的內(nèi)存
xor eax,eax    設置返回值為0
pop  edi  
pop esi
pop ebx   彈出壓入寄存器的值
add esp,40h  降低esp,局部空間釋放
cmp ebp,esp 檢查棧平衡
call _chkesp()  進入棧錯誤檢查函數(shù)
mov esp.ebp  還原esp
pop ebp         還原ebp
ret

4. 簡單的分配棧幀及溢出修改相鄰變量

例如:

    #include <windows.h>
     
    #define PASSWORD "1234567"
     
    int verify_password(char *password){
        int authenticated;
        char buffer[8];
        authenticated = strcmp(password,PASSWORD);
        strcpy(buffer,password);
        return authenticated;
    }
     
    int main(int argc, char* argv[])
    {
        int valid_flag = 0;
        char password[1024];
        FILE *fp;
        if (!(fp=fopen("password.txt","rw+"))){
            return 0;
        }
        fscanf(fp,"%s",password);
        valid_flag = verify_password(password);
        if(valid_flag){
            printf("incorrect password!\n");
        }else{
            printf("Congratulation! You have passed the verification !\n");
        }
        Sleep(-1);
        return 1;
    }

用OD調(diào)試:
進入main()主函數(shù),找到驗證密碼的函數(shù)調(diào)用位置或颊,進入到函數(shù)具體代碼處:


image

image

image

前面部分就是棧分配局部變量空間和初始化的過程砸紊,然后就是字符串的計較,最后是字符串的復制囱挑,分析可得棧溢出在這一部分醉顽,在指令008D1409處把函數(shù)的返回值(EAX儲存的是返回值)存在了EBP-0XC處,下面就是strocpy的操作平挑,char buffer[8]分配了八個字節(jié)的存儲空間游添,但是password.txt的密碼如圖為24個字節(jié),知錯執(zhí)行strcpy的時候通熄,把buffer 附近的變量空間也給覆蓋了唆涝,比如返回值的。以上過程如圖所示


image

image

image
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唇辨,一起剝皮案震驚了整個濱河市廊酣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赏枚,老刑警劉巖亡驰,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晓猛,死亡現(xiàn)場離奇詭異,居然都是意外死亡凡辱,警方通過查閱死者的電腦和手機鞍帝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煞茫,“玉大人,你說我怎么就攤上這事摄凡⌒眨” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵亲澡,是天一觀的道長钦扭。 經(jīng)常有香客問我,道長床绪,這世上最難降的妖魔是什么客情? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮癞己,結果婚禮上膀斋,老公的妹妹穿的比我還像新娘。我一直安慰自己痹雅,他們只是感情好仰担,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绩社,像睡著了一般摔蓝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上愉耙,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天贮尉,我揣著相機與錄音,去河邊找鬼朴沿。 笑死猜谚,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的悯仙。 我是一名探鬼主播龄毡,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锡垄!你這毒婦竟也來了沦零?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤货岭,失蹤者是張志新(化名)和其女友劉穎路操,沒想到半個月后疾渴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡屯仗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年搞坝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魁袜。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡桩撮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峰弹,到底是詐尸還是另有隱情店量,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布鞠呈,位于F島的核電站融师,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蚁吝。R本人自食惡果不足惜旱爆,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窘茁。 院中可真熱鬧怀伦,春花似錦、人聲如沸庙曙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捌朴。三九已至吴攒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砂蔽,已是汗流浹背洼怔。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留左驾,地道東北人镣隶。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像诡右,于是被迫代替她去往敵國和親安岂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結構(3).初始化時...
    歐辰_OSR閱讀 29,405評論 8 265
  • 聽過你的一首歌帆吻。 粵語不太聽得懂域那。只會一句。 沉默是金猜煮。陳默是缸次员。 聽說過你的電影败许,但覺得你的演技不及張學友,沒怎...
    葉耶燁閱讀 161評論 0 0
  • 點上方綠標即可收聽主播維維朗讀音頻 ◆◆◆ 文 | 朱侃侃 跟朋友在外面擼串带迟,他突然問我:“你猜甥桂,這間店,一個月能...
    朱侃侃zkk閱讀 240評論 0 0
  • 下午與團隊成員的溝通體驗: Kate:偏發(fā)動機能量邮旷,生性開朗樂觀,充滿創(chuàng)意和靈感蝇摸,喜歡做自己感興趣的事情婶肩,思維發(fā)散...
    快樂的老露閱讀 314評論 0 0
  • 青春,奮斗貌夕。 篝火升起的時候律歼,把年輪點燃,讓一絲生活的甜蜜啡专,都在苦樂中盡情綻放险毁。 歲月如風,是誰深埋泥土们童,透支著淚...
    布瓜先生閱讀 285評論 3 6