2016-03-04 29 views
-1

作爲我項目的一部分,我必須插入部分代碼(稱爲校驗和守衛)來保護某些功能。這個過程必須是自動化的,即我需要編寫一個腳本來將這些警衛插入到程序集中。我有我的警衛模板,我不知道如何繼續。自動插入校驗和守衛

如何編寫一個shell腳本來將代碼插入從C源文件生成的程序集文件中?

編輯:

這就是我想實現的文件。 cerias.purdue.edu/assets/pdf/bibtex_archive/2001-49.pdf 作者已經提到他們已經修改了插入守衛的二進制文件,但看起來很難。所以,我想修改彙編代碼。

這裏是一個後衛​​的模板:

guard: 
     add ebp, -checksum 
     mov eax, client_addr 

for: 
     cmp eax, client_end 
     jg end 
     mov ebx, dword[eax] 
     add ebp, ebx 
     add eax, 4 
     jmp for 
end: 

其中client_addr和client_end標記的開始和代碼的結束,分別保護。

我意識到我對這篇論文的理解並不完整,關於各種問題我還不清楚,但我想弄明白。

如何將各種功能(保護)作爲輸入到shell腳本中?

  1. 我可以給函數的名稱作爲一個字符串。
  2. 我可以給出函數的起始和結束地址(使用gdb找到)。

但插入校驗碼後,地址會改變,所以我認爲給這個名字會是一個更好的主意。 是這樣嗎?

我是SO的新手,因此仍需要學習很多關於發佈問題的正確方法。 但謝謝你的幫助和指導。

+0

如果用_checksum guard_表示保護函數免受堆棧溢出攻擊,那麼通常稱爲_stack canary_。有一個實現示例(對於C)[這裏](http://security.stackexchange.com/questions/37547/how-to-implement-canaries-to-prevent-buffer-overflows)。 –

+0

你描述了一個任務,你沒有問一個問題。你需要回到給你這個任務的任何人。並挑戰他,正如所說的那樣,這種特點對管理者來說聽起來是合理的。不是這樣。問「你的意思是什麼」是你的工作,而不是我們的工作。 –

+0

你的意思是像gcc插入時使用'-fstack-protector-strong'?這只是寫和讀一個哨兵價值;它不檢查任何東西。你究竟是什麼校驗/ CRC校驗/哈希? –

回答

-1

自動執行此操作可能是一項真正的挑戰,但我認爲這是不可能的。

在結構化語言中,比較容易找到函數開始或結束的地方(例如,通過解析和計算C中的大括號),因此應該插入函數序言和尾聲。

在彙編中,這是不可能的 - 標籤不一定是函數的開始,「ret」不一定是結束。

最好的辦法是爲自己的序言和結語建立自己的宏,並手動插入它們。

你的問題中的一些弱點讓我認爲你正在使用的彙編代碼可能可以從C編譯器生成 - 在這種情況下,通過分析發出的asm代碼是否可以重新構建C函數邊界。一些澄清後

編輯:

我不是很明白爲什麼這需要彙編做,爲什麼它需要做的到。彙編後產生的彙編語言文件 - C會做的很好,並且(簡單的)守衛代碼塊可以簡單地由宏注入(可能可能使用內聯彙編)。總而言之,如果您在原始資源中使用它,那將會更容易。而且,對於由編譯器生成的asm源代碼,您還需要訪問C(或其他)源。

在另一個評論中,你會說「他們正在修改二進制文件本身並添加警衛。」 - 將插入二進制文件是一項相當複雜的任務 - 您將代碼移至較高地址,需要先找到該代碼段的所有調用者,然後調整地址。甚至病毒程序員也沒有這樣做:)。他們用jsr指令將現有代碼替換爲位於二進制文件末尾的「揹包」。我認爲鏈接文件中的圖片有點誤導。

+0

是的,要保護的代碼是C代碼。我對這個問題做了一些編輯。你能看看嗎?我對如何將保護的函數的輸入(到我的shell腳本)有疑問? – ak0817

+0

我已經提到了我正在試圖在問題中實施的論文。他們正在修改二進制本身並添加警衛。組裝更容易嗎? – ak0817

+0

您能否提出我應該使用什麼樣的混淆技術來防止我的防護模板被反彙編二進制代碼的攻擊者輕易識別? – ak0817