作者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/m.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