Re: [問題] 如何寫出符合安全的C/C++ code

作者: Schottky (順風相送)   2016-04-07 12:03:14
※ 引述《Clangpp (Clang++)》之銘言:
: 另外還看到很多新手居然把重要參數寫在 #define (preprocessor)中...
: (同事的說法 因為編成binary後還是明碼
: 甚至可以直接開檔改 所以建議重要參數不要放在 preprocessor)
突然想到一個方便的小實驗可以驗證上面這個說法,
寫這樣一段小程式:
#include <stdio.h>
const char *password = "CrystalBall";
int main(void) {
printf("Password = %s\n", password);
return 0;
}

#include <stdio.h>
#define PASSWORD "CrystalBall"
int main(void) {
printf("Password = %s\n", PASSWORD);
return 0;
}
把他們 compile 成執行檔(假設叫 a.out),然後用這指令:
strings a.out | grep 'CrystalBall'
試試看不同的方法,哪一種可以讓簡單的文字搜尋指令搜尋不到...
這樣不用反組譯也可以快快樂樂看見密碼~~~
如果你有 binary editor (vim -b 就辦得到) 也可以用 editor 開啟檔案搜尋。
作者: Clangpp (Clang++)   2016-04-07 12:30:00
感謝!!! 只是我要更正一下 const是我自己以為 同事並沒說他只說不要把密碼寫在#define中而已
作者: Schottky (順風相送)   2016-04-07 12:58:00
沒關係,你可以問他那到底該怎樣寫,再驗證他的作法 XD
作者: ronin728 (浪人)   2016-04-07 17:39:00
若須在程式儲存這種資訊,有沒有比較難被黑出來的方法?
作者: kerwinhui (kezza)   2016-04-07 18:11:00
通常會用個one-way hash再compare hashed value?像Unix /etc/shadow只儲存密碼的md5sum當然,現在md5 collision太容易了,也有rainbow table
作者: TobyH4cker (Toby (我要當好人))   2016-04-07 18:50:00
我試過IDA還是有辦法分析出來XD
作者: askacis (ASKA)   2016-04-07 18:58:00
如果只是要防grep等級的窺看,化整為零把密碼拆成字元再用程式runtime把字元組起來,這樣text section不會有
作者: TobyH4cker (Toby (我要當好人))   2016-04-07 19:00:00
哦哦這篇重點在直接搜binary
作者: ronin728 (浪人)   2016-04-07 21:19:00
原來用hash是方法之一,長知識了,不過askacis大說的方法能不能在動態分析的時候收割組合回來的結果呢?
作者: Clangpp (Clang++)   2016-04-07 21:30:00
小弟學習了QQ 總之 code當中盡量不要放明文
作者: Schottky (順風相送)   2016-04-07 21:32:00
hash只適合用在驗證,若需要使用password明文就不適用了動態分析可以呀,甚至你在debugger設個斷點都可以收割
作者: Clangpp (Clang++)   2016-04-07 21:33:00
我本身研究所領域是做key agreement protocol的 所以平時只會去注意網路或是IPC間的傳輸如何做比較安全沒想到 coding本身也那麼多要注意阿QQ
作者: Schottky (順風相送)   2016-04-07 21:40:00
目前也只討論到安全協定,沒講到實作coding部份啊coding真的建議看一下我說的那本書只是你玩線上遊戲,我們現在玩的是單機而已 XD
作者: laba5566 (最愛56家族 啾咪)   2016-04-07 23:05:00
推 長知識了 這串真棒
作者: wuliou (wuliou)   2016-04-08 16:59:00
長知識

Links booklink

Contact Us: admin [ a t ] ucptt.com