课后解惑

Q:EXE文件里提取出来的ShellCode是一个字节一个字节分开的,如何更高效的自动生成“\x01\x02\x03\x04”的形式呢?

A:我们可采用替换的方式,把空格直接替换成“\x”;也可把字节粘贴在一个文件中,然后写一个程序,把每个字节加上“\x”标志后打印出来,完成规范化ShellCode的生成。比如下面这个程序就可读取shellcode.txt文本中的字符,然后生成规范的ShellCode数组:

#include<stdio.h>
int main()
{
    FILE *fp;
    fp = fopen("ww.txt", "r");
    char shellcode[5];
    int num = 0;
    printf("\"");
    while( fscanf(fp, "%s",shellcode) !=EOF )
    {
        num++;
        printf("\\x%s",shellcode);
        if(num % 16 == 0)
        {
            printf("\"\n\"");
        }
    }
    printf("\"\n");
    return 0;
}

Q:我们在C语言提取时,要在“工程”设置中去掉“/O2”选项,“/O2”是什么意思?

A:“/O2”表示优化,达到最大化速度。

Q:能讲一下其他的常见编译选项吗?

A:我们结合具体的设置来讲吧!Release版下的设置如图6-27。

在它的设置选项中,包括/nologo /ML /W3 /GX /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"Release/GetShellCodeByC.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c

每一项的具体解释如下:

/ML:与LIBC.LIB链接
/W3:设置警告等级,这里是3
/GX[-]?:启用C++异常处理
/D{=|#}:定义宏
/D "WIN32":定义WIN32,表明是WIN32程序;
/D "NDEBUG":没有调试信息
/D "_CONSOLE":控制台程序
/D "_MBCS":MBCS字集
/Fp:命名预编译头文件
/Fp"Release/GetShellCodeByC.pch":这里预编译头文件为GetShellCodeByC.pch
/YX[file]:自动的.PCH文件
/Fo:命名对象文件
/Fd[file]:命名.PDB文件

而Debug版的设置如图6-28。

可见选项包括:/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"Debug/GetShellCodeByC.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c

和release版本的差别有:

/MLd:与LIBCD.LIB调试库链接,LIBCD.LIB是调试版本
/Gm[-]:启用最小重新生成
/ZI:启用调试信息的“编辑并继续”功能
/Od:禁用优化

Q:好像有人在命令行下编程,那是如何实现的?

A:其实VC的本质是一个C/C++编译器,而我们看到的界面,都是上层的东西。VC的编译器程序是\VC98\Bin目录下的cl.exe,我们可在DOS环境下通过它来编译程序。步骤如下:先运行同目录下的VCVARS32.bat,设置环境变量;然后就可执行cl.exe,如 cl.exe ww.cpp ,就会生成ww.exe。如果有必要,还可加上那些编译选项。

Q:防火墙的技术和实现原理是什么?

A:防火墙分企业级和个人防火墙两种。企业级的防火墙,实现思路要简单一点。一般的厂商都是利用公开源码的Linux,重编译内核,加上安全选项,裁减加固,再做个用户界面,就可作为防火墙商品了。而Windows下的个人防火墙,反而还要麻烦一点,涉及到HOOK技术和底层驱动程序的开发。

Q:HASH听起来很熟悉,有什么用处呢?

A:HASH可用于高效查找,而且在数字签名中发挥了重要作用。