1樓:
恭喜你,你發現了一個非常重要的系統漏洞形式。有很多對系統的破解都是基於此原理,下面我此進行一下解釋。
首先先大概指明錯誤: char buf[4]; 是分配了4個位元組的儲存空間, strcpy(buf, "aaaa"); 是向buf寫入5個位元組的資料,因為別忘了字串最後總隱藏著一個字串結束符'\0',也就是說,strcpy向buf寫入的資料超過了它自身的大小,於是資料寫入過程就出現了越界,這樣就會造成其它變數的資料被破壞(當然也可能是系統資料被破壞)。在這個例子裡,對buf的越界寫入後,恰好破壞了i的值,因此最後i的值變成了0。
這段程式需要正確執行,需要這樣定義: char buf[5]; //buf必須是5個位元組或者超過5個位元組。
好了,下面再詳細解釋一下整個過程:
(1) 首先,需要指出,區域性變數的記憶體分配是在棧中分配的,而棧的分配是從記憶體的高地址向低地址分配。
記憶體地址 變數 值
0x1000 buf[0]
0x1001 buf[1]
0x1002 buf[2]
0x1003 buf[4]
0x1004 i(低8位) 0x01
0x1005 i(高8位) 0x00
(3) 執行strcpy函式後:
記憶體地址 變數 值
0x1000 buf[0] 'a'
0x1001 buf[1] 'a'
0x1002 buf[2] 'a'
0x1003 buf[4] 'a'
0x1004 i(低8位) 0x00 (因為"aaaa"最後還要寫一個字串結束符'0')
0x1005 i(高8位) 0x00
看到沒,最後那個字串結束符正好把變數i低8位的內容給破壞了。因此最後輸出i的值是0。
這個錯誤就是典型的“緩衝區溢位漏洞”。你知道蘋果手機為什麼能越獄麼?很多時候就是利用了類似這樣的處理漏洞!
2樓:醉俊傑
你的buf大小隻有4,而“aaaa”是五個位元組,也就是說存在記憶體錯誤,看起來,多出的那個'\0'存到了i裡;
改正很簡單,buf[5]再試試。
c語言 下面程式執行結果為什麼是0 而不是1 main() {int n[5]={0,0,0},
3樓:與子如初見
因為迴圈的時候當i等於k的時候退出迴圈了,根本沒有執行迴圈體n[i] = n[i]+1;這一句,所以n[k]的值為初始化的值,初始化的值為0.故輸出0,。
4樓:匿名使用者
因為當i=k時,for迴圈的條件已經不滿足,不會執行n[i]=n[i]+1。故n[k]還是0.
5樓:殷明明孫楓
選cn=4;
相當於是這樣
intn=0;
while(n++<=2)
//先進行
n<=2判斷,再進行n++自增運算。n=3的時候,n>2,但還是會進行++自增運算,所以為回4
printf("%d",n);
請幫忙解釋一下下面的程式為什麼結果輸出是0,0,關於c語言的
6樓:匿名使用者
看你的**排版看到頭暈。p[1].m->n 的m為第三個元素,n未初始化,全域性變數預設為0。,p[2].m->n的m為第一個元素,n在迴圈中被賦值為0。
眼睛有點痛
c語言階乘問題,程式每次執行結果都是0,為什麼呢
7樓:
因為你的i從0開始的,任何數乘以0你說得多少。你把i的初值給1試試。
#include
int main()
8樓:實小林志堅
i的初始值不能為0,在階乘中,最小要為1。
9樓:匿名使用者
#include
int main()
10樓:阿也費哇鷹潭法
將for(i=0;i<=n;i++)
改為for(i=1;i<=n;i++)
c語言下列程式執行結果int a 7,b
岔路程式緣 下列程式的執行結果是 d include int a 7,b 3 void fun int x,int y main a.4,7 b.7,3 c.2,6 d.8,6 答案選d,原因是 1 首先程式開頭定義的a 7,b 3屬於全域性變數。它在所有函式中有效。2 其次在main函式中又定義了...
二級C語言,下列程式的輸出結果是
迴圈條件應該是 p 0 吧 字串存的形式是 a b a b c d c d 0 所以迴圈條件就是判斷字串是否到頭了,然後if判斷p指向的字元ascii碼是否在a和z之間,由於大寫字母的ascii碼小於小寫字母,如果是小寫字母就記錄到字元陣列a中,當迴圈完成後在a最好乙個記錄的字元後加字串結束符 0 ...
c語言,以下程式的輸出結果是,C語言問題 以下程式的輸出結果是?
輸出1 3 這是遞迴了,所以先是fun 3 進入後發現3 2 1,所以又繼續func 3 2 也就是fun 1 進入發現1 2 0,就執行prinft,輸出1,然後fun 1 就返回了 返回出去正好是fun 3 的prinft,輸出3 進入fun 3 進入fun 1 輸出1退出fun 1 輸出3退出...