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