[Erlang] Diffie-Hellman Key Exchange

Recently I try to write Diffie-Hellman key exchange protocol. And I found that Erlang’s library crypto provide  dh_generate_key & dh_compute_key API.


Types
byte() = 0 ... 255
ioelem() = byte() | binary() | iolist()
iolist() = [ioelem()]
Mpint() = <<ByteLen:32/integer-big, Bytes:ByteLen/binary>>
dh_generate_key(DHParams) -> {PublicKey,PrivateKey}
dh_generate_key(PrivateKey, DHParams) -> {PublicKey,PrivateKey}
  • DHParameters = [P, G]
  • P, G = Mpint Where P is the shared prime number and G is the shared generator.
  • PublicKey, PrivateKey = Mpint()

Generates a Diffie-Hellman PublicKey and PrivateKey (if not given).

dh_compute_key(OthersPublicKey, MyPrivateKey, DHParams) -> SharedSecret
  • DHParameters = [P, G]
  • P, G = Mpint Where P is the shared prime number and G is the shared generator.
  • OthersPublicKey, MyPrivateKey = Mpint()
  • SharedSecret = binary()

Computes the shared secret from the private key and the other party’s public key.

So this is how to use the API.

crypto:start().

% you can use dh_generate_parameters(512, 2) to generate

DHParams = [<<LenP:32, BinP/binary>>, <<LenG:32, BinG/binary>>],

{<<LenPub:32, PubKey/binary>>, PrivKey} =crypto:dh_generate_key(DHParams), SessionKey = crypto:dh_compute_key(<<LenA:32, BinA/binary>>,

PrivKey,  DHParams),

For more information, you can check /usr/local/lib/erlang/lib/crypto-1.6.3/src/crypto.erl

[Linux] Buffer overflow prevention technique (1)

首先介紹based on compiler上面的方法, 這種方法比較不會影響系統的效能.

SSP/ProPolice:

這個方法在GCC 4.1後就變成內建的, 只需要在compile時加上-fstack-protector就可以開啟,它總共有三種方式來預防bufferover flow.

  • Random Canary: 這種方法是在stack存放return address的前面放一個亂數值並且把值也存在global data中,並且在函數執行結束後比對檢查有沒有被改變,如果有的話,就代表有buffer overflow, 這時會強制程式結束並發出錯誤.

  • Variables reordering: 如果local variable中有function pointer的話, 有可能可以利用buffer overflow去改變此pointer所指向的function, 並且直接眺到具有惡意的函式去, 所以會把buffer放在其它變變數的後面, 這樣如果buffer overflow, 就不會改變到其它的local variable, 這種方法是根據Safety Function Model[1]所設計的.
  • Arguments copying: 因為參數還是有可能會傳function pointer, 為了避免利用buffer overflow改變它,並直接跳到有惡意的程式去, 把參數中所有的指標都copy到暫時變數中, 並且在之後都只利用這些暫時變數, 不會去動到原本的參數, 這樣attacker便無法利用這些function pointer.


References:
[1]http://www.trl.ibm.com/projects/security/ssp/node4.html

[survey] Buffer overflow

從以前都只聽過buffer overflow,然後某些function沒事不要亂用,最近因為某門課,而survey一些相關知識,才比較了解為什麼,其實基本上這東西算是針對C/C++這種對於記憶體存取沒有限制的語言,像是JAVA這種由VM幫你管理記憶體的語言就沒有這種困擾,下面先介紹最簡單的一種方式:stack smashing。

Stack smashing:

基本上電腦是以stack的方式在模擬執行,當要呼叫函數時,我們會把目前的記憶體位置(return address)存在stack中,然後才跳到要執行的函數foo去,等到函數foo執行完,它才會在跳回原本的位置,繼續執行接下來未完的指令,而stack smashing就是利用其實stack是一塊連續的記憶體區塊,它把之前存的return address改成存放惡意的程式碼位置,當你跳回去時,就跑去執行惡意的程式,對你的電腦造成傷害。

基本上在執行時的stack是往下長的, heap則是往上長的,stack會以frame來代表每一個function call, 而frame大概是以以下的順序組成:
(low memory address)

local variable
aved frame pointer
return address
arguments

(high memory address)

所以如果local variable有buffer的話, 我們可以利用buffer overflow去改變return address, 讓return address指向我們要執行具惡意的程式碼, 這樣就可以對系統造成傷害.

References:
http://insecure.org/stf/smashstack.html