→ Hazukashiine: 把重要參數寫在 #define 錯了嗎?不是很正常? 04/06 23:00
推 ronin728: 同樓上,求指點 04/06 23:03
→ Hazukashiine: 沒有提及C語言的 Macro 有何安全性問題 04/06 23:06
→ Hazukashiine: 只有 VBA-type/WindWord Macros 可能有病毒攻擊 04/06 23:06
→ james732: 同一樓,不懂為什麼寫在參數有問題...? 04/06 23:15
→ king37937: 萬無一失的程式碼-終結 C & C ++ 軟體漏洞 <= 這本? 04/07 02:21
→ Clangpp: 我更正一下 重要參數是指密碼的部分 我記得沒錯很容易被 04/07 08:04
→ Clangpp: 反組譯 跟加密相關的參數都建議不要放在code當中 04/07 08:05
→ Clangpp: 有錯可以更正我一下 因為我是聽同事講的 04/07 08:07
→ Clangpp: 理由是上面描述的 04/07 08:08
※ 編輯: Clangpp (114.37.181.229), 04/07/2016 08:18:45
※ 編輯: Clangpp (59.124.167.226), 04/07/2016 09:07:08
※ 編輯: Clangpp (59.124.167.226), 04/07/2016 10:41:58
→ Schottky: (笑到翻肚) 那用 const 就不會被反組譯看到喔? 04/07 10:56
已修正了 感謝
→ Schottky: 你那同事真的有反組譯過自己或別人寫的程式嗎? 04/07 10:56
→ Schottky: 電腦安全是另一個領域,而且是進階課程,認真要做的話, 04/07 11:01
→ Schottky: 成本非常高,不過你若只要單純討論一個實際遇到的問題 04/07 11:02
→ Schottky: 像是現在這個密碼問題,我蠻願意聊聊的 04/07 11:03
→ Schottky: 如果要看書,我推薦 Bruce Schneier 的 Pratical 04/07 11:05
→ Schottky: Cryptography 第 9 和 16 章 Implementation Issues 04/07 11:05
→ Schottky: 它有教你一點點訣竅,且告訴你不要妄想看個兩章就變行家 04/07 11:06
→ Clangpp: 喔喔喔 感謝 願聞其詳 因為我也希望能夠導正觀念 04/07 11:29
→ Clangpp: 有時候我們接收錯誤的觀念太多 所以我想要理解什麼是正確 04/07 11:30
→ Clangpp: 的 04/07 11:30
→ Clangpp: 這種東西我一直很有興趣 但是不知道從哪邊入門 04/07 11:30
→ Clangpp: 所以 密碼不建議放在preprocessor是正確的嗎?? 04/07 11:34
→ Schottky: 密碼喔... 我想你得先把整件事講清楚才有辦法討論... 04/07 11:42
→ Schottky: 什麼密碼? 程式如何使用? 要防範什麼樣的威脅? 04/07 11:42
→ Schottky: 如果直接這樣問我,我會告訴你放哪都會被反組譯出來 04/07 11:43
→ Schottky: #define 最後還是會處理完再代入該放的位置,那個該放的 04/07 11:46
→ Schottky: 位置大概就是你說的 const,再轉成 binary 一樣是明碼 04/07 11:46
※ 編輯: Clangpp (59.124.167.226), 04/07/2016 12:32:55
→ TobyH4cker: 也有可能是runtime時放進stack,但兩者靜態分析都秒爆 04/07 18:54
→ L4ys: 明文只要在 memory 中出現過就抓得出來,沒有例外 04/07 22:48
推 LiloHuang: 簡單弄可以買一套虛擬機保護的加殼器,找沒自動脫殼的 04/08 09:51
→ LiloHuang: 複雜一點的就是自己的殼自己做,反反編譯跟反靜態分析 04/08 09:55
→ descent: 萬無一失的程式碼:終結C&C++軟體漏洞 參考一下 04/08 12:23
→ Schottky: 加殼(程式碼加密)有個小麻煩,防毒軟體會把你當病毒 04/08 12:57
→ Schottky: 因為病毒超愛用這招來躲防毒軟體的掃描 XDDD 04/08 12:57
推 LiloHuang: 多數時候是防毒軟體太弱,只能識別殼的部分特徵或行為 04/08 14:25
→ LiloHuang: 不管三七二十一就判斷是病毒,只能手工加殼加花多測試 04/08 14:28
→ LiloHuang: 防止逆向工程跟免殺技術是正反兩面 04/08 14:28
→ TobyH4cker: 要買正版,既然買了也順便買簽章吧(X 正版才不易被殺 04/09 04:04
> -------------------------------------------------------------------------- <
作者: Schottky (順風相送) 看板: C_and_CPP
標題: Re: [問題] 如何寫出符合安全的C/C++ code
時間: Thu Apr 7 12:03:14 2016
※ 引述《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 開啟檔案搜尋。
> -------------------------------------------------------------------------- <
作者: kerwinhui (kezza) 看板: C_and_CPP
標題: Re: [問題] 如何寫出符合安全的C/C++ code
時間: Thu Apr 7 13:48:39 2016
※ 引述《Schottky (順風相送)》之銘言:
: ※ 引述《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;
: }
要比較放不放preprocessor #define應該是用
#include <stdio.h>
#define SUPER_SECRET_PASSWORD "CrystalBall"
const char *password = SUPER_SECRET_PASSWORD ;
int main(void) {
printf("Password = %s\n", password);
return 0;
}
吧?
: 把他們 compile 成執行檔(假設叫 a.out),然後用這指令:
: strings a.out | grep 'CrystalBall'
: 試試看不同的方法,哪一種可以讓簡單的文字搜尋指令搜尋不到...
: 這樣不用反組譯也可以快快樂樂看見密碼~~~
: 如果你有 binary editor (vim -b 就辦得到) 也可以用 editor 開啟檔案搜尋。