2015-11-06 54 views
0

Here是一種混淆技術,其中條件跳轉由跳轉表替換。每個數組只包含一個有效的函數指針,它們是基於crc值調用的。我只保留了函數指針在程序集中查找數組

#include <stdio.h> 
#include <inttypes.h> 

typedef void (*crc_check_fn)(uint32_t *); 

static void crc_nib2 (uint32_t *crc) { printf("OK\n"); } 

crc_check_fn b1[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, crc_nib2, 0, 0, 0 }; 

int main(){ 
     uint32_t crc = 0xFFF7FB7C; 
     int index = crc & 0x0F; 
     (*b1[index])(&crc);  
} 

的單個陣列我有幾個問題:

  1. 可這陣位於二進制的組裝?我不太瞭解裝配,所以檢查它我無法告訴。

  2. 我假設上一個問題的答案是肯定的,因爲原來的帖子建議初始化b1就像{ ..., crc_nib2-8, crc_nib2, crc_ni2+8, ... };。這是否安全?難道不可能說這些是無效指針嗎?不應該是更好的選擇來實現大量真正的虛擬功能嗎?

  3. 編譯與gcc -S

    B1: ...
    .quad 0
    .quad crc_nib2 .quad 0
    ...

上運行objdump -d二進制產生一個沒有上述行的程序集。爲什麼組件不同?我沒有刪除符號。

+0

關於'objdump -d',分割在段上的elf,.text(帶代碼),'.rodata'常量等等,'objdump -d'僅反彙編'.text'段,而你的數據可能在另一部分。 – fghj

回答

2
  1. 這個數組可以位於二進制程序集嗎?我不太瞭解裝配,所以檢查它我無法說清楚。

是的,也許。有了GCC,我可以把它放在程序集中。可以想象它將被放置在BSS(零初始化存儲器)中,然後在main之前初始化以包含單個非空指針。

  • 我認爲答案對前一個問題是肯定的,因爲原帖建議initializng b1{ ..., crc_nib2-8, crc_nib2, crc_ni2+8, ... };。這是否安全?難道不可能告訴 這些是無效的指針嗎? 不應該是一個更好的選擇實現大量真正的虛擬功能嗎?這一切
  • 首先實際上不是很安全。所有需要了解的信息都是可用的。如果我們知道這已經完成了,可以很容易地找出crc_nib2是一個有效的函數指針,其他的都是。還有人可以得出結論,crc_ni2+8可能不是一個有效的指針。這是通過知道函數的開始看起來非常相似並且可以在某種程度的準確度下自動識別而完成的。如果有符號表可用,它變得更簡單。

    如果你打算讓可執行真正防篡改你必須 肯定你不能用代碼檢查可執行文件的完整性篡改。如果檢查是在可執行文件本身完成的,那麼你可能會毫無意義(如果你可以在一個地方修改)可以修改檢查以使它們在別處修改後仍能通過。

  • 編譯與gcc -S

    B1: ...
    .quad 0
    .quad crc_nib2 .quad 0
    ...

  • 是的,我o,但問題是什麼?

    請注意,objdump -d只是對可執行文件的可執行部分中的所有內容進行反彙編,並跳過其餘部分。這是因爲通常其他(數據)部分中的數據類型,所以沒有太多的「反彙編」干預,只有對這些數據執行hexdump纔有意義。

    0

    這個數組可以位於二進制程序集嗎?我不太瞭解裝配,所以檢查它我無法說清楚。

    不太確定什麼「組合二進制」應該是什麼意思。就像任何其他初始化的靜態存儲持續時間變量一樣,它將分配到程序的.data部分。

    這是否安全?難道不可能說這些是無效指針嗎?不應該是更好的選擇來實現大量真正的虛擬功能嗎?

    這些指針必須是指向有效函數的指針,否則程序將崩潰並燒燬。同樣,如果你調用指向地址0的函數指針,你的程序就會崩潰並燒燬。所以不,它不安全,要麼同樣是不安全的。事實上,唯一不會導致崩潰的解決方案是實施虛擬功能。總之,我真的不明白你爲什麼需要一個函數指針數組。只需使用一個普通的查找表,一個整數數組,並將CRC與這些數據進行比較。

    +0

    在比較crc和普通查找表之後,我是不是最終會遇到一個非常容易繞過的條件跳轉? – robert

    +0

    @ franz1「PC安全性」方面是另外一個可以肯定的地方,如果PC的東西是你正在使用的東西。但是你必須從寫一個穩定的程序開始,這很有道理。如果它一直崩潰,你的程序就不安全了...... – Lundin