2018年11月29日 星期四

[Crypto] Length Extension Attack

Length Extension Attack 允許攻擊者將惡意訊息的雜湊值偽裝成正常訊息的雜湊值。

首先我們要先了解 Merkle–Damgård construction

這個方法被證明說如果滿足下面兩個條件,則產生的雜湊函式也不會發生碰撞。


  1. 有適當的 padding 方式
  2. 壓縮函式 (compression function) 不會產生碰撞
Merkle–Damgård construction 大致上的流程式這樣的

  1.  把輸入的資料分成 512 bit 的區塊,最後一塊根據不同雜湊函式有不同的 padding  方式
  2. 一開始先給定一個初始向量 (initial vector, IV), 當作 input 1 
  3. 區塊當作 input 2 ,兩個輸入放到雜湊函式 f 裏面,產生輸出 output
  4. 產生的這個輸出再當下一次的 input 1,下一個區塊當作 input 2
  5. 重複這樣的動作直到結束
使用這種方法產生雜湊值的雜湊函數都有這個弱點

大致了解 Merkle–Damgård construction 後,就要進到主題啦!



情境


有些網站會在下載的網址加上一個簽名 (signature),用來防止使用者隨便下載主機裏面的檔案
看起來大概會像這樣

https://www.abc.com/?file=myfile&sig=2d59213a73edf47d93c1e23073b7e458

在主機端會有一個自己才知道的祕密金鑰 secret。
當請求發送過來時,他會把金鑰和檔案名稱連在一起,檢查是不是符合後面的那個簽名。

hash(secret+file) = sig

如果 file 名稱改變, 對應的雜湊值也會不同。因為使用者不知道 secret 是什麼,所以也沒辦法自己計算出對應的 signature。

弱點


使用 Merkle–Damgård construction 的雜湊函數 (e.g. MD5, SHA-1, SHA-2) 會有這個弱點
想法是這樣的,如果我們不知道 secret 是多少,為什麼不要拿他最後產生的那個 hash 來操作呢?

當我們可以自己算出那個 padding,就可以把想要放的訊息 (msg2)  放在新的區塊。
這樣得到的雜湊值就可以由原本的 secret 來成功驗證。

實作


網路上有許多工具可以幫我們計算出偽造的訊息還有他對應的雜湊值,在這邊以 HashPump 當作例子示範一次


我們先定義 secret,注意到這邊的 secret 在之後是看不見的
就讓 secret = 1d2s51fasfeekk 好了,長度是 14

再定義正常的輸入,並計算 md5(secret|msg)
這邊我讓 msg = hello?hello!,得到雜湊值 28bee5502040e7a934dd9f4c2dc62e1b

接下來我們使用 hashpump 這個工具,把必要的資料都填上去後得到
第一行是新的 signature
第二行則是 payload










為了驗證這個攻擊是有效的,我們看看 md5(secret|evil_msg) 的值會是多少

$ echo -n "echo -n "1d2s51fasfeekkhello?hello\!\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00__evil__" > file"

$ md5sum file
60ee6e563d955946c640ea778af836ec  file

發現計算出來的雜湊值和 hashpump 幫我們算出來的一樣!實作成功~

* 要特別注意到計算雜湊值輸入字串是不是正確的,之前被最後面的換行坑了好久....QQ



2017年12月7日 星期四

[github] github unable to connect to remote host

今天要用yaourt下載程式時,發現一直卡在git clone 的步驟
錯誤訊息長這樣:
 fatal: Unable to look up github.com (port 9418) Name or Service unknown
查了下資料,發現有可能是網路問題,後來在這個地方找到解決方式

可以先ping github.com
ping github.com
從ping得到的IP加上這串放到/etc/hosts裡面
received_ip github.com wiki.github.com gist.github.com assets0.github.com assets1.github.com assets2.github.com assets3.github.com
應該可以解決問題

2017年12月5日 星期二

Shebang #! 的用途

#英文名稱是sharp
!英文名稱是bang

在python或是shell script等腳本語言是不需要事先編譯的
但是每次要執行檔案的時候就必須用那些執行檔(python, sh),把腳本當成參數輸入才可以得到結果

Shebang的用途就是可以在腳本的第一行點出用來執行這個腳本的執行檔位置,之後就不需要再執行腳本時先打前面那些執行檔的名稱

用python來舉例
在沒有Shebang時,下的指令會是這樣   python test.py
但是如果在腳本裡面加上#!/usr/bin/python,就可以直接跑./test.py (要先把他轉成執行檔)

2017年11月18日 星期六

在不同的scope修改變數的值

其實一直知道就是要透過指標來完成
但是如果是要修改指標呢??那就要透過指標的指標來修改

舉例:

void modify(int *p){
     p = (int*)malloc(sizeof(int*));
     printf("address of ptr in modify(int*) = %p\n", ptr);
}
int main(){
    int *ptr = NULL;
    modify(ptr);
    printf("address of ptr in main() = %p\n", ptr);
    return 0;
}

比較粗心的人可能會覺得應該會印:
-------待補-------------
但是實際上的輸出是這樣:
------------待補------------

其實道理都一樣,如果要改到非自己scope的變數時(不管是不是指標),傳一個星星進去就對了!
為什麼是這樣呢?
我們呼叫function的時候,function會複製一份參數,所以當然傳過去改到的東西就只是在function scope 裡面改而已,想要改到我們原本傳入的參數,必須要傳入他的指標(如果是指標就傳指標的指標,如果是指標的指標就傳指標的指標的指標@@)

這樣function複製的東西就是我們要改的變數的指標了,因此我們可以再透過這個指標來改變他指向的變數

所以上面的程式應該要改成這樣:
void modify(int **p){
     p = (int*)malloc(sizeof(int*));
     printf("address of ptr in modify(int*) = %p\n", ptr);
}
int main() {
    int *ptr = NULL;
    modify(&ptr);
    printf("address of ptr in main = %p\n", ptr);
    return 0;
}

這樣就會是我們想要的結果了!

2017年10月17日 星期二

URI vs URL vs URN

URI (uniform resource identifier)
URL (uniform resource locater)
URN (uniform resource name)

2017年8月19日 星期六

[QT] build static QT

前陣子想要release程式又不想要額外附那麼多.dll檔,上網查了一下需要使用static build(靜態編譯)才可以,網路上直接下載的都是dynamic-build 的QT


這就去查了static linking 和 dynamic linking 的差別。