文章總列表

修補執行檔

緣起,錯誤模型和勝利條件

某次我得修補執行檔跳過錯誤,這篇記錄當時的技巧和指令。測試平台是Raspberry Pi 3B。錯誤的程式如下圖,記憶體指標指向0,然候對這個指標存取,程式就死掉了。勝利條件是,程式正常跑完即可



修補的指令1

  • 把執行檔轉成文字檔再反轉,而且還能執行。假如做得到,那就能對文字檔動手。時間有點久,指令都忘光了!chatgpt竟然直接給答案,而且精準無比!
    • In Linux, how to use od to dump binary file into HEX
      • od -An -t x1 -v a.out
        • -A n,不要印address
        • -t x1,格式用hex,每次1byte
        • -v,一堆0也不要跳過
    • What if I want to everything in single line
      • od -An -t x1 -v a.out | tr -d '\n'
    • How to convert continuous space in text file into single one
      • od -An -t x1 -v a.out | tr -d '\n' | tr -s ' ' > a.txt
    • How to reverse the hexdump output to binary
      • xxd -r -p a.txt > q.out
  • 至此準備工作完成,接下來對文字檔動手吧


修補的指令2

使用objdump -d進行反組譯,下面的指令會跳入func,讓他不要跳進去就好

打開上一段a.txt,確實有這道指令!搜尋的順序要相反:eb_ff_ff_ee -> ee ff ff eb

順便找到NOP指令的編碼,換成00 00 a0 e1

轉回執行檔再看一下指令,確實換成NOP惡搞成功了!執行後也不會當機了


修補的指令3

直接編修指令非常容易出錯,給指令稿比較實在。關鍵的修補命令和執行結果如下



結語

需要直接修補執行檔的機會不多,下次要用大概也困難重重。此文記錄下當時用的指令,希望這輩子不要再幹這個事了


留言

這個網誌中的熱門文章

幼犬書桌椅選擇心得 升降桌 兒童桌椅

STM32 UART + DMA,使用HAL實作TX/RX,以及不定長度接收

CANON G3000 廢墨瓶改裝