回覆列表
  • 1 # 滴逃逃

    解決方法很多!用IDAPro或objdump反彙編語義,比如分析其中的靜態全域性變數、區域性變數、堆變數。

    靜態全域性變數在可執行檔案載入的時候就被分配在資料段。

    區域性變數是進入一個函式以後在esp和ebp之間的記憶體,比如[ebp+20]或者[esp-10]之類的記憶體引用。

    堆變數要檢測有沒有glibc的_malloc或者_calloc或者mmap或者mmap2之類的呼叫。如果要進一步一般化,有可能在原始碼中有int0x80(linux)或者int0x21(windows)的系統呼叫,呼叫編號被放在eax中,可以查表得到相應編號的功能。比如int0x80(eax=3)是read,eax=4是write。

    確定了語義之後就可以修改可執行檔案了。找到你要修改相應語句的eip值,根據elf頭(linux)或者pe頭(windows)確定實際載入的語句的記憶體地址和靜態檔案中的偏移量的對應關係,直接在上面修改二進位制指令。比如一條ret是c3,你想改成暫停就把c3改成cc,等等。

    如果想進一步插入一些程式碼在可執行檔案中,就需要二進位制檔案拖拽,暫時沒有很好的工具,可以自己做一個。但是要注意間接函式呼叫的所有函式指標和jumptable,資料都要相應的移動,如果你把你要插入的程式碼放在最高的位置或者最低的位置就沒有問題。注意別忘了修改elf或者pe的表頭資訊,這個有很多工具可以做。

  • 中秋節和大豐收的關聯?
  • 忠孝之間有誰能兩全是什麼歌?