SHC 是一個將shell腳本加密成二進制文件的腳本。使用隨機生成的密鑰對shell腳本進行RC4加密放到一個全局變量中(編譯後存在data段),然後在運行時解密。
這個解密腳本修改自UnSHc,使之能解密MIPS架構的二進制文件。原始的版本只支持x86/x64指令集,與MIPS指令集的彙編和調用方式略有不同。
目前有一個偏移量(DATASEGBASE)是硬編碼的,由於MIPS的addui使用相對地址,這個值用於和相對地址相加得到變量的絕對地址。暫時還沒搞懂是怎麼來的,但是可以通過IDA的反彙編得到。
辛酸歷程
剛拿到二進制文件時,我並不知道有shc這樣一個東西,先在路由器上用gdb(某訊K2)調試,想dump出execvp時的棧然後strings一下就得到明文shell腳本了。但是因為它會fork多次,所以並沒有搞定。這裡應該是我的操作方式問題(shc還可以使生成的程序無法被trace,是使用ptrace自己來實現的)。
還好這個二進制文件沒有strip掉函數名稱,所以我們能在反彙編里看到名為arc4和xsh的幾個感覺有名堂的名字。Google告訴我們RC4以前就叫arc4,那說明必然在某個地方存着密鑰。在gdb中catch fork和catch exec之後,成功讓程序停在了execvp剛開始的位置。但這時通過/proc/PID/cmdline也並沒有得到想要的明文shell腳本,猜想是程序運行之後把argv改掉了(後來從shc的代碼中證實了)。
但在這時我隨手dump了一下棧然後strings了一下,發現了一句Please contact your provider jahidulhamid#yahoo.com,於是發現了shc的存在。然後找到了UnSHc,並修改得到了UnSHc-MIPS。
對shc的分析可以看shc程序的原理–以實例分析 – Netfilter,iptables/OpenVPN/TCP guard:-( – CSDN博客。
解密之所以能進行的原因是,這個密鑰本身並沒有被加密或混淆,只是棵體存在data段里了。
好久不用gdb已經基本不記得了