今天在分享自己實作上的經驗時,聊到「如何防止程式被人家玩了!」。我們所要實現的想法很簡單,就是設法防止「執行檔」被 Linux 下的「標準程式工具」給把玩了!例如:
我分享了一個簡單的方法,這個方法在以往「Linux Systems Programming」的課或多或少也曾向同學介紹過;不過,大家要知道的是,這只是一個有趣的小東西,或者說是一個「小手段」,任何高手級的 Linux 玩家,大概只要不到一小時就能輕易 反擊這個做法。
實測
就拿 "tar" 指令來看,以下是正常的操作:
# objdump -d /bin/tar /bin/tar: file format elf32-i386 Disassembly of section .init: 08049734 <.init>: 8049734: 55 push %ebp 8049735: 89 e5 mov %esp,%ebp 8049737: 83 ec 08 sub $0x8,%esp 804973a: e8 b1 07 00 00 call 0x8049ef0 804973f: e8 0c 08 00 00 call 0x8049f50 8049744: e8 93 b7 01 00 call 0x8064edc 8049749: c9 leave 804974a: c3 ret Disassembly of section .plt: ...
把 "tar" 做「處理」後,這些標準的工具全都失效了。先用 Jollen 提供的小工具處理 /bin/tar:
# ./truncate_it /bin/tar > ./tar.trunc # chmod a+x tar.trunc
再執行 objdump 試試:
# objdump -d tar.trunc objdump: tar.trunc: File truncated
連 nm、gdb 等,也都失效了:
# nm tar.trunc nm: tar.trunc: File truncated [root@mail tmp]# gdb tar.trunc GNU gdb Red Hat Linux (5.3post-0.20021129.18rh) Copyright 2003 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-redhat-linux-gnu"..."/tmp/tar.trunc": not in executable format: File truncated (gdb) r Starting program: No executable file specified. Use the "file" or "exec-file" command.
但是程式是可以正常使用的,不會有什麼問題:
# ./tar.trunc --help|more GNU `tar' saves many files together into a single tape or disk archive, and can restore individual files from the archive. Usage: ./tar.trunc [OPTION]... [FILE]... Examples: ./tar.trunc -cf archive.tar foo bar # Create archive.tar from files foo a nd bar. ./tar.trunc -tvf archive.tar # List all files in archive.tar verbo sely. ./tar.trunc -xf archive.tar # Extract all files from archive.tar. If a long option shows an argument as mandatory, then it is mandatory for the equivalent short option also. Similarly for optional arguments. ...
基本上,「執行時期都正常」,但是「程式的操作工具都失效」是這個小技巧能達成的效果。反過來想,既然 run-time 是正常的,那麼也就難逃 run-time 除錯工具的荼毒了。
下載程式
做法與原理是相當簡單的,只要知道「如何活用 ELF 規格」,箇中奧妙就不難懂了。大家可以下載 Jollen 寫的小程式「Truncate It」,這是一個執行檔,下篇日記我會介紹「Truncate It」的原理並提供 source code。使用方法如下:
# ./truncate_it /bin/tar > tar.trunc
記得 chmod 成可執行:
# chmod a+x tar.trunc
然後可以在「目前的目錄下」得到 tar.trunc 執行檔。
truncate_it 可以針對 ELF 的執行檔做一些小動作,並產生一個新的執行檔(結果輸出到 stdout)。被 truncate_it 處理過的檔案「大部份」都能正常執行,並且無法使用 GNU binutils 或是 gdb 對他做作何動作。
Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue
您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw