※ 引述《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中而已
没关系,你可以问他那到底该怎样写,再验证他的作法 XD
若须在程式储存这种资讯,有没有比较难被黑出来的方法?
通常会用个one-way hash再compare hashed value?像Unix /etc/shadow只储存密码的md5sum当然,现在md5 collision太容易了,也有rainbow table
作者:
askacis (ASKA)
2016-04-07 18:58:00如果只是要防grep等级的窥看,化整为零把密码拆成字符再用程式runtime把字符组起来,这样text section不会有
原来用hash是方法之一,长知识了,不过askacis大说的方法能不能在动态分析的时候收割组合回来的结果呢?
作者:
Clangpp (Clang++)
2016-04-07 21:30:00小弟学习了QQ 总之 code当中尽量不要放明文
hash只适合用在验证,若需要使用password明文就不适用了动态分析可以呀,甚至你在debugger设个断点都可以收割
作者:
Clangpp (Clang++)
2016-04-07 21:33:00我本身研究所领域是做key agreement protocol的 所以平时只会去注意网络或是IPC间的传输如何做比较安全没想到 coding本身也那么多要注意阿QQ
目前也只讨论到安全协定,没讲到实作coding部份啊coding真的建议看一下我说的那本书只是你玩线上游戏,我们现在玩的是单机而已 XD
作者:
laba5566 (最爱56家族 啾咪)
2016-04-07 23:05:00推 长知识了 这串真棒
作者:
wuliou (wuliou)
2016-04-08 16:59:00长知识