java 缓冲区溢出_基于数组越界的缓冲区溢出
上一篇文章說了函數調用時候的堆棧變化,這里就基于這個內容來驗證一下基于數組越界的緩沖區溢出。
在c語言中,數組必須是靜態的,也就是在定義的時候必須明確數組的大小,在根本上來說,這個是堆棧提升的原因,只有在數組的大小確定的時候,才能明確堆棧到底要提升多少,如果數組的大小是動態變化的,就極容易發生緩沖區溢出;而且c語言也不具備Java等語言中靜態分析的功能,不會去檢測數組是否有上溢或者下溢,其邊界的檢驗是有程序員負責的,所以這就造成了一些問題,我們可以通過數組越界來改變一些內容。
首先來看一下這次的實驗程序
正常來說,test1函數并沒有被調用,所以是不會打印出12345的,而實際的情況卻不是這樣的
造成這樣的情況,就是由于數組越界而造成的緩沖區溢出,這其中還有一個編譯器的坑,在后面再解釋。
我們直接在數組處下斷點,前面的提升堆棧等操作就不細說了,前一篇文章已經走過一邊流程了,這里直接給出到這一步的堆棧圖。
然后我們看一下編譯器是如何處理數組賦值的內容的
經過這段賦值操作,此時堆棧已經變成了下圖,這里單獨從中拎出來10行方便觀看。
通過堆棧圖我們可以很清晰的看到,明明只有8個數,它確是從ebp-24h開始排的,也就是說ebp-4的位置是沒有使用的,這個也就是前面所說的坑,經過查詢資料,發現從vs2010開始,ebp-4就都沒有使用,具體是用來做什么的,暫時還不清楚,所以如果這里你使用的是vc6.0的話,這里就是從ebp-4開始排的。
好了說了上面那個坑,接著回來說堆棧圖,在上一篇文章里我們已經很清楚函數在調用的時候會先把call語句的下一行地址壓入棧中,所以圖中b[10]的位置也就代表了ret返回地址的位置,在vc6.0中此處應該是b[9],如果我們將這個地址替換為我們想讓程序到達的位置,也就可以控制程序的運行軌跡了。
在后面的操作就是將test1函數的地址賦給了b[10],也就代替了之前函數的返回地址,這個函數在執行完成后便會返回test1函數的位置081137Ah。
也就達到了緩沖區溢出的效果。
文章首發公眾號和個人博客
公眾號:無心的夢囈(wuxinmengyi)
總結
以上是生活随笔為你收集整理的java 缓冲区溢出_基于数组越界的缓冲区溢出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机拼图形 比创意教案,拼图形比创意教
- 下一篇: VisualStudio解决方案配置De