2017.W32 - 了解你在寫的程式 - 資安

Table of Contents

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/

--

All Comments

Frederic avatarFrederic2017-08-11
OAOrz
Lydia avatarLydia2017-08-14
長知識
Isabella avatarIsabella2017-08-18
我能對前言發伸手牌嗎?