作者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 开启档案搜寻。
--
桃乐丝: 可是, 如果你没有头脑, 为什麽会说话?
稻草人: ㄝ, 我也不知... 但是有些人没有头脑也能说超~多话呢。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.137.4.14
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1460001796.A.309.html
1F:推 Clangpp: 感谢!!! 只是我要更正一下 const是我自己以为 同事并没说 04/07 12:30
2F:→ Clangpp: 他只说不要把密码写在#define中而已 04/07 12:30
3F:→ Schottky: 没关系,你可以问他那到底该怎样写,再验证他的作法 XD 04/07 12:58
4F:推 ronin728: 若须在程式储存这种资讯,有没有比较难被黑出来的方法? 04/07 17:39
要储存就绝对会被挖出来。像楼下那样不储存,只验证,才比较实际点。
5F:→ kerwinhui: 通常会用个one-way hash再compare hashed value? 04/07 18:11
6F:→ kerwinhui: 像Unix /etc/shadow只储存密码的md5sum 04/07 18:19
7F:→ 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 这四款)
8F:→ TobyH4cker: 我试过IDA还是有办法分析出来XD 04/07 18:50
可以跟大家分享一下 IDA 这个工具吗?
9F:推 askacis: 如果只是要防grep等级的窥看,化整为零把密码拆成字元 04/07 18:58
10F:→ askacis: 再用程式runtime把字元组起来,这样text section不会有 04/07 18:59
你的方法就是密码学说的 confusion & diffusion 两种方法之 diffusion (错位)
至於 confusion 怎麽做呢? 产生一串和 password 一样长的乱码,xor 上去即可。
为了再还原出原始的 password 明文,错位的排法、xor 的遮罩都要保留下来,
也因此这样做也只能防简单的 grep,仔细去看还是可以掘出解码的方法。
***** 所有的双向加解密演算法都一样 *****
我管你是用 AES 还是 RSA,反正只要钥匙藏在踏垫下都没用。
11F:→ TobyH4cker: 哦哦这篇重点在直接搜binary 04/07 19:00
主要是要让他拿去吐槽他同事 XD
顺便让原 PO 思考一下这个问题,所以才限制一下怪物等级,当作地下城第一层。
※ 编辑: Schottky (220.137.4.14), 04/07/2016 20:47:37
12F:→ ronin728: 原来用hash是方法之一,长知识了,不过askacis大说的 04/07 21:19
13F:→ ronin728: 方法能不能在动态分析的时候收割组合回来的结果呢? 04/07 21:20
14F:推 Clangpp: 小弟学习了QQ 总之 code当中尽量不要放明文 04/07 21:30
15F:→ Schottky: hash只适合用在验证,若需要使用password明文就不适用了 04/07 21:32
16F:→ Schottky: 动态分析可以呀,甚至你在debugger设个断点都可以收割 04/07 21:32
17F:推 Clangpp: 我本身研究所领域是做key agreement protocol的 所以平 04/07 21:33
18F:→ Clangpp: 时只会去注意网路或是IPC间的传输如何做比较安全 04/07 21:34
19F:→ Clangpp: 没想到 coding本身也那麽多要注意阿QQ 04/07 21:34
20F:→ Schottky: 目前也只讨论到安全协定,没讲到实作coding部份啊 04/07 21:40
21F:→ Schottky: coding真的建议看一下我说的那本书 04/07 21:40
22F:→ Schottky: 只是你玩线上游戏,我们现在玩的是单机而已 XD 04/07 21:41
23F:推 laba5566: 推 长知识了 这串真棒 04/07 23:05
24F:推 wuliou: 长知识 04/08 16:59