亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 5258 | 回復(fù): 21
打印 上一主題 下一主題

一道關(guān)于段錯誤筆試題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-06-10 21:29 |只看該作者 |倒序瀏覽
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    int i = 1;
    char buf[4];

    strcpy(buf, "AAAA");
    printf("%d\n", i);

    return 0;
}

a) When compiled and executed on x86, why does this program usually not
    output what the programmer intended?

strcpy拷貝結(jié)束符('\0')時 因為buf大小為4字節(jié),覆蓋了i的最低字節(jié)(之前是1) 變?yōu)?;
所以輸出結(jié)果是0


b) Name several ways in which the security problem that causes this
program not to output what the programmer intended can be prevented
WITHOUT changing the code.

但是這道題就不會了, 翻譯是不是這樣
找出幾種可以解決引起上面程序沒有按程序員意向輸出的安全隱患的預(yù)防方法,且不用改變源碼(就是上面那程序)

e文差不知道翻譯對不對,

求方法(因為我除了該代碼(比如說把buf改為buf[5]),就沒有別的辦法了)

論壇徽章:
0
2 [報告]
發(fā)表于 2010-06-10 22:13 |只看該作者

  1. 執(zhí)行strcpy(buf, "AAAA");前
  2. 棧:
  3.      buf   ->  ?
  4.      buf+1 ->  ?
  5.      buf+2 ->  ?
  6.      buf+3 ->  ?
  7.      i     ->  1

  8. 執(zhí)行strcpy(buf, "AAAA");后
  9. 棧:
  10.      buf   ->  'A'
  11.      buf+1 ->  'A'
  12.      buf+2 ->  'A'
  13.      buf+3 ->  'A'
  14.      i     ->  0
復(fù)制代碼
第二個問有點像腦筋急轉(zhuǎn)彎,得想想。

論壇徽章:
0
3 [報告]
發(fā)表于 2010-06-10 22:19 |只看該作者
不太明白,為什么x86上會出現(xiàn)這種情況呢

論壇徽章:
5
獅子座
日期:2013-08-20 10:12:24午馬
日期:2013-11-23 18:04:102015年辭舊歲徽章
日期:2015-03-03 16:54:152015亞冠之德黑蘭石油
日期:2015-06-29 18:11:1115-16賽季CBA聯(lián)賽之新疆
日期:2024-02-21 10:00:53
4 [報告]
發(fā)表于 2010-06-10 22:23 |只看該作者
第二題很有歧義啊……prevent應(yīng)該是阻止,那么是只是輸出1就好了,還是要求同時語義也正確?如果是預(yù)防的話,這種代碼報錯或者報警告就算預(yù)防了。而且change the code是全部不許改還是main不許改呢?

論壇徽章:
0
5 [報告]
發(fā)表于 2010-06-10 22:26 |只看該作者
不讓改源碼意思就是從編譯入手吧

論壇徽章:
5
獅子座
日期:2013-08-20 10:12:24午馬
日期:2013-11-23 18:04:102015年辭舊歲徽章
日期:2015-03-03 16:54:152015亞冠之德黑蘭石油
日期:2015-06-29 18:11:1115-16賽季CBA聯(lián)賽之新疆
日期:2024-02-21 10:00:53
6 [報告]
發(fā)表于 2010-06-10 22:29 |只看該作者
應(yīng)該能通過插入guard的方式來解決,不知道有沒有某個編譯器選項可以做到的……

論壇徽章:
5
獅子座
日期:2013-08-20 10:12:24午馬
日期:2013-11-23 18:04:102015年辭舊歲徽章
日期:2015-03-03 16:54:152015亞冠之德黑蘭石油
日期:2015-06-29 18:11:1115-16賽季CBA聯(lián)賽之新疆
日期:2024-02-21 10:00:53
7 [報告]
發(fā)表于 2010-06-10 22:32 |只看該作者
gcc有個-fstack-check的選項,不過只能報錯不能prevent(我覺得有改正的含義)。唯一的改正方法恐怕只有加大緩沖區(qū)或者在復(fù)制的時候采用指定長度的復(fù)制。

論壇徽章:
0
8 [報告]
發(fā)表于 2010-06-10 22:44 |只看該作者
回復(fù) 7# starwing83


gcc -fstack-protector-all 試過了,生成的匯編代碼里i和buf還是連續(xù)的(x86 & x86_64),這種錯沒有破壞堆棧,只改了局部變量,堆棧保護功能查不出來的。

我的思路是讓編譯器生成代碼時,讓i成為寄存器變量,不分配展空間的話,strcpy就能破壞棧框,就能檢查出來了。

論壇徽章:
5
獅子座
日期:2013-08-20 10:12:24午馬
日期:2013-11-23 18:04:102015年辭舊歲徽章
日期:2015-03-03 16:54:152015亞冠之德黑蘭石油
日期:2015-06-29 18:11:1115-16賽季CBA聯(lián)賽之新疆
日期:2024-02-21 10:00:53
9 [報告]
發(fā)表于 2010-06-10 22:47 |只看該作者
?我用了-fstack-check選項就檢查出來了啊……

gcc -fstack-check test.c

寄存器變量的話……邪惡地:-Dint=register\ int不知道行不行……

論壇徽章:
0
10 [報告]
發(fā)表于 2010-06-10 22:48 |只看該作者
第二題很有歧義啊……prevent應(yīng)該是阻止,那么是只是輸出1就好了,還是要求同時語義也正確?如果是預(yù)防的話 ...
starwing83 發(fā)表于 2010-06-10 22:23



   應(yīng)該是全部不許改吧



gcc有個-fstack-check的選項,不過只能報錯不能prevent(我覺得有改正的含義)。唯一的改正方法恐怕只有加大 ...
starwing83 發(fā)表于 2010-06-10 22:32



    gcc的-fstack-check的選項是不是你上面說的插入guard的方式
   不是的話,插入guard的方式是指什么?

   我查了下你說的-fstack-check的選項
   GCC 對內(nèi)存錯誤的檢查主要依靠 3 個選項: -fstack-check -fbounds-check -fstack-protector-all
   GCC 4.1 以上支持-fstack-protector-all 選項 可以防止緩沖區(qū)溢出攻擊,也可以利用此選項來檢查代碼是否有緩沖區(qū)溢出的錯誤
我現(xiàn)在去試試這幾個選項
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP