Category Archives: General

software library documentation

整理 https://www.divio.com/blog/documentation/ 對於software documentation的觀點 該篇blog文主要解釋軟體文件需要具備的幾個部分(從他的文章內容來看,這邊的軟體比較接近library) tutorial guide (how-to guide) explanation reference 一個好的文件,需要區分這四個部分。主要原因在這四個部分所針對的對象不同,目的也不同。 tutorial的重點在new comer,第一次接觸這個軟體/library的人要如何入門。文章提到這常也是軟體是否成功的關鍵-將new comer變成user的關鍵。如果使用的人覺得學習障礙很高,很可能就不用了。. “A bad or missing tutorial will prevent your project from acquiring new users.” guide是topic based,針對一個topic透過一系列的步驟完成,在文章中他用cook recipe來形容 explanation比較像是背景說明,在一般library文件我們常會看到design rationale可以算在這類 reference主要在information細節整理,可以想成是dictionary 另外文章也說明 區分project documentation和software documentation。有很多文件是算在project documentation:例如change log等 … Continue reading

Posted in General | Leave a comment

Diffie-Hellman Key Exchange整理

在雙方要做加密通信時,需要共同協商出密鑰,無論是加解密同一把,或是加密/解密分開, 都需要某種方式讓雙方得到密鑰。最簡單的做法就是透過事先設定好密鑰,或是另外透過安全的傳輸傳輸密鑰。 但是密鑰要在安全傳輸的通道裡傳輸,安全傳輸的通道怎麼來的,例如可能是實體的額外的線路,也可能是兩方私下先共同約定好特定密鑰的加密通道,不過這兩種做法似乎都要先約定好,是否有辦法直接在不安全的通道裡在雙方都沒有事先溝通的參數的情況下協商出一把只有雙方才知道的密鑰呢? 這個問題等同於如果有一個人在偷聽兩個陌生人的加密對話,從頭聽到尾(包括兩個人加密協商階段也能偷聽到的情況下),是否可以讓偷聽的人無法知道兩個陌生人原始的對話,也就是避免偷聽的人解開兩人通信使用的密鑰,答案是可以,這邊必須注意的是 – 偷聽是只在旁邊偷偷觀察,不是MTIM中間人攻擊 關於這個問題可參考 https://en.wikipedia.org/wiki/Key_exchange 比較多詳細的描述 Diffie-Hellman密鑰交換算法可以解決這個問題: 即使是在不安全的通道裡雙方還是可以協商出一同一把密鑰,而竊聽的人無法輕易得知那把密鑰。 他的做法是給定兩個數 p, g p是質數、g是 primitive root modulo p https://en.wikipedia.org/wiki/Primitive_root_modulo_n Alice、Bob透過不安全的通道交換p, g的資訊(所以這個資訊可能被第三者知道) Alice挑了一個數字a 計算出 A=g^a mod p,然後將A數字給BobBob挑了一個數字b 計算出 B=g^b mod p,然後將B數字給AliceAlice將拿到的B 計算出 K1=B^a mod pBob將拿到的A 計算出 K2=A^b mod p事實上 K1 … Continue reading

Posted in General | Leave a comment

big endian&little endian

在機器層級的指令集裡有些特定的data type,如int, float 以integer bit representation為例,可分為LSB(least significant bit 代表2^0)和MSB(most significant bit 代表 2^(n-1)) 我們一般書寫二進位的描述,MSB在左邊,LSB在右邊。例如書寫一千二百三十四會先寫 1再寫234 (positional notation),就是big endian(從big end開始)寫法,這在一般程式語言裡numeric literal也是這樣表示。 在記憶體中是以多個byte儲存,就會有哪個byte在低位哪個byte在高位如果方向從MSB開始以byte為單位依序存進記憶體,就是big end=> big endian, 如果方向從LSB開始以byte為單位依序存進記憶體,就是little end=> little endian, 而在記憶體中資料儲存依序的順序是從低位(低位址)開始算。 big endian也叫做network byte order,其實應該是network byte order採用big endian(rfc 1700), 例如ip header裡的total length欄位是跨byte。 … Continue reading

Posted in General | Leave a comment

openssl heartbleed

有用到openssl 需要注意他的漏洞更新,這邊提到的是大約2014年中的一個重大漏洞,屬於implementation flaw,同年的還有ShellShock和POODLE。作為許多軟體的底層元件,在當時影響的層面相當廣泛(參考: https://en.wikipedia.org/wiki/Heartbleed) https://blog.cloudflare.com/answering-the-critical-question-can-you-get-private-ssl-keys-using-heartbleed/這篇主要描述了openssl heartbleed bug(CVE-2014-0160),主要是利用heartbeat會response echo傳來的訊息,而在程式中沒有做message size boundary check 而依賴在protocol中由client提供的16bits length (存在payload變數), hbtype為message type,因為是16bits 所以最多可以echo 64kb的資料,因此可以從response拿到一些存在heap記憶體的資料,透過大量的request一直malloc free,其中可能可以拿到之前request帶的敏感資訊而進一步攻擊 有問題的點在上面的memcpy 將p1的內容複製到bp,共payload個bytes,而payload又是直接讀取content轉出來 n2a(p, payload) 那一行 測試可參考https://github.com/mpgn/heartbleed-PoCopenssl影響的版本為1.0.1~1.01f,實際拿apache + openssl 1.0.1c來測試就會發現能夠dump server side的記憶體內容

Posted in General | Leave a comment

semaphore整理

In computer science, a semaphore is a variable or abstract data type used to control access to a common resource by multiple processes in a concurrent system such as a multitasking operating system. (In computer science, a semaphore is a … Continue reading

Posted in General | Leave a comment