亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

淺析C語言編程中的數組越界問題

2020-01-26 14:49:27
字體:
來源:轉載
供稿:網友

因為C語言不檢查數組越界,而數組又是我們經常用的數據結構之一,所以程序中經常會遇到數組越界的情況,并且后果輕者讀寫數據不對,重者程序crash。下面我們來分析一下數組越界的情況:
1) 堆中的數組越界

因為堆是我們自己分配的,如果越界,那么會把堆中其他空間的數據給寫掉,或讀取了其他空間的數據,這樣就會導致其他變量的數據變得不對,如果是一個指針的話,那么有可能會引起crash

2) 棧中的數組越界

因為棧是向下增長的,在進入一個函數之前,會先把參數和下一步要執行的指令地址(通過call實現)壓棧,在函數的入口會把ebp壓棧,并把esp賦值給ebp,在函數返回的時候,將ebp值賦給esp,pop先前棧內的上級函數棧的基地址給ebp,恢復原棧基址,然后把調用函數之前的壓入棧的指令地址pop出來(通過ret實現)。

棧是由高往低增長的,而數組的存儲是由低位往高位存的 ,如果越界的話,會把當前函數的ebp和下一跳的指令地址覆蓋掉,如果覆蓋了當前函數的ebp,那么在恢復的時候esp就不能指向正確的地方,從而導致未可知的情況,如果下一跳的地址也被覆蓋掉,那么肯定會導致crash。

-------------------------

 壓入的參數和函數指針

-------------------------

                        aa[4]

                        aa[3]

合法的數組空間   aa[2]

                        aa[1]

                        aa[0]

-------------------------

 

###sta.c###

#include <stdio.h>void f(int ai){int aa[5]={1,2,3};int i = 1;for (i=0;i<10;i++) aa[i]=i;printf("f()/n");}void main(){f(3);printf("ok/n");}  ###sta.s###     .file  "sta.c"                 ;說明匯編的源程序    .section    .rodata           ;說明以下是只讀數據區.LC0:    .string "f()"                  ;"f()" 的類型是string,地址為LC0    .text                       ;代碼段開始.globl f                         ;f為全局可訪問    .type  f, @function            ; f是函數f:    pushl  %ebp    movl  %esp, %ebp    subl  $40, %esp    movl  $0, -24(%ebp)    movl  $0, -20(%ebp)    movl  $0, -16(%ebp)    movl  $0, -12(%ebp)    movl  $0, -8(%ebp)    movl  $1, -24(%ebp)    movl  $2, -20(%ebp)    movl  $3, -16(%ebp)    movl  $1, -4(%ebp)    movl  $0, -4(%ebp)    jmp   .L2.L3:    movl  -4(%ebp), %edx    movl  -4(%ebp), %eax    movl  %eax, -24(%ebp,%edx,4)    addl  $1, -4(%ebp).L2:    cmpl  $9, -4(%ebp)    jle   .L3    movl  $.LC0, (%esp)    call  puts    leave    ret    .size  f, .-f                     ;用以計算函數f的大小    .section    .rodata.LC1:    .string "ok"    .text.globl main    .type  main, @functionmain:    leal  4(%esp), %ecx    andl  $-16, %esp    pushl  -4(%ecx)    pushl  %ebp    movl  %esp, %ebp    pushl  %ecx    subl  $4, %esp    movl  $3, (%esp)    call  f    movl  $.LC1, (%esp)    call  puts    addl  $4, %esp    popl  %ecx    popl  %ebp    leal  -4(%ecx), %esp    ret    .size  main, .-main    .ident "GCC: (GNU) 4.1.2 20070115 (SUSE Linux)"        ;說明是用什么工具編譯的    .section    .note.GNU-stack,"",@progbits

 

從main函數開始壓入f函數的參數開始,堆棧的調用情況如下

20151117171954436.gif (341×267)

圖1  壓入參數

20151117172018789.gif (315×241)

圖二  通過call 命令壓入下一跳地址 IP

20151117172103760.gif (319×250)

圖三  函數f 通過pushl   %ebp 把 ebp保存起來

20151117172121305.gif (414×210)

圖四  函數 f 通過movl    %esp, %ebp讓ebp指向esp,這樣esp就可以進行修改,在函數返回的時候用ebp的值對esp進行恢復

20151117172136004.gif (407×540)

圖五  函數 f 通過subl    $40, %esp 給函數的局部變量預留空間

20151117172152902.gif (418×531)

圖六  int數組 aa[5]占用了20個字節的空間,然后 int i占用了4個字節的空間(緊鄰著之前壓入棧的%ebp)

故,如果aa[5]進行賦值,則會把 i 的值覆蓋掉,

如果對aa[6]進行賦值,則會把 棧中的 %ebp 覆蓋掉,那么在函數 f 返回的時候則不能對ebp進行恢復,即main函數的ebp變成了我們覆蓋掉的值,程序不知道會發生什么事情,但因為我們的程序接下來沒有調用棧中的內容,故還是可以運行的。

如果對aa[7]進行賦值,則會把棧中的 %IP 覆蓋掉,在函數 f 返回的時候就不能正確地找到下一跳的地址,會crash;

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品一区在线观看香蕉| 97在线观看视频| 久久天天躁狠狠躁夜夜躁2014| 欧美中文字幕在线| 欧美激情在线观看视频| 亚洲欧美国产精品va在线观看| 亚洲精品动漫久久久久| 日韩视频永久免费观看| 国产成人精品免费视频| 久久久久99精品久久久久| 日韩大陆毛片av| 亚洲电影在线看| 久久亚洲国产精品成人av秋霞| 精品福利樱桃av导航| 亚洲第五色综合网| 国产精品日韩在线| 色偷偷av一区二区三区乱| 日韩欧美在线看| 久久99青青精品免费观看| 久久久亚洲网站| 欧美一级片一区| 色综合亚洲精品激情狠狠| 91久久综合亚洲鲁鲁五月天| 久久综合久久八八| 久久久久久久久久久免费精品| 日韩国产欧美精品在线| 国产成人精品一区二区三区| 91精品在线国产| 成人免费观看49www在线观看| 日韩av片免费在线观看| 永久免费看mv网站入口亚洲| 亚洲欧美制服综合另类| 91av在线网站| 久久久久久久久久久久久久久久久久av| 国产一区二区三区在线看| 国产精品极品美女粉嫩高清在线| 77777少妇光屁股久久一区| 色偷偷av一区二区三区乱| 日韩在线视频二区| 日韩电影在线观看永久视频免费网站| 亚洲自拍偷拍福利| 久久乐国产精品| 欧美理论电影在线播放| 精品亚洲国产成av人片传媒| 激情懂色av一区av二区av| 韩国三级电影久久久久久| 欧美午夜无遮挡| 久久久www成人免费精品| 精品国产乱码久久久久酒店| 2019中文字幕在线观看| 91精品国产91久久久久| 亚洲美女免费精品视频在线观看| 日韩在线视频二区| 国产精品毛片a∨一区二区三区|国| 欧美一区深夜视频| 亚洲国产精彩中文乱码av| 欧美午夜美女看片| 国产精品久久久久久久久久尿| 亚洲男人天堂九九视频| 亚洲3p在线观看| 中文字幕av一区中文字幕天堂| 九九精品在线观看| 亚洲视频在线观看免费| 亚洲第一视频网| 亚洲精品国产综合久久| 国产日韩在线亚洲字幕中文| 国内精品久久久久影院优| 国产欧美最新羞羞视频在线观看| 亚洲精品福利在线观看| 中文字幕久久久| 久久精品国产v日韩v亚洲| 国产欧美一区二区白浆黑人| 尤物九九久久国产精品的特点| 98精品国产高清在线xxxx天堂| 色婷婷成人综合| 国内精品免费午夜毛片| 国产成人综合精品| 中文字幕日本精品| 国产精品久久久久久亚洲影视| 日韩欧美高清视频| 亚洲视频在线免费观看| 欧美日韩在线免费观看| 日产精品99久久久久久| 在线观看欧美日韩| 亚洲国产成人精品电影| 国产精品91久久久久久| 亚洲精品电影网| 久久久久国产精品一区| 日韩免费看的电影电视剧大全| 亚洲自拍偷拍福利| 久久全国免费视频| 91视频国产高清| 国产欧美一区二区三区久久人妖| 亚洲一区二区三区久久| 国产精品黄色av| 欧美一级黑人aaaaaaa做受| 国产91在线视频| 欧美日韩在线观看视频小说| 亚洲精品99久久久久中文字幕| 亚洲白虎美女被爆操| 久久久精品国产| 91国产精品视频在线| 欧美在线欧美在线| 91理论片午午论夜理片久久| 亚洲欧美日韩国产中文专区| 91高清免费在线观看| 欧美精品18videos性欧美| 亚洲欧洲日产国码av系列天堂| 懂色av影视一区二区三区| 精品一区二区三区四区在线| 亚洲精品综合精品自拍| 国产视频久久久| 欧美日韩国产综合新一区| 国产成人+综合亚洲+天堂| 欧美午夜片欧美片在线观看| 亚洲国产第一页| 国产日韩欧美影视| 欧美日韩另类视频| 精品国产一区二区三区久久久狼| 国产亚洲精品日韩| 日本精品久久久久影院| 国产亚洲欧洲高清一区| 国产成人精品日本亚洲专区61| 日韩在线视频观看正片免费网站| 国产婷婷97碰碰久久人人蜜臀| 亚洲欧美日韩一区二区在线| 欧美精品激情视频| 欧美电影免费播放| 精品丝袜一区二区三区| 97国产精品视频人人做人人爱| 亚洲欧美激情一区| 欧美日韩在线一区| 国产精品69精品一区二区三区| 亚洲午夜精品久久久久久久久久久久| 欧美国产在线视频| 日韩福利伦理影院免费| 九九视频这里只有精品| 丁香五六月婷婷久久激情| 精品久久香蕉国产线看观看gif| 美女扒开尿口让男人操亚洲视频网站| 国产成人精品亚洲精品| 欧美极品少妇xxxxⅹ免费视频| 91精品国产九九九久久久亚洲| 久久夜精品香蕉| 欧美福利视频在线| 日韩欧美综合在线视频| 亚洲欧美日韩天堂一区二区| 国产日韩精品综合网站| 国内精品小视频| 亚洲欧美国产视频| 中文字幕日韩有码| 久久99精品久久久久久琪琪| 亚洲美女精品久久| 国产成人精品一区二区在线| 色播久久人人爽人人爽人人片视av| 亚洲香蕉在线观看| 亚洲专区在线视频| 亚洲国产精品99久久| 高跟丝袜一区二区三区| 色综合伊人色综合网站| 亚洲一区二区三区四区在线播放| 2019av中文字幕| 国产精品久久久久久久久免费看| 亚洲欧洲日产国码av系列天堂|