5.6.2 搜索的原理——查找标志

“我们用图来理解一下。在内存中,‘A’表示垃圾字符;‘Ret’表示JMP ESP或者JMP 04 Call EBX,反正功能是要跳转到后面的Search中;然后‘F’为标志,最后是‘ShellCode’。Search功能就是要进入到原来的ShellCode中,原始的发送和目标程序处理截断后的数据如图5-17。”

“在图5-17中,‘A’和‘A’’无所谓,只是起填充作用;‘Ret’和‘Search’一定要符合规范,不能被改变;‘F’和‘F’’一定要不一样,如果一样,就无法区分原始ShellCode和截断后的数据位置;而‘ShellCode’和‘ShellCode’’是不一样的,如果一样,我们就不用花这么大的力气去写一个符合规范的Search和跳转了。”

“好,我们看看Search的代码该如何写。假设标志‘F’为ww08,即0x773037,而且从esp开始搜索,则搜索的汇编代码如下:”

__asm
{
    mov ebx, esp //从esp开始搜索
    mov eax, 0x77773037; //eax = ww07
    inc eax //刚才是ww07,加1变成ww08,免得搜索成自己
    loop1:
    inc ebx 
    cmp [ebx],eax //比较是否是ww08
    jne loop1
    inc ebx
    inc ebx
    inc ebx
    inc ebx
    call ebx //找到ww08标志,跳过去执行
}

“大家注意啊!先是把eax赋成ww07,然后eax加1,才得到ww08。这是为了避免搜索成search代码自己。”

“是啊!如果是直接 mov eax, 0x77773038 ,搜索经过这里会被认为是标志的!”宇强说道。

“非常正确!我们清楚原理了,来看一个实际的漏洞吧——Serv_U的MDTM漏洞。”