看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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 開啟檔案搜尋。 -- 桃樂絲: 可是, 如果你沒有頭腦, 為什麼會說話? 稻草人: ㄝ, 我也不知... 但是有些人沒有頭腦也能說超~多話呢。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.137.4.14 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1460001796.A.309.html
Clangpp: 感謝!!! 只是我要更正一下 const是我自己以為 同事並沒說 04/07 12:30
Clangpp: 他只說不要把密碼寫在#define中而已 04/07 12:30
Schottky: 沒關係,你可以問他那到底該怎樣寫,再驗證他的作法 XD 04/07 12:58
ronin728: 若須在程式儲存這種資訊,有沒有比較難被黑出來的方法? 04/07 17:39
要儲存就絕對會被挖出來。像樓下那樣不儲存,只驗證,才比較實際點。
kerwinhui: 通常會用個one-way hash再compare hashed value? 04/07 18:11
kerwinhui: 像Unix /etc/shadow只儲存密碼的md5sum 04/07 18:19
kerwinhui: 當然,現在md5 collision太容易了,也有rainbow table 04/07 18:22
在適合的應用上,這招是正解。你提出的瑕疵,可以補強。我過陣子再回文細說。 MD5 不要用了啦,如果要用常見的演算法,挑 SHA-2 家族或 SHA-3 比較好。 http://www.larc.usp.br/~pbarreto/hflounge.html 不說也猜得到,骷髏頭不能用,紅十字殘血不推薦,放大鏡是受過攻擊仍然健在。 (SHA-2 家族指 SHA-224, SHA-256, SHA-384, SHA-512 這四款)
TobyH4cker: 我試過IDA還是有辦法分析出來XD 04/07 18:50
可以跟大家分享一下 IDA 這個工具嗎?
askacis: 如果只是要防grep等級的窺看,化整為零把密碼拆成字元 04/07 18:58
askacis: 再用程式runtime把字元組起來,這樣text section不會有 04/07 18:59
你的方法就是密碼學說的 confusion & diffusion 兩種方法之 diffusion (錯位) 至於 confusion 怎麼做呢? 產生一串和 password 一樣長的亂碼,xor 上去即可。 為了再還原出原始的 password 明文,錯位的排法、xor 的遮罩都要保留下來, 也因此這樣做也只能防簡單的 grep,仔細去看還是可以掘出解碼的方法。 ***** 所有的雙向加解密演算法都一樣 ***** 我管你是用 AES 還是 RSA,反正只要鑰匙藏在踏墊下都沒用。
TobyH4cker: 哦哦這篇重點在直接搜binary 04/07 19:00
主要是要讓他拿去吐槽他同事 XD 順便讓原 PO 思考一下這個問題,所以才限制一下怪物等級,當作地下城第一層。 ※ 編輯: Schottky (220.137.4.14), 04/07/2016 20:47:37
ronin728: 原來用hash是方法之一,長知識了,不過askacis大說的 04/07 21:19
ronin728: 方法能不能在動態分析的時候收割組合回來的結果呢? 04/07 21:20
Clangpp: 小弟學習了QQ 總之 code當中盡量不要放明文 04/07 21:30
Schottky: hash只適合用在驗證,若需要使用password明文就不適用了 04/07 21:32
Schottky: 動態分析可以呀,甚至你在debugger設個斷點都可以收割 04/07 21:32
Clangpp: 我本身研究所領域是做key agreement protocol的 所以平 04/07 21:33
Clangpp: 時只會去注意網路或是IPC間的傳輸如何做比較安全 04/07 21:34
Clangpp: 沒想到 coding本身也那麼多要注意阿QQ 04/07 21:34
Schottky: 目前也只討論到安全協定,沒講到實作coding部份啊 04/07 21:40
Schottky: coding真的建議看一下我說的那本書 04/07 21:40
Schottky: 只是你玩線上遊戲,我們現在玩的是單機而已 XD 04/07 21:41
laba5566: 推 長知識了 這串真棒 04/07 23:05
wuliou: 長知識 04/08 16:59