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已经基本不记得了