作者CMJ0121 (不要偷 Q)
看板NetSecurity
标题[闲聊] 2017.W32 - 了解你在写的程式
时间Tue Aug 8 23:43:06 2017
2017.W32 - 了解你写的程式
> 你不了解程式语言 直到己设计一个
## 前言 ##
#include <stdio.h>
int foo(
void) {
fprintf(
stdout,
"Run foo\n"1m);
return 1;
}
int main(
int argc,
char *argv[]) {
fprintf(
stdout,
"%d\n",
1 < foo() >
2*foo() <=
3000);
return 0;
}
假设不管编译器产生的任何警告 (Warning)
1- 请问上面的程式码 (C) 是否可以编译成功?
2- 假如可以编译成执行档 他的执行结果会是?
3- 假如编译失败 他的错误 (Error) 是什麽
## 内容 ##
故事的起因是看到了这篇文章[0] 讲了关於 JavaScrip 中的 == 与 === 之间的神奇关系
假如曾写过 JavaScript 就知道这语言充满着各种可能的型态转换 (type coercion)[1]
像是 "2" == 2 这种 会把前面的 2 转型成 int 在做比较
因此就会有这类型的整理图表[2] 告诉你 JavaScript 哪些情况下 == 是会成立的
但如果仔细看整理的结果就会发现 部分结果无论是 == 还是 === 都一定不为 true
像是 [] == [] 跟 [] === [] 结果都会是 false 这违反直觉的结果
而更多神奇的运算 像是 NaN + Nan 与 !NaN + NaN 就可以交给有兴趣的人研究了
很多程式的安全性漏洞都来自於对於程式、函式库或指令的不理解
在直觉上的使用造成出乎意料的结果 导致出现安全性问题
像是在 Linux 环境中 即使档案权限设定为 root:root 600 的权限
如果父目录的权限设定为 777 则恶意的攻击者依然可以对档案做'修改'
更不用提 如果是要写封包类型的 C 程式语言 有多少人记得 struct 需要额外的叙述
[0]:
https://stackoverflow.com/questions/359494/which-equals-operator-vs-should-be-used-in-javascript-comparisons
[1]:
https://stackoverflow.com/questions/19915688/what-exactly-is-type-coercion-in-javascript
[2]:
http://dorey.github.io/JavaScript-Equality-Table/
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.193.122.171
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/NetSecurity/M.1502206989.A.337.html
1F:推 holishing: OAOrz 08/14 00:39
2F:推 lalalalaluk: 长知识 08/16 22:26
3F:→ skycat2216: 我能对前言发伸手牌吗? 08/20 10:10